回答編集履歴

1

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

2018/08/11 05:30

投稿

imihito
imihito

スコア2166

test CHANGED
@@ -123,3 +123,75 @@
123
123
 
124
124
 
125
125
  プロセスの終了以外となるとPowerShell側からVBAに何か状況を問い合わせる必要があります。
126
+
127
+
128
+
129
+ ---
130
+
131
+
132
+
133
+ VBAプロシージャコールバックのサンプル(Excel用)
134
+
135
+
136
+
137
+ PowerShellを10個起動して、コールバックでそれぞれの番号をDebug.Printさせています。
138
+
139
+ `AsyncPsExecTest`を実行するとAsyncPsExecTest終了後にバラバラに結果が出力されるのがわかると思います。
140
+
141
+
142
+
143
+ ```vba
144
+
145
+ Sub CallBack(a)
146
+
147
+ Debug.Print a
148
+
149
+ End Sub
150
+
151
+
152
+
153
+ Sub AsyncPsExecTest()
154
+
155
+ Const PS_CMD_BASE = _
156
+
157
+ "PowerShell.exe -NoProfile -Command " & """" & _
158
+
159
+ "$appXl = [Runtime.InteropServices.Marshal]::BindToMoniker('{0}').Application;" & _
160
+
161
+ "$appXl.Run('{0}!CallBack' , {1} )" & """"
162
+
163
+
164
+
165
+ Debug.Print "AsyncPsExecTest Start"
166
+
167
+
168
+
169
+ Dim i As Long
170
+
171
+ For i = 1 To 10
172
+
173
+ Dim psCmd As String
174
+
175
+ psCmd = VBA.Replace(VBA.Replace( _
176
+
177
+ PS_CMD_BASE, _
178
+
179
+ "{0}", ThisWorkbook.Name), _
180
+
181
+ "{1}", i)
182
+
183
+
184
+
185
+ Dim pId As Double
186
+
187
+ pId = VBA.Shell(psCmd, vbHide)
188
+
189
+ Debug.Print "ProcessID:="; pId, i
190
+
191
+ Next i
192
+
193
+ Debug.Print "AsyncPsExecTest End"
194
+
195
+ End Sub
196
+
197
+ ```