回答編集履歴

8

追記3のコードスリム化

2021/07/13 09:29

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -184,15 +184,9 @@
184
184
 
185
185
  Private Sub Sousa(ByRef ie)
186
186
 
187
- Dim htmlDoc
188
-
189
- Set htmlDoc = ie.document 'objIEで読み込まれているHTMLドキュメントをセット
190
-
191
-
192
-
193
187
  Dim objTag 'IHTMLElementCollectionオブジェクト
194
188
 
195
- For Each objTag In htmlDoc.getElementsByTagName("input")
189
+ For Each objTag In ie.document.getElementsByTagName("input")
196
190
 
197
191
  If InStr(objTag.outerHTML, "★ボタン名★") > 0 Then
198
192
 
@@ -200,7 +194,7 @@
200
194
 
201
195
  'タイヤログ操作成功時にVBScriptが制御不可。VBAは ie.Busy = True が成立。
202
196
 
203
- Exit Function
197
+ Exit Sub
204
198
 
205
199
  End If
206
200
 

7

誤記再修正

2021/07/13 09:29

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -238,8 +238,6 @@
238
238
 
239
239
  If ie.readyState = 4 Then
240
240
 
241
- OutputWarn "IE Busy In vbs.IEWaitReady"
242
-
243
241
  Exit Do
244
242
 
245
243
  Else

6

誤記修正

2021/07/13 09:20

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -104,7 +104,7 @@
104
104
 
105
105
  ```
106
106
 
107
- <追記
107
+ <追記
108
108
 
109
109
  IE操作してダイアログ表示させる IEbotton.vbs のコードです。
110
110
 

5

VBScriptのコード追加

2021/07/13 09:17

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -103,3 +103,191 @@
103
103
  Loop
104
104
 
105
105
  ```
106
+
107
+ <追記2>
108
+
109
+ IE操作してダイアログ表示させる IEbotton.vbs のコードです。
110
+
111
+ ```VBScript
112
+
113
+ '同一フォルダに`~.vbs`という名前でテキストファイルを作成し、以下のコードを記述して保存しておく。
114
+
115
+ '文字のエンコーディングはShift_JISまたはUnicode(UTF16LE)であること。
116
+
117
+ Option Explicit
118
+
119
+
120
+
121
+ Private Const TIME_MINIMUMWAIT = 1500
122
+
123
+ Private Const TIME_MAXIMUMWAIT = 3000
124
+
125
+
126
+
127
+ Call Main
128
+
129
+
130
+
131
+ Public Sub Main()
132
+
133
+ Dim cnt 'As Long
134
+
135
+ Dim objW 'As Object
136
+
137
+ Dim sWindowName 'As String
138
+
139
+
140
+
141
+ For Cnt = WScript.CreateObject("Shell.Application").Windows.Count To 1 Step -1
142
+
143
+ Set objW = WScript.CreateObject("Shell.Application").Windows(cnt - 1)
144
+
145
+
146
+
147
+ If objW Is Nothing Then
148
+
149
+ Else
150
+
151
+ sWindowName = ""
152
+
153
+ On Error Resume Next
154
+
155
+ sWindowName = objW.FullName
156
+
157
+ On Error GoTo 0
158
+
159
+
160
+
161
+ If LCase(Right(sWindowName, 12)) = "iexplore.exe" Then
162
+
163
+ If InStr(objW.document.Title, "★操作したいIEページタイトル★") > 0 Then
164
+
165
+ Call Sousa(objW)
166
+
167
+ End If
168
+
169
+ End If
170
+
171
+ End If
172
+
173
+ Next
174
+
175
+ Set objW = Nothing
176
+
177
+ Set Debug = Nothing
178
+
179
+ Set Logger = Nothing
180
+
181
+ End Sub
182
+
183
+
184
+
185
+ Private Sub Sousa(ByRef ie)
186
+
187
+ Dim htmlDoc
188
+
189
+ Set htmlDoc = ie.document 'objIEで読み込まれているHTMLドキュメントをセット
190
+
191
+
192
+
193
+ Dim objTag 'IHTMLElementCollectionオブジェクト
194
+
195
+ For Each objTag In htmlDoc.getElementsByTagName("input")
196
+
197
+ If InStr(objTag.outerHTML, "★ボタン名★") > 0 Then
198
+
199
+ objTag.Click 'ボタンクリック
200
+
201
+ 'タイヤログ操作成功時にVBScriptが制御不可。VBAは ie.Busy = True が成立。
202
+
203
+ Exit Function
204
+
205
+ End If
206
+
207
+ Next
208
+
209
+ End Sub
210
+
211
+
212
+
213
+ Private Sub IENavigate(ByRef ie, ByVal url)
214
+
215
+ ie.Visible = True
216
+
217
+ ie.navigate url
218
+
219
+ Call IEWaitReady(ie)
220
+
221
+ Call IEWaitRandom
222
+
223
+ End Sub
224
+
225
+
226
+
227
+ Private Sub IEWaitReady(ByRef ie)
228
+
229
+ Dim RepeatSec
230
+
231
+ RepeatSec = Timer
232
+
233
+ Do While ie.Busy = True Or ie.readyState < 4
234
+
235
+ WScript.Sleep 200
236
+
237
+ If (Timer - RepeatSec) > 30 Then
238
+
239
+ If ie.readyState = 4 Then
240
+
241
+ OutputWarn "IE Busy In vbs.IEWaitReady"
242
+
243
+ Exit Do
244
+
245
+ Else
246
+
247
+ MsgBox "サーバーが応答していません。"
248
+
249
+ ie.Quit
250
+
251
+ End If
252
+
253
+ End If
254
+
255
+ Loop
256
+
257
+
258
+
259
+ RepeatSec = Timer
260
+
261
+ Do While ie.document.readyState <> "complete"
262
+
263
+ WScript.Sleep 200
264
+
265
+ If (Timer - RepeatSec) > 5 Then
266
+
267
+ Exit Do
268
+
269
+ End If
270
+
271
+ Loop
272
+
273
+ End Sub
274
+
275
+
276
+
277
+ Private Sub IEWaitRandom()
278
+
279
+ Dim milliseconds
280
+
281
+ milliseconds = -1
282
+
283
+ Do While milliseconds < TIME_MINIMUMWAIT
284
+
285
+ milliseconds = Int(Rnd * TIME_MAXIMUMWAIT)
286
+
287
+ Loop
288
+
289
+ WScript.Sleep milliseconds
290
+
291
+ End Sub
292
+
293
+ ```

4

誤記修正

2021/07/13 09:16

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  Do
78
78
 
79
- If ie.Busy = True Then '★VBScriptによるタイヤログ操作成功時True
79
+ If ie.Busy = True Then '★VBScriptタイヤログ操作成功時Trueとなる
80
80
 
81
81
  Sleep 500
82
82
 
@@ -96,7 +96,7 @@
96
96
 
97
97
  End If
98
98
 
99
- If Now > timeOut Then End '★VBScriptによるによるタイヤログ操作失敗
99
+ If Now > timeOut Then End '★VBScriptタイヤログ操作失敗と判断
100
100
 
101
101
  Sleep 100
102
102
 

3

プロシージャ呼出をCallに統一

2021/07/12 13:08

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -84,9 +84,9 @@
84
84
 
85
85
  hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId)
86
86
 
87
- If hProc <> 0& Then 'プロセスハンドルが返されたかを判定
87
+ If hProc <> 0& Then 'プロセスハンドルが返されたかを判定
88
88
 
89
- CloseHandle hProc 'プロセスクローズ
89
+ Call CloseHandle(hProc) 'プロセスクローズ
90
90
 
91
91
  End If
92
92
 

2

VBScript起動から終了とOKボタンクリックのコード追加

2021/07/12 13:05

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -59,3 +59,47 @@
59
59
  End Sub
60
60
 
61
61
  ```
62
+
63
+ <追記2>
64
+
65
+ VBScript起動から終了とOKボタンクリックのコードです。
66
+
67
+ ```VBA
68
+
69
+ '(WinAPI宣言部は省略)
70
+
71
+ '★VBScriptを起動
72
+
73
+ TaskId = Shell("WScript.exe " & ThisWorkbook.Path & """\IEbotton.vbs""")
74
+
75
+ timeOut = Now + TimeSerial(0, 0, 10)
76
+
77
+ Do
78
+
79
+ If ie.Busy = True Then '★VBScriptによるタイヤログ操作成功時にTrue
80
+
81
+ Sleep 500
82
+
83
+ 'VBScriptの処理を強制終了
84
+
85
+ hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId)
86
+
87
+ If hProc <> 0& Then 'プロセスハンドルが返されたかを判定
88
+
89
+ CloseHandle hProc 'プロセスクローズ
90
+
91
+ End If
92
+
93
+ Call OK_Click 'クリック
94
+
95
+ Exit Do
96
+
97
+ End If
98
+
99
+ If Now > timeOut Then End '★VBScriptによるによるタイヤログ操作失敗
100
+
101
+ Sleep 100
102
+
103
+ Loop
104
+
105
+ ```

1

WinAPIを用いたVBAコードを追記

2021/07/12 12:53

投稿

TanakaHiroaki
TanakaHiroaki

スコア1063

test CHANGED
@@ -9,3 +9,53 @@
9
9
  参考QA
10
10
 
11
11
  https://teratail.com/questions/253981?link=qa_related_pc
12
+
13
+
14
+
15
+ <追記>
16
+
17
+ ①②ともに、VBAからの「OK」クリックは、WinAPIを使用します。
18
+
19
+ 参考までに私が使っているコードを紹介します。
20
+
21
+ ```VBA
22
+
23
+ '(WinAPI宣言部は省略)
24
+
25
+ Public Sub OK_Click() 'クリック
26
+
27
+ hWindow = FindWindow("#32770", "Web ページからのメッセージ")
28
+
29
+ If hWindow <> 0& Then
30
+
31
+ Call OK_Button
32
+
33
+ End If
34
+
35
+ End Sub
36
+
37
+
38
+
39
+ Private Sub OK_Button()
40
+
41
+ hButton = FindWindowEx(hWindow, 0&, "Button", "OK")
42
+
43
+ Do Until IsWindowEnabled(hButton) = 1
44
+
45
+ If hButton = 0& Then
46
+
47
+ Debug.Print "OKボタン喪失:VBA継続"
48
+
49
+ Exit Sub
50
+
51
+ End If
52
+
53
+ Loop
54
+
55
+ Call SendMessage(hButton, &H6, 1, 0&) 'ボタンをアクティブにする
56
+
57
+ Call SendMessage(hButton, &HF5, 0, 0&) 'ボタンをクリックする
58
+
59
+ End Sub
60
+
61
+ ```