EXCEL VBA エクセルから秀丸マクロを実行して、マクロ実行完了後に結果を取得したい

タイトルの通り、

エクセルから秀丸マクロを実行してマクロの実行完了後、結果を取得する方法を掲載する。(秀丸マクロでgrepした結果をファイルに保存、保存したファイルをエクセルで読み出す方法で結果を取得しています。)

この方法で外部バッチファイル等の実行待ちもできる。

 

◆エクセル実行画面

実行シート

f:id:amumukun:20210128225256p:plain

結果出力シート

f:id:amumukun:20210128225347p:plain

 

 ◆エクセル実行シートの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

秀丸マクロソース(Grep_test.mac)

$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あああああああ
ああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああ