回答編集履歴
2
試行しやすいように汎用化処理追加
test
CHANGED
@@ -113,3 +113,117 @@
|
|
113
113
|
|
114
114
|
|
115
115
|
外部のマクロを実行する前に上記のサンプルを実行する必要がありますが、どの程度待てば良いのかがわからないため、ちゃんと処理できる保証がありません。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
---
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
181016追記:汎用化
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
```vba
|
128
|
+
|
129
|
+
'やっていることは`SendKeysToMsgBoxSample`とほぼ同じ
|
130
|
+
|
131
|
+
Public Sub SendKeysToMsgBoxSample2()
|
132
|
+
|
133
|
+
'Enterキー送信、1000ミリ秒(1秒)待機、Excelを対象
|
134
|
+
|
135
|
+
AsyncSendKeys "{ENTER}", 1000, Excel.Application.Caption
|
136
|
+
|
137
|
+
Call MsgBox("Sample")
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
End Sub
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
'非同期SendKeys
|
148
|
+
|
149
|
+
'keyStroke:送るキー文字列
|
150
|
+
|
151
|
+
'delayMilliSec:待機ミリ秒
|
152
|
+
|
153
|
+
'appCaption:対象のウィンドウのタイトル
|
154
|
+
|
155
|
+
Public Sub AsyncSendKeys( _
|
156
|
+
|
157
|
+
keyStroke As String, _
|
158
|
+
|
159
|
+
delayMilliSec As Long, _
|
160
|
+
|
161
|
+
appCaption As String)
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
'デバッグ時は -NoExit スイッチを付けるとPowerShell側の状態を確認しやすい
|
166
|
+
|
167
|
+
'"powershell.exe -Sta -NoExit -Command " & ~
|
168
|
+
|
169
|
+
Const PsCmd = _
|
170
|
+
|
171
|
+
"powershell.exe -Sta -Command """ & _
|
172
|
+
|
173
|
+
"<# SendKeysなどを使うためのライブラリ読み込み #>" & _
|
174
|
+
|
175
|
+
"Add-Type -AssemblyName Microsoft.VisualBasic;" & _
|
176
|
+
|
177
|
+
"<# ちょっと待機(要調整) #>" & _
|
178
|
+
|
179
|
+
"Start-Sleep -Milliseconds $WaitMilliSec;" & _
|
180
|
+
|
181
|
+
"[Microsoft.VisualBasic.Interaction]::AppActivate('$Caption');" & _
|
182
|
+
|
183
|
+
"<# キー送信(VBAのSendKeysと同じ構文 #>" & _
|
184
|
+
|
185
|
+
"(New-Object -TypeName Microsoft.VisualBasic.Devices.Keyboard).SendKeys('$KeyStroke', $true);"""
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
Dim execCmd As String
|
190
|
+
|
191
|
+
execCmd = VBA.Replace(VBA.Replace(VBA.Replace(PsCmd, _
|
192
|
+
|
193
|
+
"$WaitMilliSec", delayMilliSec), _
|
194
|
+
|
195
|
+
"$Caption", appCaption), _
|
196
|
+
|
197
|
+
"$KeyStroke", keyStroke)
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
'PowerShell で非同期実行
|
202
|
+
|
203
|
+
'デバッグ時はvbHideを他のものにして、PowerShellのウィンドウが見えるようにする
|
204
|
+
|
205
|
+
Call VBA.Shell(execCmd, vbHide)
|
206
|
+
|
207
|
+
End Sub
|
208
|
+
|
209
|
+
```
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
```powershell
|
214
|
+
|
215
|
+
<# SendKeysを使うためのライブラリ読み込み #>
|
216
|
+
|
217
|
+
Add-Type -AssemblyName Microsoft.VisualBasic;
|
218
|
+
|
219
|
+
<# ちょっと待機(要調整) #>
|
220
|
+
|
221
|
+
Start-Sleep -Milliseconds $WaitSec;
|
222
|
+
|
223
|
+
[Microsoft.VisualBasic.Interaction]::AppActivate('$Caption');
|
224
|
+
|
225
|
+
<# キー送信(VBAのSendKeysと同じ構文 #>
|
226
|
+
|
227
|
+
(New-Object -TypeName Microsoft.VisualBasic.Devices.Keyboard).SendKeys('$KeyStroke', $true);
|
228
|
+
|
229
|
+
```
|
1
文言修正
test
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
VBAのほとんどの処理は、「ある命令
|
25
|
+
VBAのほとんどの処理は、「ある命令が完了したら次の命令へ進む」という同期処理です。
|
26
26
|
|
27
27
|
そのため、`MsgBox`が表示された時点で、Excel上のVBAは入力待ちとなり動作が止まります。
|
28
28
|
|