2022年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
無料ブログはココログ

« CCNA | トップページ | OJTについて »

VB6 WindowsXPでFAXを送信

1.モデムのインストール
2.FAXサービスをインストール
「プログラムの追加と削除」-->「Windowsコンポーネントの追加と削除」
Faxservice





3.VBの参照設定でFAXCOMLibにチェックを付ける

Fax





4.VB6コード例

    Dim faxServer As New FAXCOMLib.faxServer
    Dim faxDoc As New FAXCOMLib.faxDoc
    Dim faxNumber As String

    faxServer.Connect "PC名"

    Set faxDoc = faxServer.CreateDocument("C:\Temp\Fax.doc")

    faxDoc.RecipientName = "受信者名"
    faxDoc.SenderTitle = "件名です"
    faxDoc.DisplayName = "Fax送信テスト"
    faxNumber = "0000000000000"    '-は取り除いておく
    faxDoc.faxNumber = faxNumber

    faxDoc.Send
    faxServer.Disconnect

« CCNA | トップページ | OJTについて »

VB6」カテゴリの記事

コメント

はじめまして、さとです。
よかったらおしえててください。

Set faxDoc = faxServer.CreateDocument("C:\Temp\Fax.doc")

上記の"C:\Temp\Fax.doc"は、どんな内容のファイルでしょうか?

はじめまして。tukaenai-pgです。

"C:\Temp\Fax.doc"はWordの文章です。

「faxServer.CreateDocument」でFAXで送信したい文章を指定します。
ExcelやPDFなどの印刷可能な文章であればいろいろ設定できると思います。

 初めまして 國松と申します。
 私はパソコンのハード面やソフト面にはあまり強くないのですが、仕事の関係上、複数の先に、それぞれ内容の異なったエクセル文書をワンクリックでファックスを一気に送りたく、マクロやVBを少し勉強し、マクロを使ってプリンターに一度に出力することはできるようになりました。
 しかし、VBを使ってFAXを送る方法がわからずネットで探していたところ、貴殿のホームページが目に止まり、貴殿が記載しておられるVBを参考に作成しましたが、うまくFAXできません。
 ちなみに私のパソコンはNECのデスクトップ「VALUESTAR」でWindows/XP HomeEdition SP2 でFAXソフトとモデムは内蔵されており、印刷でFAXを指定するとFAXウィザードが立ち上がり個別に送信することは可能です。
 このような状態で、貴殿のVBを参考に作成しましたが、ユーザーフォームを実行しますと、FaxDoc.Sendのところで、「実行時エラー'-2147024890(80070006)''Sendメソッドは失敗しました''IFaxDoc'オブジェクト」のエラーになりストップしてしまいます。
 ①ちなみに、faxServer.Connect"PC名"の"PC名"には具体的に何を入れれば良いのでしょうか?
 ②エラーでヘルプをクリックすると"オートメーションエラーです"と表示されますが、原因は何が考えられるのでしょうか?
 知識のない者が勉強もせず、お忙しい中を大変失礼な質問をして申し訳ありませんが、もしおわかりでしたらご教示願えないでしょうか?
 よろしくお願いします。
 

はじめまして。tukaenai-pgです。

faxServer.Connect"PC名"はFAXを送信するパソコンのコンピュータ名を入れます。
コンピュータ名は、「マイコンピュータ」を右クリックしてプロパティをクリックするとシステムのプロパティが表示されます。
「コンピュータ名」のタブをクリックすると「フルコンピュータ名」という欄がありますのでその名前がコンピュータ名となります。

オートメーションエラーですが、印刷でFAXを指定すると個別に送信できるということなので、プログラムのどこかに問題があると思われます。
CreateDocumentのファイルのパスが違う、PC名の設定が違う等々の原因が考えられます。

tukaenai-pg 様
國松です。ご丁寧にご回答ありがとうございます。
①のPC名はすぐにわかりました。
 そこでPC名とFAXするエクセル文書の入ったファイル名を入力してユーザーフォームを実行したところ、エラーメッセージは出なくなりましたが、FAX送信はできず、エクセルが全く反応しなくなりました。
 ×をクリックしてエクセルを終了しようとしても砂時計のマークが出たままの状態ですし、コンピュータを終了させようとしても「Microsoft Office Excel を終了できません」というメッセージが返ってくる状態で、最後は強制的に電源を切るしかありませんでした。
 インターネットや参考図書で色々と調べ構文を変えたりしてみましたが結局この状態は変わりませんでした。
ちなみに、私が作成したロジックは以下のとおりです。
Sub FAX送信()
Dim FaxServer As New FAXCOMLib.FaxServer
Dim FaxDoc As New FAXCOMLib.FaxDoc
Dim FaxNumber As String
Call FaxServer.Connect("valuestar-xp")
Set FaxDoc = FaxServer.CreateDocument("C:\Documents and Settings\kunimatu\My Documents\通知書FAX.xls")
FaxDoc.RecipientName = "國松"
FaxDoc.SenderTitle = "件名です"
FaxDoc.DisplayName = "送信テスト"
FaxNumber = "0123456789" '本番は実在の番号を入力
FaxDoc.FaxNumber = FaxNumber
FaxDoc.Send
FaxServer.Disconnect
End Sub
 以上のとおりですが、この現象の原因は何が考えられるでしょうか。お忙しいところを何度も質問して申し訳ありませんが、是非ご教示をお願いします。

國松 様

こんにちは。tukaenai-pgです。

ロジックをみたところ、問題なさそうに思えます。

まず、Excel以外の文章を指定して送信できるか確認してみてください。
メモ帳で作成したテキスト文章を指定してみて送信できれば、Excel側の問題でロジックは問題ないと判別できます。
ロジックの変更箇所は「CreateDocument」の部分を変更するだけで良いと思います。

Set FaxDoc = FaxServer.CreateDocument("C:\Documents and Settings\kunimatu\My Documents\通知書FAX.xls")
↓メモ帳で作成した文章を指定 
Set FaxDoc = FaxServer.CreateDocument("C:\Documents and Settings\kunimatu\My Documents\テスト.txt")

次に、Excelファイルの印刷設定で「FAX」に設定して保存してみてください。
具体的には該当のExcelファイルを開いて「ファイル」メニューの「印刷」でプリンタを「FAX」に変更してからファイルの保存を行ってください。
VBからFAXが送信できるか試してみてください。


tukaenai-pg 様
國松です。見ず知らずの人間に懇切丁寧に教えていただき、本当にありがとうございます。一歩づつですが前進しています。

①メモ帳で作成したテキスト文章を指定してみて送信
 うまく送信できました。印刷の指定を特にFAXにしなくても送信できました。
②Excelファイルの印刷設定で「FAX」に設定して保存
 スタート→コントロールパネルからFAXを"通常使うプリンタ"に指定し、Excelファイルの印刷設定で「FAX」に設定して保存した上で、VBからExcelファイルをFAX送信しようとしましたが、前回と同様の症状となりました。
 テキスト文章では送信できましたが、Excel文章はうまくいきません。インターネットで調べていると、Excel文章は比較的容易に送信できるように書いてあるのですが、わかりません。私としては何としてもExcel文章を送信したいのですが・・・
 何度も質問して大変申し訳ありませんが、何か思い当たるところがあればお教え下さい。
 

通りすがりです。
EXCELを立ち上げたままFAXを送信していませんか?
EXCELを終了してからVBからのFAX送信を試してみてはいかがでしょうか。

通りすがり 様
國松です。ご助言ありがとうございます。

①EXCELを立ち上げたままFAXを送信していませんか?
 その件については、インターネットで調べていて、また実際にVBを実行してみてわかっていたつもりです。
 テキストファイルの文章を送信するときも、EXCELファイルの文章を送信するときも、各ファイルは終了して(閉じて)いました。
 ただ、助言いただいているのはもっと別の方法・意味があるのでしょうか。あればよろしくお願いします。

タスクから実行するとか、IISから実行するなどで、別のアカウントで実行しようとしていませんか?

たとえば、SYSTEMアカウントで実行しようとすると、初めてEXCELを起動したことになり、EXCELが初期設定のためのダイアログを表示して停止していることがあります。

タスクマネージャーでEXCELが起動していないことを確認した上で、FAX送信プログラムを起動し、EXCELが起動されているのに、FAX送信がなされな場合は、上記を疑ってよいかと思います。

PS.
XPの場合は、
-----
Dim FaxDoc

Set FaxDoc = CreateObject("FaxComEx.FaxDocument")
FaxDoc.recipients.Add "03xxxxxxxx"
FaxDoc.body = "C:\tmp\TEST.xls"
FaxDoc.submit ""
-----
というコードでもFAX送信できます。

二階堂丸さんがコメントしている通りでWebプログラムだとうまくいかない可能性があります。


それから、別のExcelファイルを指定してもExcelの応答がなくなってしまうのでしょうか?
Excelで簡単な文章を入力しただけのファイルを作成して試してみてください。

二階堂丸さん、tukaenai-pg 様
國松です。ご助言ありがとうございます。
 最初に述べたとおり、私はパソコンのハード面やソフト面にはあまり強くないので、タスクやIISから実行するとかWebプログラムという意味がよくわかりませんが、私の実行環境を申しますと、
 マイドキュメント内の"國松"というフォルダ内に
 ①通知書FAX.txt(テキストファイル)②通知書FAX2.xls(エクセルファイル)③送信実行.xls(エクセルファイル)
 の3つを作成し、③送信実行ファイルのみを立ちあげ、VBEを展開し、ユーザーフォームの実行をしていますが、VBEで①のテキストファイルを指定して実行した時はうまくFAXできますが、②のエクセルファイルを指定して実行した時がうまくいきません。
 ②のエクセルファイルを、簡単な文章を入力しただけの別のファイルに変更して実行してみましたが同じでした。
 また、③送信実行ファイルをデスクトップに貼り付けそこから実行してみましたが、これも同じでした。
 どうかよろしくお願いします。

追加 國松
 固まった状態の時、タスクマネージャーで③の送信実行ファイルを終了させようとすると、「このプログラムは応答していません」というメッセージが返ってきます。

追加 國松
 その後、送信するファイルを④通知書FAX4.doc(wordファイル)を指定したところ、うまく送信できました。
 どうも、エクセルのマクロでテキストファイルやワードファイルはうまく送信できますが、エクセルのマクロで他の同じエクセルファイルはうまく送信できないようです。
 このれが原因だとすれば、どうすればよいのでしょうか?私としては、エクセルのマクロでエクセルファイルを送信したいと思っているのですが、不可能なのでしょうか・・・
 どうかよろしくお願いします。

ExcelのVBAを使用してFAX送信プログラムということですが、VBAはあくまでもExcel上で起動しているため、
二階堂丸さんのコメントの「EXCELを立ち上げたままFAXを送信していませんか?」にひっかかってしまっているのでしょう。
ExcelVBAでExcelファイルをFAX送信するのは難しいかもしれません。

tukaenai-pg 様
國松です。ご助言ありがとうございます。
「EXCELを立ち上げたままFAXを送信していませんか?EXCELを終了してからVBからのFAX送信を試してみては」
「ExcelVBAでExcelファイルをFAX送信するのは難しい」
 とのことですが、私は、VBというものはEXCELの中に含まれEXCELを起動して初めて使える(動く)ものと思っていましたが、EXCELを立ち上げずにVBを起動することはできるのでしょうか。
 基本的なことを聞いているのかもしれませんが、よろしくお願いします。

VB(VisualBasic)とVBA(Visual Basic for Applications)は別ものです。

VisualBasicはプログラム開発製品として単体で販売されています。
VBAはExcel等のアプリケーション内に含まれるVisualBasicです。
VisualBasicとの大きな違いは、アプリケーション内でしか(今回の場合Excel)実行できない点です。

VisualBasicは「○○.exe」という形の単体で実行することができるファイルを生成することができます。

tukaenai-pg 様
國松です。いろいろとご助言ありがとうございます。
 どうも私はとんでもない勘違いをしていたようです。
 インターネットで「VB EXE」を検索したところ沢山VBに関する記事がでてきましたが、どれも私にはチンプンカンプンで、素人の私には全く理解できない内容でした。
 いろいろとご親切に教えていただきましたが、これは一旦あきらめて撤退したいと思います。
 本当にありがとうございました。また機会があればよろしくお願いします。
 

たまたま通りがかっただけですが

「エクセルのマクロでエクセルファイルを送信したいと思っている」というこだわりをお持ちのようですが

どうしても譲れないのは「エクセルファイルを送信したい」方なのかなと思います。

ワードの VBA もこれくらいの処理なら差があるとは思えませんので、仮にワードでエクセルファイルを送信できれば、それでもそこはこだわる部分でしょうか。
つまり「EXCELを立ち上げずにVBを起動することはできるのでしょうか」というご質問ですが「WORD の中にも VBA が入っていますよ。」ってことです。
VB(今なら .net になりますかね)を勉強するよりよっぽどハードルが低いかと思います。

ソースを拝見して書いてなかったのですが、例えばエクセルのセルに送信先リストみたいなのがあって、それを上から順番に読み込んで自動 FAX 送信しているのであれば、別の話です。

本当はテストしてから結果を提示できればいいのですが、FAXCOMLib が無い環境なので、これくらいで失礼します。

たまたま通りがかっただけ 様
國松です。ご助言ありがとうございます。
 WORDのVBAでエクセルファイルを送信することについては、私もテストしてうまく送信できました。
 ただ、ご推察のとおり、「エクセルのセルに送信先リストみたいなのがあって、それを上から順番に読み込んで自動 FAX 送信」したい、すなわちエクセルのデータベースからデータを順に読み込んできて(別の)エクセル帳票のセルにデータをMOVEしたうえで、そのエクセル帳票を順次FAX送信したい、と考えています。
 これをするためには、もっと高度なパソコンの知識が必要なようで、私にはとても不可能なようです。

たまたま通りがかっただけですが、気になったので戻ってきました。

やはり送信リストがあったのですね。
そりゃそうですよね。便利ですからね。申し訳ないです。

以下独り言と想像

「(別の)エクセル帳票のセルにデータをMOVEしたうえで、そのエクセル帳票を順次FAX送信したい」
ここが怪しいとまずにらむ。

おそらく、ここで FAX 送信用紙の相手先欄に会社名やご芳名を書き込んでいる気がする。
リストがあるファイルを List.xls(ここに送信プログラムもある)
FAX があるファイルを FAX.xls
と考えた場合、List.xls を開いて、List.xls のデータを FAX.xls に書き込んでいる。

で、FAX.xls を閉じずに Set FaxDoc = FaxServer.CreateDocument("") を実行しているかもしれない。
Excel が「別のユーザが使っています」的なメッセージを表示しきれずに止まっているように見えるのではないか…。

つまり、FAX.doc という WORD ファイルで成功しているのは、今はそのファイルが正しく閉じられている状態だから送信できている。

戻って Sub FAX送信() を呼び出す前に、書き込まれている FAX.xls は正しく Save & Close されているのか。

が気になります。

次に、やっぱり正しく閉じているけど送信できていない場合

私なら迷わず Access を使うと思います。
ただ、Excel や WORD に比べて若干敷居が高い…。

國松氏は WORD では成功しているみたいだ。
でも Excel のリストと Excel の文書を使いたい。
VB まで行くとちょっと本末転倒かもしれない。

Excel や WORD の範囲で、Access や VB(VB.net) まで行かずに、Excel を使わずに Excel のリストを使って FAX 送信する方法…

私なら以下の方法を試してみます。
國松氏のレベルは存じませんが、それに比べてけして高すぎる技術でなく、むしろ Excel や WORD の VBA を使われていらっしゃるようですので次のステップとしても最適かと存じます。

・WORD を送信プログラムにする
・WORD VBA で参照設定から「Microsoft Excel xx.x Object Library」を指定する

Dim oExcel As Excel.Application '*1
Dim oList As Excel.Workbook '*2
Dim oFAX As Excel.Workbook

Set oExcel = New Excel.Application '*3
Set oList = oExcel.Workbooks.Open("List.xls") '*4

送信先リストでループ開始
 Set oFAX = oExcel.Workbooks.Open("FAX.xls")
 書き込む処理
 
 書き込み終了
 oExcel.DisplayAlerts = False '*5
 oFAX.Save '*6
 oFAX.Close '*7
 oExcel.DisplayAlerts = True
 Set oFAX = Nothing '*8
 Call FAX送信() '*9
ループ終了

oList.Saved = True
oList.Close
Set oList = Nothing

oExcel.Quit
Set oExcel = Nothing '*10

こんな感じで作るかな

すごーくおおざっぱな書き方ですが、貴殿がフォルダエクスプローラでされていることを WORD を介してプログラムでやってしまう話です。
つまり Windows になったつもりで作業を考えます。
嘘を含むことを承知でちょっと書きますが…。

*1 デスクトップに Excel のアイコンを作成します
*2 ファイルを開く準備です
*3 デスクトップのアイコンをダブルクリックします
*4 Excel の「ファイル」→「開く」で List.xls を指定します
*5 これを書かないと *6 で面倒になります
*6 FAX.xls を保存します
*7 FAX.xls を閉じます
*8 おまじない
*9 正しく閉じたファイルに対して FAX 送信
*10 Excel を閉じます(おまじない)

こんなテストするかな。
意味は考えずに、変数で Set を使ったら、必ず Nothing を最後に付けると覚えておくと、後々の不幸を避けることができます。

大切なのはあきらめないことだと思います。
でも無理なら無理で一時退却もいいと思います。
また通りすがるとは限りませんので書きたいことを全部書いてしまいました。

長過ぎるよ > 俺

管理人さん、どうもすいませんでした

たまたま通りがかっただけ 様
國松です。ご助言ありがとうございます。
 WORDのVBAで、EXCELデータを別のEXCEL帳票に順次転記して、そのEXCEL帳票をその都度FAXする、まさしく私が行いたいことをずばり記述していただいています。
「EXCELデータを別のEXCEL帳票に順次転記」については、データベースの入ったEXCEL VBAで次のようにプログラミングしうまくいっています。
Sub 全件FAX()
Dim cnt01 As Integer
Dim cel01 As String
For cnt01 = 2 To 11 Step 1
Windows("通知書データ.xls").Activate
Sheets("Sheet2").Select
If Cells(cnt01, 4) <> "" Then
帳票EXCELのOPEN
Workbooks.Open Filename:="C:\Documents and Settings\kunimatu\My Documents\通知書帳票.xls"
Windows.Arrange ArrangeStyle:=xlHorizontal
データの転記
Windows("通知書データ.xls").Activate
Sheets("Sheet2").Select
cel01 = "A" & cnt01
Range(cel01).Select
Selection.Copy
Windows("通知書帳票.xls").Activate
Sheets("Sheet1").Select
Range("A1").Select
ActiveSheet.Paste
(以下、上記と同じくデータ転記作業)
帳票EXCELのCLOSE
Windows("通知書帳票.xls").Activate
Sheets("Sheet1").Select
Range("A1").Select
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close

ここに"通知書帳票.xls"をFAXするVBAを挿入(挿入しなければこのマクロは問題なく処理するが、挿入すると固まる)

Else
GoTo DataSetEnd
End If
DataSet:
Next cnt01
DataSetEnd:
Windows("通知書データ.xls").Activate
ActiveWindow.WindowState = xlMaximized
Sheets("Sheet1").Select
Range("A1").Select
End Sub
 一旦、データを転記した後、"通知書帳票.xls"をCLOSEしますが、FAX送信VBAのところで固まってしまします。
 一方、WORDのVBAでFAX送信VBAのみを実行するとうまく送信します。
 一度、たまたま通りがかっただけ様が記述いただいたWORD VBAを参考にしていろいろとテストしてみます。
 ありがとうございます。

すでに通りがかっていませんが…

FAX 送信がうまくいかなくても、この技術(というか感覚)は応用が利くので損はしないと思っています。

一気に目的の物を作ると大変と思いますので、以下のことを試してください。

1. マイドキュメントに TEST.xls を作成
2. 適当に WORD ファイルを作成
3. VB 画面の参照設定で Excel を指定する
4. UserForm を挿入する
5. コマンドボタンを配置する
6. 以下のコードをコピペする

Private Sub CommandButton1_Click()
  Dim oExcel As Excel.Application
  Dim oBook As Excel.Workbook
  Dim oSheet As Excel.Worksheet
  Dim i As Integer

  Set oExcel = New Excel.Application
  oExcel.Visible = True '*1

  Set oBook = oExcel.Workbooks.Open("C:\Documents and Settings\kunimatu\My Documents\TEST.xls")

  Set oSheet = oBook.Worksheets("Sheet1")

  For i = 1 To 100
    oSheet.Range("A" & i) = "Hello World"
  Next

  oBook.Save
  oBook.Close

  Set oSheet = Nothing '*2
  Set oBook = Nothing

  oExcel.Quit
  Set oExcel = Nothing
End Sub

基本中の基本となります。
*1 Visible = True にしているので、何が起こっているのか、感覚でご理解いただけたらと思います。

*2 Set した変数には、最後に必ず Nothing を入れてあげてください。

これを書いていて気づいたのですが、前の *5 で DisplayAlerts = False にしていますが、必要ないかもしれませんね。すいません。

次に、こんなのはいかがでしょうか。
1. マイドキュメントに TEST2.xls を作成
2. さっきの WORD の UserForm に新しくコマンドボタンを配置する
3. 以下のコードをコピペする

Private Sub CommandButton2_Click()
  Dim oExcel As Excel.Application
  Dim oBook1 As Excel.Workbook
  Dim oBook2 As Excel.Workbook
  Dim i As Integer

  Set oExcel = New Excel.Application
  oExcel.Visible = True

  Set oBook1 = oExcel.Workbooks.Open("C:\Documents and Settings\kunimatu\My Documents\TEST.xls")
  Set oBook2 = oExcel.Workbooks.Open("C:\Documents and Settings\kunimatu\My Documents\TEST2.xls")

  oExcel.Windows.Arrange xlArrangeStyleHorizontal

  For i = 1 To 100
    oBook2.Worksheets("Sheet1").Range("A" & i) = oBook1.Worksheets("Sheet1").Range("A" & i)
  Next

  oBook2.Save
  oBook2.Close

  oBook1.Activate
  oExcel.ActiveWindow.WindowState = xlMaximized

  Set oBook2 = Nothing
  Set oBook1 = Nothing
  Set oExcel = Nothing
End Sub

ソースを拝見するに、操作対象となる Window を Active にして、Worksheet を Select して操作されているイメージに見受けられます。
それがいかんとかいう話ではなくて…

今回の肝は、Excel, Workbook, Worksheet をそれぞれ変数に設定して、意識的にその変数に対してコマンドを実行していくようなイメージです。
ファイルを 2 つ開けたかったら変数を 2 つ用意したりとかします。

後はうまくいくことを祈っています。

気になって気になって夜も眠れないので、蛇足ながら書かせていただきます。

提示いただいたソースの For ~ Next ですが、Exit For で抜けることをお勧めします。

  For cnt01 = 2 To 11 Step 1
     :
    If Cells(cnt01, 4) = "" Then '<> → =
      Exit For
    End If
     :
    (帳票EXCELのOPEN 以降)
  Next

  (DataSetEnd: ラベル以降)
End Sub

ラベルとか Go To 文を使わずに書けます。

あぁすっきりした。ではご健闘を祈ります。

管理人のtukaenai-pg 様
 勝手にいっぱい書き込んで申し訳ありません。
 また、いろいろと教えていただきありがとうございました。
何度も通りがかった方 様
 いろいろご助言ありがとうございました。
國松です。
 皆様のご助言のおかげで、何とかFAX送信することができました。
WORD文書上にボタンを作成し、それをクリックすることでWORD VBAを実行し、EXCELのデータベースからEXCELの帳票に順次氏名や金額等を転記し、そのEXCEL帳票をそれぞれ異なった先に順次FAXすることができました。これで、素人でもワンクリックで大量のデータをFAXできます。会社でも十分使えそうです。
 VBAの初心者でほとんど何もわからない私に、親切にあれこれ教えていただき、本当にありがとうございました。一時はVB.NETも勉強し掛けましたがこれはお手上げ状態で諦めていただけに本当に助かりました。心から御礼申し上げます。

おめでとうございます!

國松さん。
おめでとうございます。
あまり力になれませんでしたが、FAX送信できたようでよかったです。

何度も通りがかった方さん。
とてもわかりやすい説明ありがとうございました。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: VB6 WindowsXPでFAXを送信:

« CCNA | トップページ | OJTについて »