AccessのレポートをFAX送信する裏技(97/2000)


御注意

 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に関するいろいろな技術情報を探せるので、あらかじめ読んでおきましょう。

Microsoft FAXとWinFAX SEは、どちらを選べば良いですか。

 Windows95やWindowsNTならMicrosoft ExchangeとMicrosoft FAXがOSに標準で付いてきますが、FAX送信はこの組み合わせが一番便利かもしれません。Windows98以降にはないので、設定が少々不便ですがOutlookとWinFAX SEを使います。(なお、Windows2000やXPでは標準でFAXプリンタドライバが付属しているみたいですが、これがMicrosoft FAXと互換性があるかどうかは未確認です。)

Outlook 2000をインストールしましたが、WinFAX SEというのはどうやってインストールすればいいのですか。

 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はどこにありますか。

 Outlook 2002にWinFAX SEは付いてません。残念ですがあきらめましょう。

WinFAX SEの「FAX番号を確認してください」のメッセージが出た時、電話番号が「電話番号」欄でなく「名前」欄に入ることがあります。

 電話番号に「- ( ) *」など数字以外の文字が含まれている場合に、この現象が起きる場合があります。例えば、0312345678では問題ありませんが、(03)1234-5678だとダメなことがあるようです。Replace関数を使うなどして、あらかじめ取り除いておきましょう。

WinFAX SEの送信エラーは取得できますか。

 いちいちプログラム側から送信エラーを取得せずとも、Outlook側にFAX送信の再試行機能は付いてます。[ツール]-[オプション]の中の、[FAX]タブにて、「再試行回数」「再試行間隔」を設定できます。再試行回数だけ繰り返しても送信できない場合は、受信トレイに「FAX 送信不能」という題名のメールが入ります。なお、送信FAXは、たとえエラーが起こっても「送信済みアイテム」に入ってしまうようです。

 なお、「再試行回数」を0に設定しておくと、送信出来ない場合にOutlook側で再試行せず、即座に「FAX 送信不能」のエラーメールが受信トレイに入ります。これを応用すれば送信エラーが取得できますが、これはあくまでも簡易的な方法であることに注意してください。裏で誰も、またどのプログラムもOutlookを使っていないという前提です。

 本来ならば、Access側で送ったデータ、Outlook側で持っているFAXデータ、エラーメールの三つを、正しくひも付けをするためのキーが欲しいところなのですが、せいぜい、電話番号(エラーメールの本文からわかる)と、時刻(ただし送信時刻とエラーメールの時刻にはタイムラグがある)くらいしか頼りになりません。共通するメッセージIDを持っていれば処理が楽なのですが、そんな気の利いた配慮はしてくれてません。

 こんなわけで、送信エラー取得は全く不可能とは言えませんが、少々手こずります。あくまでも、人間がレポートをFAX送信する時に、FAX番号入力や送付状書きの手間を省くアシスト的なものと考えてください。確実にFAXを送れるかどうかという、動作の信頼性がどこまであるかも、少々不明なので、数十件の顧客に同報FAXを自動的に送信する用途には、今のところあまりおすすめしません。


サンプルプログラム

fax.mdb WinFAX SEを使ってFAX送信するサンプルです。(Access2000版)


現在テスト中

 現状のままで置いておきます。動作保証はしません。

WinFAX SEでの、電話番号の確認メッセージで自動入力させる

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

Outlookの受信トレイにあるアイテムの全題名をイミディエイトウィンドウ(デバッグウィンドウ)に出力

' [ツール]-[参照設定] で「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

戻る