Batch 処理について

Scarab の次の2つの機能によって Batch 処理が可能になりました。

  1. 処理の履歴を記録したテキストファイル(=履歴ファイル)を作成する機能.。
    及びそのテキストを解読して再実行する機能。

  2. コマンドラインパラメータ経由で履歴ファイル名を受け取る機能。


準備

  1. Scarab を起動し、Batch 処理したい操作について検索結果画面で、"検索結果を保存する" まで実行する。

  2. 検索結果画面で、"現状を保存" する。このとき作成されるのが履歴ファイルです。


その後、Batch プログラムでは

  1. 上で保存した履歴ファイルを読み込む


  2. 履歴ファイルの内容を変更する


  3. 変更したテキストを履歴ファイルに再保存する。

  4. Shell コマンドを発行する。その際コマンドラインパラメータとして今再保存したファイル名を添える。


これで Scarab が呼び出され、今保存し直された履歴ファイルの更新されたテキストの手順に従って、
"検索結果の保存" まで実行され、Scarab は退場します。

後は保存された検索結果を利用して下さい。

参考のため、Batch 呼出し部分のサンプルリストを添えます。
また、「テキストの、指定された部分を別のテキストに入れ替えるサブプロシージャ」のサンプルリスト等も添えます。


Option Explicit
Dim AllText$

Sub Main()
Dim RevisedResumeFileName As String, ManuscriptResumeFileName As String, AllText As String
'履歴 ファイルを探し、その中の一部を入れ替える。
' =========================================================================
Call ReadEnvironment(ManuscriptResumeFileName, AllText)
Call WordExchange(AllText, 1, " TableFileNames Left Top Height Width#a#", 1, "@A@", "満足")
' InputForm.Text1.Text = AllText
' InputForm.Show 1
RevisedResumeFileName = "D:\Basic5\MyPrograms\すからべ\ExcelCake\BatchTemp.rsm"
Call SaveEnvironment(RevisedResumeFileName, AllText)
Call ScarabCall(RevisedResumeFileName)
End
' =========================================================================
End Sub


Static Sub ReadEnvironment(ManuscriptFileName As String, AllText As String)
' 従うべき履歴ファイルを読む。
Dim OrgDirectory As String, CurrentDir As String, init As Long
Dim OrgDrive As String, CurrentDrv As String
Dim RevisedFileName As String
Dim CrLf$, LineOfText$, channel#
CrLf = Chr$(13) + Chr$(10)
AllText = ""

If ManuscriptFileName = "" Then
OrgDirectory = CurDir
' CommonDialog 使用後、今の CurDir を回復するために憶えておく。
OrgDrive = Left(OrgDirectory, 1)

If CurrentDir <> "" Then
ChDir CurrentDir ' 前回 CommonDialog を使った時の CurDir が有れば取り出す
ChDrive CurrentDrv
End If

InputForm.CommonDialog1.DialogTitle = " 状態を保存しているファイルを読む。"
InputForm.CommonDialog1.
Filter = "CSV File (*.rsm)|*.rsm" & "|すべてのファイル (*.*)|*.*|"
InputForm.CommonDialog1.ShowOpen
ManuscriptFileName = InputForm.CommonDialog1.filename
CurrentDir = CurDir ' 次回 CommonDialog を使う時のため、今の CurDir を憶えておく。
CurrentDrv = Left(CurrentDir, 1)
ChDrive OrgDrive
ChDir OrgDirectory ' Current directory を最初のに戻す。
End If

InputForm.MousePointer = 11 ' 砂時計
channel = 1
' ----------------------------------------------------------------

Do Until EOF(channel) ' ファイルからテキスト行を読み込む。行について回す。
Line Input #channel, LineOfText
AllText = AllText & LineOfText & CrLf
Loop

Close channel
' ----------------------------------------------------------------
InputForm.MousePointer = 0
End Sub


Sub WordExchange(AllText As String, M As Long, Anchor As String, N As Long, OldWord As String, NewWord As String)
' M 個目の "Anchor" フレーズから数えて、N 番目に在った OldWord を NewWord に置き換える。
Dim I As Long, j As Long, k As Long, L As Integer, M0 As Long, N0 As Long
Dim J0 As Long, J1 As Long, J2 As Long, J3 As Long, J4 As Long
Dim CrLf As String: CrLf = Chr$(13) + Chr$(10) ' 改行行送りコード
M0 = 0

If InStr(1, AllText, Anchor & ",") = 1 Or InStr(1, AllText, Anchor & CrLf) = 1 Then ' Anchor は先頭にあった。
M0 = 1
j = 1
End If

J0 = 0

Do
If M0 = M Then Exit Do
M0 = M0 + 1
j = J0 + 1
J1 = InStr(j, AllText, "," & Anchor & ",")
J2 = InStr(j, AllText, CrLf & Anchor & ",")
J3 = InStr(j, AllText, "," & Anchor & CrLf)
J4 = InStr(j, AllText, CrLf & Anchor & CrLf)
J0 = Len(AllText)
If j <= J1 Then J0 = J1
If j <= J2 And J2 < J0 Then J0 = J2
If j <= J3 And J3 < J0 Then J0 = J3
If j <= J4 And J4 < J0 Then J0 = J4
If J1 = 0 And J2 = 0 And J3 = 0 And J4 = 0 Then Exit Sub ' M0 番目の Anchor フレーズは J0 文字目から始まっている。
Loop

' MsgBox (Left(alltext, J0 - 1))

If j = 1 And N = 0 And InStr(1, AllText, OldWord) = 1 Then '入れ替えるべき OldTxt は先頭のフレーズだった。
J0 = 1
Else
N0 = 0

Do J1 = InStr(j, AllText, OldWord)
If J1 = 0 Then Exit Sub
N0 = N0 + 1
If j <= J1 And N = N0 Then Exit Do
j = J1 + 1
Loop

End If

AllText = Left(AllText, J1 - 1) & NewWord & Right(AllText, Len(AllText) - J1 - Len(OldWord) + 1)
End Sub


Static Sub SaveEnvironment(RevisedFileName As String, AllText As String) ' 更新した履歴ファイルを保存する
Dim OrgDirectory As String, CurrentDir As String, init As Long
Dim OrgDrive As String, CurrentDrv As String

If RevisedFileName = "" Then
OrgDirectory = CurDir ' CommonDialog 使用後、今の CurDir を回復するために憶えておく。
OrgDrive = Left(OrgDirectory, 1)

If CurrentDir <> "" Then
ChDir CurrentDir ' 前回 CommonDialog を使った時の CurDir が有れば取り出す
ChDrive CurrentDrv
End If

InputForm.CommonDialog1.DialogTitle = " 現状をファイルに保存する。"
InputForm.CommonDialog1.Flags = &H2
InputForm.CommonDialog1.Filter = "CSV File (*.rsm)|*.rsm" & "|すべてのファイル (*.*)|*.*|"
InputForm.CommonDialog1.ShowSave
RevisedFileName = InputForm.CommonDialog1.filename
CurrentDir = CurDir ' 次回 CommonDialog を使う時のため、今の CurDir を憶えておく。
CurrentDrv = Left(CurrentDir, 1)
ChDrive OrgDrive ChDir OrgDirectory ' Current directory を最初のに戻す。
End If

Open RevisedFileName For Output As #1
Print #1, AllText
Close #1
End Sub


Sub ScarabCall(RevisedFileName As String) ' 履歴ファイル名をコマンドラインパラメータとし、Scarab.exe を呼び出す。
Dim I As Long
ChDrive "D" ' Scarab.exe の居るドライブを Current Drive にする。
ChDir "D:\Basic5\MyPrograms\すからべ" ' Scarab.exe の居るフォルダーを Current Directory にする。
I = Shell("D:\Basic5\MyPrograms\すからべ\Scarab.exe " & RevisedFileName, 1)
End Sub