EXCEL VBA エクセルから秀丸マクロを実行して、マクロ実行完了後に結果を取得したい
タイトルの通り、
エクセルから秀丸マクロを実行してマクロの実行完了後、結果を取得する方法を掲載する。(秀丸マクロでgrepした結果をファイルに保存、保存したファイルをエクセルで読み出す方法で結果を取得しています。)
この方法で外部バッチファイル等の実行待ちもできる。
◆エクセル実行画面
実行シート
結果出力シート
◆エクセル実行シートのVBAソース
Option Explicit '変数宣言絶対するマン 'シート名定義 Const cExecSheetName As String = "実行シート" Const cOutSheetName As String = "結果出力シート" '定数定義 Const cForReadin As Integer = 1 '読み取り専用でファイルを開く '実行時の入力に関する定数 Const cRows_HidemaruExe As Long = 4 '秀丸実行ファイルパス Const cRows_MacroFile As Long = 5 '秀丸マクロ格納パス Const cRows_GrepLogFileFolder = 6 'grep対象フォルダ Const cRows_GrepLogFile As Long = 7 'grep対象ファイル 'VBAから秀丸マクロを実行して処理完了待ち後に実行結果を取得する Public Sub Exec_HidemaruMacro() '各ファイルのパス取得用変数 Dim strHidemaru As String Dim strMacroFile As String Dim strLogPath As String Dim strLogFile As String 'VBA実行シートオブジェクト Dim objExecWsh As Object Set objExecWsh = ThisWorkbook.Worksheets(cExecSheetName) '秀丸の実行ファイルパス取得 strHidemaru = CStr(objExecWsh.Cells(cRows_HidemaruExe, 2).Value) 'マクロファイル格納パス取得 strMacroFile = CStr(objExecWsh.Cells(cRows_MacroFile, 2).Value) 'grep対象格納フォルダパス取得 strLogPath = CStr(objExecWsh.Cells(cRows_GrepLogFileFolder, 2).Value) 'grep対象格納ファイルパス取得 strLogFile = CStr(objExecWsh.Cells(cRows_GrepLogFile, 2).Value) '秀丸マクロ実行コマンド作成 Dim Command As String Command = """" & strHidemaru & """ /r" & " " & """" & strLogPath & "\" & strLogFile & """" Command = Command & " /x """ & strMacroFile & """" 'シェルコマンドを使用して処理完了待ちで実行 Dim wsh As Object Set wsh = CreateObject("WScript.Shell") wsh.Run Command, 0, True '---秀丸マクロ実行から実行完了待ちここまで------------------------------------ '例えば、秀丸マクロでgrepした結果をテキストファイルに保存して、その結果を取得する '出力ファイルパスを取得 Dim strGrepFile As String strGrepFile = strLogPath & "\" & "grep結果.txt" 'grep結果を保存したファイルを開く Dim objFs As Object Dim objStream As Object Dim strLine As String Dim lRow As Long Dim lColnm As Long Dim cnt As Long Set objFs = CreateObject("Scripting.FileSystemObject") If False = objFs.FileExists(strGrepFile) Then 'MsgBox "grep結果ファイルが存在しません",vbOKOnly, "エラー" Else '読み取り専用で開く Set objStream = objFs.OpenTextFile(strGrepFile, 1, 2) '出力行タイトル1行目、2行目から出力 lColnm = 1 lRow = 2 'EOFまでループ Do While objStream.AtEndOfStream <> True 'ここを一括取得や配列にすると高速化可能 '1行ずつ取得 strLine = objStream.ReadLine 'セルに値を設定 ThisWorkbook.Worksheets(cOutSheetName).Cells(lRow, lColnm).Value = strLine '出力行を次の行へカウント lRow = lRow + 1 Loop 'EOFで抜けたらファイルストリームを閉じる objStream.Close End If '後処理 '不要でもSetしたものはクリアする Set objStream = Nothing Set objFs = Nothing Set wsh = Nothing Set objExecWsh = Nothing End Sub
$search_str[0]="検索文字列"; $filename[0]="C:\\Users\\username\\Documents\\VBA\\grep結果.txt"; //起動した秀丸のハンドルを取得 //秀丸をファイル名を指定、マクロを指定して起動すると //2つウィンドウが起動してしまうため、 //ファイル名を指定して起動したウィンドウへ移動し、 //マクロを起動したウィンドウを閉じる #closehandle = hidemaruhandle(0); prevhidemaru; #HWND = hidemaruhandle(0); setactivehidemaru #HWND; closehidemaru #closehandle; localgrep $search_str[0],regular; //今開いたgrepウィンドウのハンドラを取得 //#HWND_GREP = hidemaruhandle(0); //grep結果を保存して閉じる $file = $filename[0]; saveas $file,sjis; //マクロ実行ウィンドウに戻る setactivehidemaru #HWND; //秀丸終了 exitall;
検索ログファイル(grep用ファイル.log)
ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ あああああああああ検索文字列1ああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああ検索文字列2あああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ ああああああああああああああああああああああああああああああ