none
windows10付属の「FAXとスキャン」経由でFAX送信するVBAは? RRS feed

  • 質問

  • windows10付属の「FAXとスキャン」経由でFAX送信するVBAは?


    win10(64bit)のAccess(64bit for Office365)から
    windows10付属の「FAXとスキャン」経由でFAX送信したいのですが、
    下記のエラーで止まります。

    1)Accessのレポートから印刷先に「FAXとスキャン」指定で正常にFAX完了します。
    2)下記「lobjFaxDoc.Send」の所でエラー出ます。
    3)実行時エラー '-2147024883(800700d)'
      'Send'メソッドは失敗しました:'IFaxDoc'オブジェクト

    4)参照設定は「faxcom 1.0 Type Library」チェック入っています。
    5)そもそも、win10「FAXとスキャン」に、VBAからDocを投入するのは無理なのでしょうか?
    6)windows付属の「FAXとスキャン」経由でFAX送信する方法を
     ご教示くださいませ、よろしくお願い致しますm(__)m


    Private Sub コマンド0_Click()

    Dim lobjFaxSvr          As New FAXCOMLib.FaxServer      'FaxServerオブジェクト
    Dim lobjFaxDoc          As New FAXCOMLib.FaxDoc         'FaxDocオブジェクト

    'FAX送信
    lobjFaxSvr.Connect ("VOSTRO") 'VOSTROはPC名です
    Set lobjFaxDoc = lobjFaxSvr.CreateDocument("C:\Users\sbs\Documents\test.txt")

    lobjFaxDoc.RecipientName = "送信者名"
    lobjFaxDoc.SenderTitle = "支払明細"
    lobjFaxDoc.DisplayName = "支払明細"
    lobjFaxDoc.FaxNumber = "1234567890"

    lobjFaxDoc.Send    ' ← ここでエラー

    lobjFaxSvr.Disconnect

    End Sub




    • 編集済み Benton10 2020年1月20日 9:19
    2020年1月20日 8:45

回答

  • Set lobjFaxDoc = lobjFaxSvr.CreateDocument("C:\Users\sbs\Documents\test.txt")

    "faxcom 1.0 Type Library" (FXSCOM.dll) の「FaxDoc オブジェクト」と、"Microsoft Fax Service Extended COM Type Library" (fxscomex.dll) の「FaxDocument オブジェクト」では、オブジェクト インスタンスの作り方が異なります。

    前者は FaxServer インスタンスの CreateDocument メソッドで FaxDoc オブジェクトを生成することになりますが、後者は「New FAXCOMEXLib.FaxDocument」もしくは「CreateObject("FaxComEx.FaxDocument")」で FaxDocument を生成します。

    宛先の指定は 「.FaxNumber = "042-585-8501"」ではなく、「.Recipients.Add "042-585-8501", "テスト送付先"」を使います(複数指定すれば同報送信)。

    また、送信に使うメソッドも Send メソッドではありません。

    Body プロパティに文書ファイルを指定した場合は、ConnectedSubmit メソッドもしくは Submit メソッドを使い、Bodies プロパティに文書ファイルの一次元配列を指定した場合は、ConnectedSubmit2 メソッドもしくは Submit2 メソッドを呼び出します。

    • 回答としてマーク Benton10 2020年1月22日 6:37
    2020年1月21日 9:09
  • 突然ですがVBでFAX送信をするプログラムを作ってみました という blog 記事に、
    「txtは送れませんでした。」
    「txtに割り当てられているプログラムをメモ帳にもどしたら、FAXが送れました。」
    というコメントが付けられていました。

    拡張子 .txt の関連付けがメモ帳になっているかどうかも確認してみてください。

    • 回答としてマーク Benton10 2020年1月22日 7:09
    2020年1月21日 9:33
  • 魔界の仮面弁士 さん ありがとうございます。

    おかげさまで、解決しました (*^▽^*)
    なんとお礼を言っていいか、本当にありがとうございます。

    参照設定をきちんと立て分けて、それに合ったコードを書くべきこと、
    (fxscomex.dll)の場合はsend ではなく、submitとすべき、
    TXTファイルの関連アプリは「メモ帳」に設定など、
    ご教示いただき目から鱗でした。(秀丸に関連付けてました)

    その上で、「突然ですがVBでFAX送信をするプログラムを作ってみました」 という blog を拝見すると、魔界の仮面弁士さんの指摘どおりのコードでしたので、これは!と思い試したところ、ほぼ、微調整のみで、FAX送信できました。
    ブログ主の「ウブノックさんにも御礼致します。

    ありがとうございました。今後もいっそう、ご活躍を!!

    さいごに成功コードを貼っておきます。2004年7月にXP用として組まれたコードです。

    成功した環境は
    Windows10(64bit)のAccess(64bit for Office365)から
    windows10付属の「FAXとスキャン」経由でFAX送信

    参照設定は「Microsoft Fax Service Extended COM Type Library」(fxscomex.dll)

    Private Sub コマンド0_Click()

        Dim objFaxServer As FAXCOMEXLib.FaxServer   'FAX Serverの定義変数
        Dim objFaxDocument As FAXCOMEXLib.FaxDocument   '送信ドキュメントの定義変数
        
        Dim varFaxJobIds As Variant
        
        Set objFaxServer = New FAXCOMEXLib.FaxServer    'Fax Serverオブジェクトを作成する
        objFaxServer.Connect ""   'FAXサーバへ接続""カラ文字でOK、自動で探しに行くみたい
        Set objFaxDocument = New FAXCOMEXLib.FaxDocument    '送信ドキュメントのオブジェクトを作成
        
        objFaxDocument.Priority = fptNORMAL '優先度は普通に設定 fptHIGH 優先 fptLOW 低
        
        objFaxDocument.Body = "C:\Users\sbs\Documents\test.txt" 'txtファイルの場合、アプリは「メモ帳」に関連付け必須)
        objFaxDocument.Subject = "テスト送信です"
        objFaxDocument.DocumentName = "test.txtです。"
        
        objFaxDocument.Recipients.Add "0123456789", "送付先名です"    '送信先を指定、Addで同報先として複数指定可能
        
        'ここで送信 varFaxJobIdsに送信したFAXJOBの管理情報が格納される
        varFaxJobIds = objFaxDocument.ConnectedSubmit(objFaxServer)
        
        Set objFaxDocument = Nothing    '後処理
        objFaxServer.Disconnect 'FAXサーバから切断
        Set objFaxServer = Nothing

    End Sub

    • 回答としてマーク Benton10 2020年1月22日 6:37
    2020年1月22日 6:28

すべての返信

  • 800700d ではなく 8007000d だと思いますが、それに該当するのは STIERR_INVALID_HW_TYPE『データが無効です。』エラーに当たりますね。

    CreateDocument の指定が C: ドライブの直下になっていますが、ドキュメント フォルダーやデスクトップなど、ユーザー権限で読み書き可能な場所で試してみるのは如何でしょうか。

    それと、lobjFaxDoc 変数の宣言に、New キーワードを含めるべきでは無いと思います。Windows 2000 頃のサンプルだと、そういう実装になっている物もあったようですが、少なくとも提示頂いたコードでは、後から Set で上書きされるので意味がありません。

    また下記リファレンスにおいても、FaxDoc オブジェクトは直接 New や CreateObject 等で生成しないようにと記されています。


    2020年1月20日 8:54
  • さっそくのご返信、ありがとうございます!!

    試してみましたが残念ながら、結果は同じエラーでした。

    "C:\test.txt"

      ↓ 変更してもエラー。

    "C:\Users\sbs\Documents\test.txt"

    CreateDocument 」の行は、ファイルを読み込みオンリーで、

    変数にセットしてるだけのようですね (^^;)

    ありがとうございました。

    2020年1月20日 9:18
  • Dim lobjFaxSvr          As New FAXCOMLib.FaxServer
    Dim lobjFaxDoc          As New FAXCOMLib.FaxDoc 

    の代わりに

    Dim lobjFaxSvr As Object
    Dim lobjFaxDoc As Object
    Set lobjFaxSvr = CreateObject("FaxComEx.FaxServer")

    に変更してみるのは如何でしょうか。

    VBA のコードでは無いのですが、下記では「New FaxLib.FaxServer」ではなく「New FAXCOMEXLib.FaxDocument」が使われているようなので。

     

     

    ちなみに、手元の VBA 環境で下記を実行したところ、前者は "IFaxServer"、後者は "IFaxServer2" と出力されました。

    Debug.Print TypeName(CreateOBject("FaxServer.FaxServer"))
    Debug.Print TypeName(CreateOBject("FaxComEx.FaxServer"))
    2020年1月20日 9:40
  • ありがとうございます!
    ご指摘のとおり修正しました。

    Dim lobjFaxSvr As Object
    Dim lobjFaxDoc As Object
    Set lobjFaxSvr = CreateObject("FaxComEx.FaxServer")
    'FAX送信
    lobjFaxSvr.Connect ("VOSTRO")
    Set lobjFaxDoc = lobjFaxSvr.CreateDocument("C:\Users\sbs\Documents\test.txt")

    しかし、別のエラーが発生しました。最終行「Set ~」の行で、

    実行時エラー 438
    オブジェクトはこのプロパティまたはメソッドをサポートしていません。

    となりました。
    2020年1月20日 10:11
  • Set lobjFaxDoc = lobjFaxSvr.CreateDocument("C:\Users\sbs\Documents\test.txt")

    "faxcom 1.0 Type Library" (FXSCOM.dll) の「FaxDoc オブジェクト」と、"Microsoft Fax Service Extended COM Type Library" (fxscomex.dll) の「FaxDocument オブジェクト」では、オブジェクト インスタンスの作り方が異なります。

    前者は FaxServer インスタンスの CreateDocument メソッドで FaxDoc オブジェクトを生成することになりますが、後者は「New FAXCOMEXLib.FaxDocument」もしくは「CreateObject("FaxComEx.FaxDocument")」で FaxDocument を生成します。

    宛先の指定は 「.FaxNumber = "042-585-8501"」ではなく、「.Recipients.Add "042-585-8501", "テスト送付先"」を使います(複数指定すれば同報送信)。

    また、送信に使うメソッドも Send メソッドではありません。

    Body プロパティに文書ファイルを指定した場合は、ConnectedSubmit メソッドもしくは Submit メソッドを使い、Bodies プロパティに文書ファイルの一次元配列を指定した場合は、ConnectedSubmit2 メソッドもしくは Submit2 メソッドを呼び出します。

    • 回答としてマーク Benton10 2020年1月22日 6:37
    2020年1月21日 9:09
  • 突然ですがVBでFAX送信をするプログラムを作ってみました という blog 記事に、
    「txtは送れませんでした。」
    「txtに割り当てられているプログラムをメモ帳にもどしたら、FAXが送れました。」
    というコメントが付けられていました。

    拡張子 .txt の関連付けがメモ帳になっているかどうかも確認してみてください。

    • 回答としてマーク Benton10 2020年1月22日 7:09
    2020年1月21日 9:33
  • 魔界の仮面弁士 さん ありがとうございます。

    おかげさまで、解決しました (*^▽^*)
    なんとお礼を言っていいか、本当にありがとうございます。

    参照設定をきちんと立て分けて、それに合ったコードを書くべきこと、
    (fxscomex.dll)の場合はsend ではなく、submitとすべき、
    TXTファイルの関連アプリは「メモ帳」に設定など、
    ご教示いただき目から鱗でした。(秀丸に関連付けてました)

    その上で、「突然ですがVBでFAX送信をするプログラムを作ってみました」 という blog を拝見すると、魔界の仮面弁士さんの指摘どおりのコードでしたので、これは!と思い試したところ、ほぼ、微調整のみで、FAX送信できました。
    ブログ主の「ウブノックさんにも御礼致します。

    ありがとうございました。今後もいっそう、ご活躍を!!

    さいごに成功コードを貼っておきます。2004年7月にXP用として組まれたコードです。

    成功した環境は
    Windows10(64bit)のAccess(64bit for Office365)から
    windows10付属の「FAXとスキャン」経由でFAX送信

    参照設定は「Microsoft Fax Service Extended COM Type Library」(fxscomex.dll)

    Private Sub コマンド0_Click()

        Dim objFaxServer As FAXCOMEXLib.FaxServer   'FAX Serverの定義変数
        Dim objFaxDocument As FAXCOMEXLib.FaxDocument   '送信ドキュメントの定義変数
        
        Dim varFaxJobIds As Variant
        
        Set objFaxServer = New FAXCOMEXLib.FaxServer    'Fax Serverオブジェクトを作成する
        objFaxServer.Connect ""   'FAXサーバへ接続""カラ文字でOK、自動で探しに行くみたい
        Set objFaxDocument = New FAXCOMEXLib.FaxDocument    '送信ドキュメントのオブジェクトを作成
        
        objFaxDocument.Priority = fptNORMAL '優先度は普通に設定 fptHIGH 優先 fptLOW 低
        
        objFaxDocument.Body = "C:\Users\sbs\Documents\test.txt" 'txtファイルの場合、アプリは「メモ帳」に関連付け必須)
        objFaxDocument.Subject = "テスト送信です"
        objFaxDocument.DocumentName = "test.txtです。"
        
        objFaxDocument.Recipients.Add "0123456789", "送付先名です"    '送信先を指定、Addで同報先として複数指定可能
        
        'ここで送信 varFaxJobIdsに送信したFAXJOBの管理情報が格納される
        varFaxJobIds = objFaxDocument.ConnectedSubmit(objFaxServer)
        
        Set objFaxDocument = Nothing    '後処理
        objFaxServer.Disconnect 'FAXサーバから切断
        Set objFaxServer = Nothing

    End Sub

    • 回答としてマーク Benton10 2020年1月22日 6:37
    2020年1月22日 6:28