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

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

呼び側

画面

EXCEL_PROCESS_1

VBAソース

[vb]
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
[/vb]

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

画面

EXCEL_PROCESS_2

VBAソース

[vb]
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
[/vb]

コメント

タイトルとURLをコピーしました