teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

VBAプロシージャコールバックのサンプル を追加

2018/08/11 05:30

投稿

imihito
imihito

スコア2166

answer CHANGED
@@ -60,4 +60,40 @@
60
60
  `WshShell.Run`から実行した場合は不可能ですが、`VBA.Shell`なら返り値がプロセスIDとなります。
61
61
  そのため、WMIなどを使えば該当プロセスの取得・終了ができるはずです。
62
62
 
63
- プロセスの終了以外となるとPowerShell側からVBAに何か状況を問い合わせる必要があります。
63
+ プロセスの終了以外となるとPowerShell側からVBAに何か状況を問い合わせる必要があります。
64
+
65
+ ---
66
+
67
+ VBAプロシージャコールバックのサンプル(Excel用)
68
+
69
+ PowerShellを10個起動して、コールバックでそれぞれの番号をDebug.Printさせています。
70
+ `AsyncPsExecTest`を実行するとAsyncPsExecTest終了後にバラバラに結果が出力されるのがわかると思います。
71
+
72
+ ```vba
73
+ Sub CallBack(a)
74
+ Debug.Print a
75
+ End Sub
76
+
77
+ Sub AsyncPsExecTest()
78
+ Const PS_CMD_BASE = _
79
+ "PowerShell.exe -NoProfile -Command " & """" & _
80
+ "$appXl = [Runtime.InteropServices.Marshal]::BindToMoniker('{0}').Application;" & _
81
+ "$appXl.Run('{0}!CallBack' , {1} )" & """"
82
+
83
+ Debug.Print "AsyncPsExecTest Start"
84
+
85
+ Dim i As Long
86
+ For i = 1 To 10
87
+ Dim psCmd As String
88
+ psCmd = VBA.Replace(VBA.Replace( _
89
+ PS_CMD_BASE, _
90
+ "{0}", ThisWorkbook.Name), _
91
+ "{1}", i)
92
+
93
+ Dim pId As Double
94
+ pId = VBA.Shell(psCmd, vbHide)
95
+ Debug.Print "ProcessID:="; pId, i
96
+ Next i
97
+ Debug.Print "AsyncPsExecTest End"
98
+ End Sub
99
+ ```