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