EXCELマクロ(VBA)から、別プロセスでEXCEL(VBA)を起動しパラメータを渡して結果を取得する方法

EXCELで別EXCELワークブックにあるVBAを実行し、結果を取得します。
以下のサンプルでは、呼び側のコマンドボタンをクリックすると、別プロセスでEXCELを起動し、起動した先のA1セルに現在時刻を書き込みます。
起動したEXCEL側では、A1セルのchangeイベントが走り、B2セルの値を読み取り、1つインクリメントした値をセットします。
Changeイベントで反応するセルを変えれば、複数のパラメータを渡して起動ということも容易に出来るでしょう。

呼び側

画面

EXCEL_PROCESS_1

VBAソース

Option Explicit

Private Sub CommandButton1_Click()
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Object '独自のプロシージャを定義しているのでExcel.Sheetオブジェクトではダメ
    Dim sNowValue As String
    
    '別プロセスで動かすEXCELファイルをオープン
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.Path & ".\BackGround.xlsm")
    'xlApp.Visible = True
    Set xlSheet = xlBook.Worksheets(1)
    xlSheet.Cells(1, 1).Value = Now 'セルA1が更新されたら BackGround側の処理が走る
    
    '結果を取り出す
    sNowValue = xlSheet.Cells(2, 2).Value
    
    'xlBook.Saved = True '保存しないならこのコメントを外して、下の行をコメント化する
    xlBook.Save '保存する
    
    'EXCEL開放処理
    Set xlSheet = Nothing
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    
    'BackGround EXCELファイルから取得した値をセット
    Cells(2, 2).Value = sNowValue
End Sub

呼ばれる側のExcelファイル(VBA)

画面

EXCEL_PROCESS_2

VBAソース

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Static bExtit As Boolean
    Dim i As Integer

    If bExtit = True Then
        Exit Sub
    End If

    'A1セルかチェックする
    If Target.Row = 1 And Target.Column = 1 Then
        'Changeイベント無限ループ回避
        bExtit = True
        'セルの値を1つ増やす
        Cells(2, 2) = Cells(2, 2).Value + 1
        bExtit = False
    End If

End Sub
スポンサーリンク