回答編集履歴

2

試行しやすいように汎用化処理追加

2018/10/16 11:26

投稿

imihito
imihito

スコア2166

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

文言修正

2018/10/16 11:26

投稿

imihito
imihito

スコア2166

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