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

回答編集履歴

8

追記3のコードスリム化

2021/07/13 09:29

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -91,15 +91,12 @@
91
91
  End Sub
92
92
 
93
93
  Private Sub Sousa(ByRef ie)
94
- Dim htmlDoc
95
- Set htmlDoc = ie.document 'objIEで読み込まれているHTMLドキュメントをセット
96
-
97
94
  Dim objTag 'IHTMLElementCollectionオブジェクト
98
- For Each objTag In htmlDoc.getElementsByTagName("input")
95
+ For Each objTag In ie.document.getElementsByTagName("input")
99
96
  If InStr(objTag.outerHTML, "★ボタン名★") > 0 Then
100
97
  objTag.Click 'ボタンクリック
101
98
  'タイヤログ操作成功時にVBScriptが制御不可。VBAは ie.Busy = True が成立。
102
- Exit Function
99
+ Exit Sub
103
100
  End If
104
101
  Next
105
102
  End Sub

7

誤記再修正

2021/07/13 09:29

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -118,7 +118,6 @@
118
118
  WScript.Sleep 200
119
119
  If (Timer - RepeatSec) > 30 Then
120
120
  If ie.readyState = 4 Then
121
- OutputWarn "IE Busy In vbs.IEWaitReady"
122
121
  Exit Do
123
122
  Else
124
123
  MsgBox "サーバーが応答していません。"

6

誤記修正

2021/07/13 09:20

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -51,7 +51,7 @@
51
51
  Sleep 100
52
52
  Loop
53
53
  ```
54
- <追記
54
+ <追記
55
55
  IE操作してダイアログ表示させる IEbotton.vbs のコードです。
56
56
  ```VBScript
57
57
  '同一フォルダに`~.vbs`という名前でテキストファイルを作成し、以下のコードを記述して保存しておく。

5

VBScriptのコード追加

2021/07/13 09:17

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -50,4 +50,98 @@
50
50
  If Now > timeOut Then End '★VBScriptタイヤログ操作失敗と判断
51
51
  Sleep 100
52
52
  Loop
53
+ ```
54
+ <追記2>
55
+ IE操作してダイアログ表示させる IEbotton.vbs のコードです。
56
+ ```VBScript
57
+ '同一フォルダに`~.vbs`という名前でテキストファイルを作成し、以下のコードを記述して保存しておく。
58
+ '文字のエンコーディングはShift_JISまたはUnicode(UTF16LE)であること。
59
+ Option Explicit
60
+
61
+ Private Const TIME_MINIMUMWAIT = 1500
62
+ Private Const TIME_MAXIMUMWAIT = 3000
63
+
64
+ Call Main
65
+
66
+ Public Sub Main()
67
+ Dim cnt 'As Long
68
+ Dim objW 'As Object
69
+ Dim sWindowName 'As String
70
+
71
+ For Cnt = WScript.CreateObject("Shell.Application").Windows.Count To 1 Step -1
72
+ Set objW = WScript.CreateObject("Shell.Application").Windows(cnt - 1)
73
+
74
+ If objW Is Nothing Then
75
+ Else
76
+ sWindowName = ""
77
+ On Error Resume Next
78
+ sWindowName = objW.FullName
79
+ On Error GoTo 0
80
+
81
+ If LCase(Right(sWindowName, 12)) = "iexplore.exe" Then
82
+ If InStr(objW.document.Title, "★操作したいIEページタイトル★") > 0 Then
83
+ Call Sousa(objW)
84
+ End If
85
+ End If
86
+ End If
87
+ Next
88
+ Set objW = Nothing
89
+ Set Debug = Nothing
90
+ Set Logger = Nothing
91
+ End Sub
92
+
93
+ Private Sub Sousa(ByRef ie)
94
+ Dim htmlDoc
95
+ Set htmlDoc = ie.document 'objIEで読み込まれているHTMLドキュメントをセット
96
+
97
+ Dim objTag 'IHTMLElementCollectionオブジェクト
98
+ For Each objTag In htmlDoc.getElementsByTagName("input")
99
+ If InStr(objTag.outerHTML, "★ボタン名★") > 0 Then
100
+ objTag.Click 'ボタンクリック
101
+ 'タイヤログ操作成功時にVBScriptが制御不可。VBAは ie.Busy = True が成立。
102
+ Exit Function
103
+ End If
104
+ Next
105
+ End Sub
106
+
107
+ Private Sub IENavigate(ByRef ie, ByVal url)
108
+ ie.Visible = True
109
+ ie.navigate url
110
+ Call IEWaitReady(ie)
111
+ Call IEWaitRandom
112
+ End Sub
113
+
114
+ Private Sub IEWaitReady(ByRef ie)
115
+ Dim RepeatSec
116
+ RepeatSec = Timer
117
+ Do While ie.Busy = True Or ie.readyState < 4
118
+ WScript.Sleep 200
119
+ If (Timer - RepeatSec) > 30 Then
120
+ If ie.readyState = 4 Then
121
+ OutputWarn "IE Busy In vbs.IEWaitReady"
122
+ Exit Do
123
+ Else
124
+ MsgBox "サーバーが応答していません。"
125
+ ie.Quit
126
+ End If
127
+ End If
128
+ Loop
129
+
130
+ RepeatSec = Timer
131
+ Do While ie.document.readyState <> "complete"
132
+ WScript.Sleep 200
133
+ If (Timer - RepeatSec) > 5 Then
134
+ Exit Do
135
+ End If
136
+ Loop
137
+ End Sub
138
+
139
+ Private Sub IEWaitRandom()
140
+ Dim milliseconds
141
+ milliseconds = -1
142
+ Do While milliseconds < TIME_MINIMUMWAIT
143
+ milliseconds = Int(Rnd * TIME_MAXIMUMWAIT)
144
+ Loop
145
+ WScript.Sleep milliseconds
146
+ End Sub
53
147
  ```

4

誤記修正

2021/07/13 09:16

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -37,7 +37,7 @@
37
37
  TaskId = Shell("WScript.exe " & ThisWorkbook.Path & """\IEbotton.vbs""")
38
38
  timeOut = Now + TimeSerial(0, 0, 10)
39
39
  Do
40
- If ie.Busy = True Then '★VBScriptによるタイヤログ操作成功時True
40
+ If ie.Busy = True Then '★VBScriptタイヤログ操作成功時Trueとなる
41
41
  Sleep 500
42
42
  'VBScriptの処理を強制終了
43
43
  hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId)
@@ -47,7 +47,7 @@
47
47
  Call OK_Click 'クリック
48
48
  Exit Do
49
49
  End If
50
- If Now > timeOut Then End '★VBScriptによるによるタイヤログ操作失敗
50
+ If Now > timeOut Then End '★VBScriptタイヤログ操作失敗と判断
51
51
  Sleep 100
52
52
  Loop
53
53
  ```

3

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

2021/07/12 13:08

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -41,8 +41,8 @@
41
41
  Sleep 500
42
42
  'VBScriptの処理を強制終了
43
43
  hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId)
44
- If hProc <> 0& Then 'プロセスハンドルが返されたかを判定
44
+ If hProc <> 0& Then 'プロセスハンドルが返されたかを判定
45
- CloseHandle hProc 'プロセスクローズ
45
+ Call CloseHandle(hProc) 'プロセスクローズ
46
46
  End If
47
47
  Call OK_Click 'クリック
48
48
  Exit Do

2

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

2021/07/12 13:05

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -28,4 +28,26 @@
28
28
  Call SendMessage(hButton, &H6, 1, 0&) 'ボタンをアクティブにする
29
29
  Call SendMessage(hButton, &HF5, 0, 0&) 'ボタンをクリックする
30
30
  End Sub
31
+ ```
32
+ <追記2>
33
+ VBScript起動から終了とOKボタンクリックのコードです。
34
+ ```VBA
35
+ '(WinAPI宣言部は省略)
36
+ '★VBScriptを起動
37
+ TaskId = Shell("WScript.exe " & ThisWorkbook.Path & """\IEbotton.vbs""")
38
+ timeOut = Now + TimeSerial(0, 0, 10)
39
+ Do
40
+ If ie.Busy = True Then '★VBScriptによるタイヤログ操作成功時にTrue
41
+ Sleep 500
42
+ 'VBScriptの処理を強制終了
43
+ hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId)
44
+ If hProc <> 0& Then 'プロセスハンドルが返されたかを判定
45
+ CloseHandle hProc 'プロセスクローズ
46
+ End If
47
+ Call OK_Click 'クリック
48
+ Exit Do
49
+ End If
50
+ If Now > timeOut Then End '★VBScriptによるによるタイヤログ操作失敗
51
+ Sleep 100
52
+ Loop
31
53
  ```

1

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

2021/07/12 12:53

投稿

TanakaHiroaki
TanakaHiroaki

スコア1065

answer CHANGED
@@ -3,4 +3,29 @@
3
3
  VBAからVBScriptを呼出し、VBScriptからIE操作してダイアログ表示させ、VBAで待機時間を入れて「OK」クリックするといったマルチスレッドを実装する必要がありそうです。
4
4
 
5
5
  参考QA
6
- https://teratail.com/questions/253981?link=qa_related_pc
6
+ https://teratail.com/questions/253981?link=qa_related_pc
7
+
8
+ <追記>
9
+ ①②ともに、VBAからの「OK」クリックは、WinAPIを使用します。
10
+ 参考までに私が使っているコードを紹介します。
11
+ ```VBA
12
+ '(WinAPI宣言部は省略)
13
+ Public Sub OK_Click() 'クリック
14
+ hWindow = FindWindow("#32770", "Web ページからのメッセージ")
15
+ If hWindow <> 0& Then
16
+ Call OK_Button
17
+ End If
18
+ End Sub
19
+
20
+ Private Sub OK_Button()
21
+ hButton = FindWindowEx(hWindow, 0&, "Button", "OK")
22
+ Do Until IsWindowEnabled(hButton) = 1
23
+ If hButton = 0& Then
24
+ Debug.Print "OKボタン喪失:VBA継続"
25
+ Exit Sub
26
+ End If
27
+ Loop
28
+ Call SendMessage(hButton, &H6, 1, 0&) 'ボタンをアクティブにする
29
+ Call SendMessage(hButton, &HF5, 0, 0&) 'ボタンをクリックする
30
+ End Sub
31
+ ```