戻る
当たり前の話ですが、送信するにあたって、相手先のFAX番号の入力は求めません。
VBSファイルに、送りたいファイルをDragDropしたら、ただちに送信処理に入ります。
だからといってコード中にFAX番号を直埋め込みするわけでもありません。
20人いたら20個のVBSファイルを用意することになりますが、相手がどこの誰だろうと中身は一緒、すべて下のコードです。
FAX番号はVBSファイル名に埋め込んでしまいましょう。
そのほうが間違いが起こりにくい。
というわけで、メモ帳にコードを貼り付けて保存するさい、ファイル名の右側14文字は FAX番号10桁.vbsになるようにしてください。
("faxto玉虫厨子商会_0345678912.vbs" みたいなカタチ)
右側14文字から.vbsを削った残りの10文字が全部数字じゃなければ処理途中で蹴ります。
あと、FAX機能そのものは、すでに入っているMSFAXを利用することになるんで、何から何までコード書きだけで制御できるわけじゃないです。
送信履歴の保存場所なんてのもその一つ。
これは完全にMSFAX側の支配下にあって、こっちからの命令はきいてくれません(たぶん)
あっちの都合にこっちの命令文を合わせるしかない。
合わせるしかないんですが、このMSFAXの送信履歴保存場所ってのは見るも無残な掃き溜めフォルダーで、そのまま利用するのは難しい(データとしてはまるで使い物になりません)
多少の無理をしてでも、こっちの都合にあわせた履歴保存の形式を新たにでっち上げたいところです。
もちろん、新たにでっち上げるにしても、元になるのはその掃き溜めフォルダなんで、とりあえずそれをさがして(またはMSFAX側のUIで設定して)下のコード中の Const MSFAXHAKIDAME = " --- " に突っ込んでください。
送信履歴の管理なんていらない、ただDragDropで送れればいいってことなら Const MSFAXHAKIDAME = は空文字でもデタラメでもいいんですが、そういうことなら、下のような長いコードは不要。これぐらいで充分でしょう。
逆に、これではまだ不満、エクセルやワードやhtmlファイルなんかもDragDrop送信できなきゃダメだ、と思う方はこちらへ。
Option Explicit
Const MSFAXHAKIDAME = "C:\Documents and Settings\All Users\Documents\My Faxes\Sent Faxes"
'↑
'MSFAXの送信履歴保存場所はたぶんマシンによって違う
'(もしかしたらこのどちらでもないかもしれない。分からなかったら適当なデタラメか空文字でも)
'↓
'Const MSFAXHAKIDAME = "C:\Documents and Settings\All Users\Application Data\Microsoft\Windows NT\MSFax\SentItems"
Const CLOOPCNT = 100
Dim MyArgs 'Object
Dim MyStrThisVBSFullPath, MyStrSendFile, MyStrFAXNum '文字列
Dim MyFSO, MyFolder 'Object
Dim MyFSizeBeforeSendFAX '長整数(送信直前の、MSFAX履歴保存フォルダーのサイズ)
Dim MyStrWinVer, MyStrPC '文字列
Dim MyFaxServer, MyFaxDoc 'Object
Dim MyChk 'Boolean 2ヶ所で使いまわし。「履歴管理やる気ありなし」、「送信後の履歴取り込み成功失敗」
Dim MyInc '長整数(ループカウンター)
Dim MyAllFiles, MyFile 'Object
Dim MyDT '日付
Dim MyStrMSFaxLatestFile, MyStrExt, MyStrNewSaveDir, MyStrNewSaveFile '文字列
On Error Resume Next 'どんなエラーが出ても前へ前へ、突き進め
Set MyArgs = WScript.Arguments
MyStrSendFile = MyArgs(0) 'DragDropされたファイルのフルパス取得
Set MyArgs = Nothing
If MyStrSendFile = "" Then
MsgBox "何かファイルをDragDropしろって", vbOKOnly, "ダブルクリックじゃなく"
WScript.Quit
End If
MyStrThisVBSFullPath = WScript.ScriptFullName
MyStrFAXNum = Left(Right(MyStrThisVBSFullPath, 14), 10)
If IsNumeric(MyStrFAXNum) = False Then
MsgBox "数字以外の文字が入ったFAXナンバーなんて絶対変"
WScript.Quit
End If
MyChk = False '履歴管理をする気があるかどうか判定
If MSFAXHAKIDAME <> "" Then '空文字じゃないなら見込みあり
Set MyFSO = CreateObject("Scripting.FileSystemObject")
If MyFSO.FolderExists(MSFAXHAKIDAME) = True Then 'それが確かに存在するフォルダなら「やる気あり」で決定
Set MyFolder = MyFSO.GetFolder(MSFAXHAKIDAME)
MyFSizeBeforeSendFAX = MyFolder.Size '送信前の、MSFAX掃き溜めフォルダのサイズ
MyChk = True
Else
Set MyFSO = Nothing
End If
End If
MyStrWinVer = CreateObject("Wscript.Shell").RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
MyStrPC = CreateObject("WScript.Network").ComputerName
If MyStrWinVer = "5.0" Then
Set MyFaxServer = CreateObject("FaxServer.FaxServer")
MyFaxServer.Connect MyStrPC
Set MyFaxDoc = MyFaxServer.CreateDocument("FaxDocument")
MyFaxDoc.filename = MyStrSendFile
MyFaxDoc.FaxNumber = MyStrFAXNum
MyFaxDoc.Send
MyFaxServer.Disconnect
Else
Set MyFaxServer = CreateObject("FAXCOMEX.FaxServer")
MyFaxServer.Connect MyStrPC
Set MyFaxDoc = CreateObject("FAXCOMEX.FaxDocument")
MyFaxDoc.Recipients.Add MyStrFAXNum
MyFaxDoc.Body = MyStrSendFile
MyFaxDoc.ConnectedSubmit MyFaxServer
MyFaxServer.Disconnect
End If
Set MyFaxDoc = Nothing
Set MyFaxServer = Nothing
'「履歴管理やる気あり」の場合、FAX起動でコケても次のループ処理には入っちゃう(On Error Resume Next)
'どうせ見えないところでこそこそ動いているだけだし、時間がくれば勝手に終わるんだし、放っておいても大した害はないような気がする(たぶん)
If MyChk = False Then
'履歴管理やる気なしならここでおしまい
WScript.Quit
End If
MyChk = False '送信後の履歴取り込み成功失敗判定
For MyInc = 1 To CLOOPCNT
WScript.Sleep (5000) '5秒おきにMSFAX掃き溜めフォルダのサイズをはかる
If MyFolder.Size > MyFSizeBeforeSendFAX Then '送信前よりサイズが増えていたらそれは送信完了の証
MyDT = Date - 10000 '←初期値は古ければ何でもいい
Set MyAllFiles = MyFolder.Files
For Each MyFile In MyAllFiles
If MyFile.DateCreated > MyDT Then
MyDT = MyFile.DateCreated
MyStrMSFaxLatestFile = MyFile.Path
End If
'掃き溜め中いちばん新しいファイルを取得
Next
Set MyAllFiles = Nothing
Set MyFile = Nothing
MyStrExt = MyFSO.GetExtensionName(MyStrMSFaxLatestFile) '拡張子取得
MyStrNewSaveDir = Left(MyStrThisVBSFullPath, Len(MyStrThisVBSFullPath) - 4)
If MyFSO.FolderExists(MyStrNewSaveDir) = False Then '履歴保存用として分かりやすい場所を用意
MyFSO.CreateFolder (MyStrNewSaveDir)
End If
MyStrNewSaveFile = MyStrNewSaveDir & "\" & _
Replace(Replace(Replace(FormatDateTime(Now, 0), "/", "-"), ":", "-"), " ", "-") & _
"." & MyStrExt
'履歴ファイルとして分かりやすい名前をつけたうえ、用意した分かりやすい場所に、MSFAXの掃き溜めからコピー
MyFSO.CopyFile MyStrMSFaxLatestFile, MyStrNewSaveFile
MyChk = True '履歴取り込み完了
Exit For
End If
Next
Set MyFolder = Nothing
Set MyFSO = Nothing
If MyChk = True Then
MsgBox "完了"
Else
'コードのアタマのほうで、CLOOPCNTはとりあえず100にしてある(もちろん設定は自由)
'フォルダサイズ測定5秒おきに100回やって、それでもTrueが得られなかったら失敗のメッセージ出しちゃっていいんじゃね?
MsgBox "失敗"
End If
Option Explicit以下↑まで全部コピーしてメモ帳に貼り付けたうえ、"XXXX0123456789.vbs" の形の名前で保存。
さて次に考えるべきは、中身が全部一緒で名前だけが違うファイルばかりがぞろっとあるこの手のソフト(これをソフトと呼ぶか?)で、変更の必要が生じたらどうすればいいのか、ということ。
"C:\Documents and Settings\All Users\Documents\My Faxes\Sent Faxes" を "C:\Documents and Settings\All Users\Application Data\Microsoft\Windows NT\MSFax\SentItems" に書き換えたいとか、擬似タイマーのループカウントを100じゃなく200にしたいとか。
そういう事態が生じると、人間のデキが問われているような気分になりますね。
(1)VBSファイルが何十個あろうが一つずつ地道に書き換える。
(2)自動で一気に書き換える方法を考える。
(3)もう面倒だからFAXなんて使うのやめちゃおうかと考える。
社会人としていちばんまともなのはいうまでもなく(3)のタイプです。
ファックスなんて時代遅れのシステム相手にこれ以上無駄な時間を費やすのは馬鹿げています。
同じ理由で、いちばんダメな人間ってのはたぶん(2)のタイプです。
ファイルが数十個程度で、よほど細かい修正じゃなければ、きっと(1)のほうが速い。
個人的には、何となく(2)を支持したい気分です。
文字列を指定したうえ、この文字列を見つけたら片っ端からこんなふうに書き換えろ、みたいな方法でもいいんですが、場合によっては違うやり方を選んだほうがいいかもしれません。
どのファイルも中身は一緒と考えると、書き換えの繰り返し処理ってのは何だか野暮ったい。
見本となる種ファイル一個用意して、そこからクローン増殖させる、みたいなやり方のほうが気分はいいんじゃないでしょうか。
ただ増殖型の方法だと、プログラムとしては殆ど応用が利きません。
たぶんこのケースでしか使えない。
見つけしだい片っ端から書き換え型のほうは、ちょっと条件を変えればいろんなケースで使えそうです。
あと、処理速度なんてことを問題にする人はそんなにいないと思いますけど、量が膨大になった場合はどう考えてもクローン増殖型のほうが速いはずです(バカバカしくて実験する気にはなれない)
文字列検索なんてしないまま問答無用で種ファイルの中身を押し込んでいくわけですから。
以下、見つけしだい片っ端から書き換え型。
書き換えたいファイル群と同じフォルダ内に置いてダブルクリックすると、「自分以外の」全てのvbsファイルの中身を書き換えます。
BEFORE_RP と AFTER_RP に適当な文字列を突っ込んで使ってください。
If LCase(Right(strFPath, 4)) = ".vbs" Then のところは、".txt" でも ".htm" でも、要はvbsに限らずテキストファイルなら何でもOK。
Option Explicit
Const BEFORE_RP = "この文字列を書き換えたい"
Const AFTER_RP = "こんなふうに書き換えたい"
Dim MyFSO, MyFolder, MyALLFiles, MyFile
Dim MyStrCurrDir, MyStrThisVBSFull, MyStrThisVBSName
MyStrThisVBSFull = WScript.ScriptFullName
MyStrThisVBSName = WScript.ScriptName
MyStrCurrDir = Replace(MyStrThisVBSFull, MyStrThisVBSName, "")
MyStrCurrDir = Left(MyStrCurrDir, Len(MyStrCurrDir) - 1)
Set MyFSO = CreateObject("Scripting.FileSystemObject")
Set MyFolder = MyFSO.GetFolder(MyStrCurrDir)
Set MyALLFiles = MyFolder.Files
For Each MyFile In MyALLFiles
If MyFile.Path <> MyStrThisVBSFull Then
Call RpTXT(MyFSO, MyFile.Path, BEFORE_RP, AFTER_RP)
End If
Next
Set MyFile = Nothing
Set MyALLFiles = Nothing
Set MyFolder = Nothing
Set MyFSO = Nothing
MsgBox "完了"
WScript.Quit
Sub RpTXT(objFSO, strFPath, strBeforeRp, strAfterRp)
Dim MyTXTFILE
Dim MyStrALL
If LCase(Right(strFPath, 4)) = ".vbs" Then
Set MyTXTFILE = objFSO.OpenTextFile(strFPath, 1)
MyStrALL = MyTXTFILE.ReadAll
MyTXTFILE.Close
Set MyTXTFILE = Nothing
MyStrALL = Replace(MyStrALL, strBeforeRp, strAfterRp)
Set MyTXTFILE = objFSO.CreateTextFile(strFPath, True)
MyTXTFILE.Write MyStrALL
MyTXTFILE.Close
Set MyTXTFILE = Nothing
End If
End Sub
以下、クローン増殖型。
書き換えたいファイル群と同じフォルダ内に置いて、見本となる種ファイルをDragDropしてください(種ファイルはべつに同フォルダ内じゃなくても)
Option Explicit
Dim MyStrSrcFile, MyStrALL, MyStrThisVBSFull, MyStrCurrDir, MyStrFile
Dim MyArgs, MyFSO, MyTXTFILE, MyFolder, MyALLFiles, MyFile
On Error Resume Next
Set MyArgs = WScript.Arguments
MyStrSrcFile = MyArgs(0)
Set MyArgs = Nothing
If MyStrSrcFile = "" Then
MsgBox "種ファイルをDragDropしろって", vbOKOnly, "ダブルクリックじゃなく"
WScript.Quit
End If
Set MyFSO = CreateObject("Scripting.FileSystemObject")
Set MyTXTFILE = MyFSO.OpenTextFile(MyStrSrcFile, 1)
MyStrALL = MyTXTFILE.ReadAll
MyTXTFILE.Close
Set MyTXTFILE = Nothing
MyStrThisVBSFull = WScript.ScriptFullName
MyStrCurrDir = Replace(MyStrThisVBSFull, WScript.ScriptName, "")
MyStrCurrDir = Left(MyStrCurrDir, Len(MyStrCurrDir) - 1)
Set MyFolder = MyFSO.GetFolder(MyStrCurrDir)
Set MyALLFiles = MyFolder.Files
For Each MyFile In MyALLFiles
MyStrFile = MyFile.Path
If LCase(Right(MyStrFile, 4)) = ".vbs" Then
If (MyStrFile <> MyStrThisVBSFull) And (MyStrFile <> MyStrSrcFile) Then
Set MyTXTFILE = MyFSO.CreateTextFile(MyStrFile, True)
MyTXTFILE.Write MyStrALL
MyTXTFILE.Close
Set MyTXTFILE = Nothing
End If
End If
Next
Set MyFile = Nothing
Set MyALLFiles = Nothing
Set MyFolder = Nothing
Set MyFSO = Nothing
MsgBox "完了"
-