WinFAX SEを使う場合は、途中で電話番号の確認メッセージが出ますが、これまで全自動化するのは少々難しいかもしれません。
あくまでも、人間がレポートをFAX送信する時に、FAX番号入力や送付状書きの手間を省くアシスト的なものと考えてください。送信エラーの取得は少々難しいため、数十件の顧客に同報FAXを自動的に送信する用途には向いていません。
手動でレポートをFAX送信するには、あらかじめFAXプリンタドライバがインストールされていれば、レポートの印刷時に出力先をそれに切り替えれば可能です。
しかし、VBAで自動的にFAX送信するには、DoCmd.OpenReportやDoCmd.Printでは電話番号の設定ができないので、DoCmd.SendObjectを使います。
必要なもの
この2つをあらかじめインストールしておきます。FAXをネットワークで共有する時はMicrosoft FAX、個人で使うならWinFAX SEが設定が楽でおすすめです。
なお、OutlookではCD-ROM、あるいはC:\Program Files\Microsoft Office\Office\にあるドキュメント(OLREAD9.TXT)にあらかじめ目を通しておきましょう。OutlookでFAX送信する設定方法など重要な情報があります。
次に、レポートをFAX送信するFunctionをモジュールに作っておきましょう。
実は、送信する形式は定数でなく文字列でも指定可能で、「Snapshot Format (*.snp)」でスナップショットファイル形式で送信できます。
また、送信先はMicrosoft FAXでは[FAX:0312345678]の形式、WinFAX SEの場合はfax@0312345678の形式で指定します。
編集可能な形式かどうかの引数は、Falseにするといちいち確認メッセージを出してこなくなります。ただし、WinFAX SEの場合は電話番号の確認メッセージだけ、必ず出て来ます。なくす方法はまだ見付けてませんが。
Microsoft FAXの場合は
Function SendFax(ReportName As String, FaxNumber As String, Subject As String, Message As String) DoCmd.SendObject acSendReport, ReportName, "Snapshot Format (*.snp)", "[FAX:" & FaxNumber & "]", , , Subject, Message, False End Function
Symantec WinFAX SEの場合は
Function SendFax(ReportName As String, FaxNumber As String, Subject As String, Message As String) DoCmd.SendObject acSendReport, ReportName, "Snapshot Format (*.snp)", "fax@" & FaxNumber, , , Subject, Message, False End Function
となります。
このFunctionの実際の呼び出しは以下の通りです。(レポート名が「請求書」の場合)
Sub test() SendFax "請求書", "0312345678", "FAX送付のご案内", "当月分の請求書をお送り致します。" End Sub
なお、Microsoftのサイトのサポート技術情報検索で、AccessやOutlookに関するいろいろな技術情報を探せるので、あらかじめ読んでおきましょう。
Windows95やWindowsNTならMicrosoft ExchangeとMicrosoft FAXがOSに標準で付いてきますが、FAX送信はこの組み合わせが一番便利かもしれません。Windows98以降にはないので、設定が少々不便ですがOutlookとWinFAX SEを使います。(なお、Windows2000やXPでは標準でFAXプリンタドライバが付属しているみたいですが、これがMicrosoft FAXと互換性があるかどうかは未確認です。)
Outlook(もしくはOffice)をインストールすると自動的に入るはずです。カスタムインストールでは、Symantec WinFAX Starter Editionをインストールするかどうか選択できるので、選択します。インストールしなかった場合は、コントロールパネルの「アプリケーションの追加と削除」から、OutlookまたはOfficeを選択し、WinFAX SEを追加インストールしましょう。うまくインストールされたかどうか怪しい場合も、WinFAX SEをいったん削除し追加インストールするとうまく動くかもしれません。
WinFAX SEのインストールが完了後、初めてOutlookを起動すると、「メールサービスオプション」の選択画面が出ます。WinFAX SEを使う場合は、「個人情報管理(PIM)のみ」(電子メール機能を使わない場合)または「インターネットのみ」(電子メールをOutlookで送りたい場合)にしなければなりません。「企業/ワークグループ」では、Microsoft FAXを使うモードになります。
「企業/ワークグループ」でインストールしてしまった場合は、後で変更する事もできます。Outlook 2000では、メニューバーから[ツール]-[オプション]、そして[メール配信]タブをクリックし、[メールサポートの再設定]ボタンを押してみましょう。Outlook 98の場合は、Microsoftのサポート技術情報に方法が載っています。
JP411880 - [OL98] [企業/ワークグループ] から [インターネットのみ] へ切り替える方法
JP411950 - [OL98] FAX を送受信する設定方法 ([インターネットのみ] モード)
Outlook 2002にWinFAX SEは付いてません。残念ですがあきらめましょう。
電話番号に「- ( ) *」など数字以外の文字が含まれている場合に、この現象が起きる場合があります。例えば、0312345678では問題ありませんが、(03)1234-5678だとダメなことがあるようです。Replace関数を使うなどして、あらかじめ取り除いておきましょう。
いちいちプログラム側から送信エラーを取得せずとも、Outlook側にFAX送信の再試行機能は付いてます。[ツール]-[オプション]の中の、[FAX]タブにて、「再試行回数」「再試行間隔」を設定できます。再試行回数だけ繰り返しても送信できない場合は、受信トレイに「FAX 送信不能」という題名のメールが入ります。なお、送信FAXは、たとえエラーが起こっても「送信済みアイテム」に入ってしまうようです。
なお、「再試行回数」を0に設定しておくと、送信出来ない場合にOutlook側で再試行せず、即座に「FAX 送信不能」のエラーメールが受信トレイに入ります。これを応用すれば送信エラーが取得できますが、これはあくまでも簡易的な方法であることに注意してください。裏で誰も、またどのプログラムもOutlookを使っていないという前提です。
本来ならば、Access側で送ったデータ、Outlook側で持っているFAXデータ、エラーメールの三つを、正しくひも付けをするためのキーが欲しいところなのですが、せいぜい、電話番号(エラーメールの本文からわかる)と、時刻(ただし送信時刻とエラーメールの時刻にはタイムラグがある)くらいしか頼りになりません。共通するメッセージIDを持っていれば処理が楽なのですが、そんな気の利いた配慮はしてくれてません。
こんなわけで、送信エラー取得は全く不可能とは言えませんが、少々手こずります。あくまでも、人間がレポートをFAX送信する時に、FAX番号入力や送付状書きの手間を省くアシスト的なものと考えてください。確実にFAXを送れるかどうかという、動作の信頼性がどこまであるかも、少々不明なので、数十件の顧客に同報FAXを自動的に送信する用途には、今のところあまりおすすめしません。
fax.mdb WinFAX SEを使ってFAX送信するサンプルです。(Access2000版)
現状のままで置いておきます。動作保証はしません。
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long ' Timeout : タイムアウト秒数 ' 戻り値 : 0 正常終了, -1 タイムアウト -2 ウィンドウを前面表示できず Function ConfirmPhoneNo(Timeout As Integer) Dim hwnd As Long Dim dtStart As Date, lngDiff As Long Dim flgTimeout As Boolean Dim intResult As Integer flgTimeout = False dtStart = Now Do hwnd = FindWindow(vbNullString, "Symantec WinFax Starter Edition") If IsWindowVisible(hwnd) <> 1 Then hwnd = 0 lngDiff = DateDiff("s", dtStart, Now) If lngDiff >= Timeout Then flgTimeout = True DoEvents Loop Until hwnd <> 0 Or flgTimeout = True If flgTimeout = True Then intResult = -1 Else If SetForegroundWindow(hwnd) = 0 Then intResult = -2 Else SendKeys "%S", True intResult = 0 End If End If ConfirmPhoneNo = intResult End Function
' [ツール]-[参照設定] で「Microsoft Outlook 9.0 Object Library」をチェックする必要あり Sub Debug_OutputAllSubjects() Dim ol As New Outlook.Application Dim myNameSpace As NameSpace Dim myFolder As MAPIFolder Dim myItem As MailItem Set myNameSpace = ol.GetNamespace("MAPI") Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox) For Each myItem In myFolder.Items Debug.Print myItem.subject, myItem.CreationTime Next Set myItem = Nothing Set myFolder = Nothing Set myNameSpace = Nothing Set ol = Nothing End Sub