メモ帳vbsでFAX送信するページに戻る

メモ帳vbsで、もうちょっとましなFAX送信の仕方を考えるページに行く




送信相手の選択に「一覧表」が使えること、以外にどんなメリットがあるんだろ。
AccessやExcelを使えばメモ帳なんかより圧倒的に便利なFAX送信プログラムができる、というわけでもないような気がしてきた。

送信ファイル選択に関しては間違いなくメモ帳VBSのDragDropのほうが楽です。
OfficeVBAでDragDropってのはなかなか難しい。
できないわけじゃないらしいですよ。
以前ちょっと実験してひどい目にあって、二度と手を出したくないというだけです。

ファイル選択ダイアログが出せるならそれで文句なしなんですが、ただAccessにもExcelにも、簡単に使えるおまけとしてダイアログはついてない。

ここでWindowsAPIなんか呼び出したら収拾がつかなくなります。
APIのファイル選択ダイアログってのは、もう冗談じゃねーやという感じの馬鹿長い代物です(→こんな感じ)

調べてみると、何のことはない、選択ダイアログってVBSで出せるんですね。
Function GetStrFromDLG(boolFL, strTitle)
    Dim MyParam
    Dim MyShellApp, MyObjFF
    Dim MyStrFF
    
    MyStrFF = ""
    If boolFL = True Then
        MyParam = &H4000
    Else
        MyParam = 0
    End If
    Set MyShellApp = CreateObject("Shell.Application")
    Set MyObjFF = MyShellApp.BrowseForFolder(0, strTitle, MyParam, &H11)
    If Not MyObjFF Is Nothing Then
        MyStrFF = MyObjFF.Items.Item.path
    End If
    Set MyObjFF = Nothing
    Set MyShellApp = Nothing
    If boolFL = True Then
        If CreateObject("Scripting.FileSystemObject").FolderExists(MyStrFF) = True Then
            MyStrFF = ""
        End If
    End If
    GetStrFromDLG = MyStrFF
End Function

たったこれだけ。
第1引数boolFLのTrue False切り替えで、ファイル選択にもフォルダ選択にも使える。

VBSで出来るってことは、たぶんVBAでも出来る。
やってみたらやっぱり出来た。
Private Function GetStrFromDLG(boolFL As Boolean, strTitle As String) As String
    Dim MyParam As Long
    Dim MyShellApp As Object
    Dim MyObjFF As Object
    Dim MyStrFF As String
    
    MyStrFF = ""
    If boolFL = True Then
        MyParam = &H4000
    Else
        MyParam = 0
    End If
    Set MyShellApp = CreateObject("Shell.Application")
    Set MyObjFF = MyShellApp.BrowseForFolder(0, strTitle, MyParam, &H11)
    If Not MyObjFF Is Nothing Then
        MyStrFF = MyObjFF.Items.Item.path
    End If
    Set MyObjFF = Nothing
    Set MyShellApp = Nothing
    If boolFL = True Then
        If CreateObject("Scripting.FileSystemObject").FolderExists(MyStrFF) = True Then
            MyStrFF = ""
        End If
    End If
    GetStrFromDLG = MyStrFF
End Function

Private Sub CmdBtn1_Click()  
    Me.Label1.Caption = GetStrFromDLG(True, "どうでもいいけど何かファイルを選べ。フォルダなんか選んだら無視する")
End Sub


と、ここまで書いておいてこんなことを言うのもなんですが。

選択ダイアログをvbsで出すこの案、結局はボツです。

OSのバージョンによるのか、Officeのバージョンによるのか、エラーになることがある。
今のところ確認できているエラーは、GetStrFromDLGの第一引数をTrueにした場合、つまりファイル選択のほうだけです。
でも、そんなエラーを見ちゃった以上、フォルダ選択に関しても、もうこれを使う気にはなれません。

となると残された方法はたぶんAPIだけです。
フォルダ選択はファイル選択よりちょっとだけ短いです(→これぐらい)




それはともかくとして、問題は、ですね。
FAXが本当にちゃんと送られたかどうか確認するすべはないのか、ということ。
どこかに送信履歴みたいなものは残せないのか、と。

そりゃこっちが何かするまでもなく履歴は勝手に残されてますよ。

人によって違う可能性もあるので断定は避けますけど、
Windows2000なら "C:\Documents and Settings\All Users\Documents\My Faxes\Sent Faxes"
XPなら "C:\Documents and Settings\All Users\Application Data\Microsoft\Windows NT\MSFax\SentItems"
あたり、覗いてみてください。
なんでこんな分かりにくい場所に、こんな雑な置き方するかな、と言いたくなります。
何だかもう箸にも棒にかからない掃き溜め状態です。

ひとたびそれを覗いちゃうと、これは自分で何とかしなきゃという気分になります。
Access使うんだったらフォームのタイマーを利用してどうにかしてしまいましょう。

まずはFAX送信処理に入る直前に、履歴保管フォルダのサイズ測定。
送信手順に入ったところでタイマースタート。
5秒おきぐらいにまた何度も何度も問題のフォルダをはかりに行く。

送信が完了したら履歴が増えるわけだから、フォルダサイズも増大しますよね。
増大が確認されたら、そのフォルダ中の「いちばん新しいファイル」を取得。
これが取得できれば、あとはもう自分の都合のいいように整理できるでしょ。

実はこれ、タイマーなしでもいけます。
WindowsAPIにSleepという関数がありまして。
「何秒寝たら何をやれ」を繰り返せば、事実上立派なタイマーでしょ。
ってことはExcelでもいける



雑なサンプルはこちら(Access版、Excel版、両方入ってる)
とりあえず送信できるファイルはtxt、bmp、snpぐらいだと思いますけど、このあたりのページ()を参考にコードを書き足せばdoc、xls、htmlも可能になります。



ただExcel版に関してはちょっと不満が。

どういうことかというと。

送信完了までの時間が待ちきれないってことが、たぶん実際には起こると思うんです。
とっとと次の人に次のファイルを送信したい、と。
(送信中でも次の送信命令は出せる気がする。やったことはないけど、たぶん。FAXってのはプリンターみたいなものだと思うから)
完了を待って、履歴フォルダから最新ファイルを取得、それをこちらの都合に合わせて整理、なんてどうでもいい。
そんなことしなくたって履歴は、掃き溜め状態ではあるにせよ、間違いなく残るわけだろ、と。

本物のタイマーを使ったAccsess版は、簡単に前途放棄ができます。
単にタイマーを止めればいいだけ。
続けざまにだーっと送信命令出して、あとはゆっくりコーヒーでも飲みたいと思ったら、それも可能です(やったことはないけど、たぶん)

いっぽうSleep繰り返し型だと、最短でも送信が完了するまで、最悪の場合あらかじめ設定した繰り返し回数に達するまで、何をしてもうんともすんとも言いません。
フリーズ状態かと勘違いするほどの頑固さです。
はやく次の送信をしたいと思ったら、タスクマネージャあたりからいちどEcxelを強制終了したうえあらためて起動するしかないでしょう。
(Excelを無理やり終了させても、すでに下っている送信命令だったらそれは実行されます。やったことはないけど、たぶん)

もちろん履歴管理をしないという設定もできますんで、そちらを選べば、Sleepの繰り返しは行いません。
立て続けに送信命令が出せます(やったことはないけど、たぶん)

ただ、そういう使い方をするなら。

起動中アプリとしてのウィンドウを持たないwhs-vbsのほうがストレスを感じないで済むと思います。
AccessやExcelなんて御大層なものを持ち出すまでもなく、50行にも満たない(この程度の)メモ帳走り書きで、望みはかなえられます。

と、メモ帳ついでにもう一つ。

wsh-vbsでは、WindowsAPIは使えないけど、Sleepについては不思議な扱いになってるんですね。
「API?何ですかそれは?そんなものは知りませんが、Sleepというのは我がwsh独自のメソッドとして確かにありますよ」みたいな感じで、堂々と直に使えるようになってる(以前、辞書引きvbsをつくったときに知った)
つまり、ここでつくったExcel版と同程度のものなら、メモ帳でも出来るわけです(こっちのほうがExcel版より使いやすいかも)















-