質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

Q&A

解決済

1回答

3357閲覧

「webページからのメッセージ」「OK」クリック方法

toyosu25API

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

0グッド

0クリップ

投稿2021/07/09 08:04

VBAでframeタグを使ったwebページの「検索」ボタンをJavascriptからクリックして「webページからのメッセージ」ダイアログを表示させ、
「OK」をクリックしたい。

<html> ~省略~ <frame name="kensaku" src=ppl-87-01.asp" > ~省略~ <td rowspan="1" colspan="1"> <p> <input name="処理" onclixk="KAKUNIN()" type="submit" value="検索"/>

Set objFrame = htmlDoc.frames("kensaku")
Set objTag = objFrame.document.getElementsByName("処理")
For i = 0 To objTag.Length - 1
If objTag(i).Value = "検索" Then
objFrame.document.Script.setTimeout "javascript:objFrame.document.getElementsByName('処理')(" & i & ").click()", 200 '←①ここで「検索」ボタンが押せない!!
Sleep 2000 '「Webページからのメッセージ」が表示されるのを待つ
hwnd = FindWindow("#32770", "Web ページからのメッセージ")
If hwnd <> 0 Then
PostMessage hwnd, WM_COMMAND, vbOK, 0& '←②ここで「OK」がクリックできない!!

①でJavaScriptから「検索」ボタンをクリックしたいが、できない。
ちなみに、 objtag(i).click だとクリックできるが、vbから制御ができなくなる。
②手動で、「検索」をクリック後 hwndは取得できるが、②で「OK」がクリックできない。

上記①、②を解決する方法をご存じありませんか。
ちなみに、frameタグを使わない画面では、上記と同様な処理は問題なく動きます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①ですが、私の経験上、クリック後はVBAの制御が外れており、VBAでは解決できないように思いました。

VBAからVBScriptを呼出し、VBScriptからIE操作してダイアログ表示させ、VBAで待機時間を入れて「OK」クリックするといったマルチスレッドを実装する必要がありそうです。

参考QA
https://teratail.com/questions/253981?link=qa_related_pc

<追記>
①②ともに、VBAからの「OK」クリックは、WinAPIを使用します。
参考までに私が使っているコードを紹介します。

VBA

1'(WinAPI宣言部は省略) 2Public Sub OK_Click() 'クリック 3 hWindow = FindWindow("#32770", "Web ページからのメッセージ") 4 If hWindow <> 0& Then 5 Call OK_Button 6 End If 7End Sub 8 9Private Sub OK_Button() 10 hButton = FindWindowEx(hWindow, 0&, "Button", "OK") 11 Do Until IsWindowEnabled(hButton) = 1 12 If hButton = 0& Then 13 Debug.Print "OKボタン喪失:VBA継続" 14 Exit Sub 15 End If 16 Loop 17 Call SendMessage(hButton, &H6, 1, 0&) 'ボタンをアクティブにする 18 Call SendMessage(hButton, &HF5, 0, 0&) 'ボタンをクリックする 19End Sub

<追記2>
VBScript起動から終了とOKボタンクリックのコードです。

VBA

1'(WinAPI宣言部は省略) 2 '★VBScriptを起動 3 TaskId = Shell("WScript.exe " & ThisWorkbook.Path & """\IEbotton.vbs""") 4 timeOut = Now + TimeSerial(0, 0, 10) 5 Do 6 If ie.Busy = True Then '★VBScriptタイヤログ操作成功時Trueとなる 7 Sleep 500 8 'VBScriptの処理を強制終了 9 hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId) 10 If hProc <> 0& Then 'プロセスハンドルが返されたかを判定 11 Call CloseHandle(hProc) 'プロセスクローズ 12 End If 13 Call OK_Click 'クリック 14 Exit Do 15 End If 16 If Now > timeOut Then End '★VBScriptタイヤログ操作失敗と判断 17 Sleep 100 18 Loop

<追記3>
IE操作してダイアログ表示させる IEbotton.vbs のコードです。

VBScript

1'同一フォルダに`~.vbs`という名前でテキストファイルを作成し、以下のコードを記述して保存しておく。 2'文字のエンコーディングはShift_JISまたはUnicode(UTF16LE)であること。 3Option Explicit 4 5Private Const TIME_MINIMUMWAIT = 1500 6Private Const TIME_MAXIMUMWAIT = 3000 7 8Call Main 9 10Public Sub Main() 11 Dim cnt 'As Long 12 Dim objW 'As Object 13 Dim sWindowName 'As String 14 15 For Cnt = WScript.CreateObject("Shell.Application").Windows.Count To 1 Step -1 16 Set objW = WScript.CreateObject("Shell.Application").Windows(cnt - 1) 17 18 If objW Is Nothing Then 19 Else 20 sWindowName = "" 21 On Error Resume Next 22 sWindowName = objW.FullName 23 On Error GoTo 0 24 25 If LCase(Right(sWindowName, 12)) = "iexplore.exe" Then 26 If InStr(objW.document.Title, "★操作したいIEページタイトル★") > 0 Then 27 Call Sousa(objW) 28 End If 29 End If 30 End If 31 Next 32 Set objW = Nothing 33 Set Debug = Nothing 34 Set Logger = Nothing 35End Sub 36 37Private Sub Sousa(ByRef ie) 38 Dim objTag 'IHTMLElementCollectionオブジェクト 39 For Each objTag In ie.document.getElementsByTagName("input") 40 If InStr(objTag.outerHTML, "★ボタン名★") > 0 Then 41 objTag.Click 'ボタンクリック 42 'タイヤログ操作成功時にVBScriptが制御不可。VBAは ie.Busy = True が成立。 43 Exit Sub 44 End If 45 Next 46End Sub 47 48Private Sub IENavigate(ByRef ie, ByVal url) 49 ie.Visible = True 50 ie.navigate url 51 Call IEWaitReady(ie) 52 Call IEWaitRandom 53End Sub 54 55Private Sub IEWaitReady(ByRef ie) 56 Dim RepeatSec 57 RepeatSec = Timer 58 Do While ie.Busy = True Or ie.readyState < 4 59 WScript.Sleep 200 60 If (Timer - RepeatSec) > 30 Then 61 If ie.readyState = 4 Then 62 Exit Do 63 Else 64 MsgBox "サーバーが応答していません。" 65 ie.Quit 66 End If 67 End If 68 Loop 69 70 RepeatSec = Timer 71 Do While ie.document.readyState <> "complete" 72 WScript.Sleep 200 73 If (Timer - RepeatSec) > 5 Then 74 Exit Do 75 End If 76 Loop 77End Sub 78 79Private Sub IEWaitRandom() 80 Dim milliseconds 81 milliseconds = -1 82 Do While milliseconds < TIME_MINIMUMWAIT 83 milliseconds = Int(Rnd * TIME_MAXIMUMWAIT) 84 Loop 85 WScript.Sleep milliseconds 86End Sub

投稿2021/07/09 11:40

編集2021/07/13 09:29
TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toyosu25API

2021/07/12 01:54

回答ありがとうございます。 ScriptからIE操作を行うため、①の記述を行っています。 <VBA>①の記述 objFrame.document.Script.setTimeout "javascript:objFrame.document.getElementsByName('処理')(" & i & ").click()", 200 しかし、この記述ではIEを制御できませんでした。 この解決法をご教授頂きたいと思います。 ちなみに、参考としてご提示いただいたコードは、②の"webページからのメッセージ"ダイアログ表示後の処理だと思います。 最初の説明がよくありませんでしたが、①を何とかしたい。 ①がうまくいけば、②は現状のやり方もしくは、参考としてご提示いただいたコードで解決するのではないかと思っています。 よろしくお願いいたします。
TanakaHiroaki

2021/07/12 12:58 編集

困り具合がわかりました。 繰り返しになりますが、javascriptで解決できない場合、マルチスレッドの実装が必要です。 私の場合、以下を実装して解決することができましたが、問題発生から解決までに約2年費やしました。 Ⅰ.VBAから非同期でVBScriptを起動し、VBScriptからIE操作してダイアログ表示 Ⅱ.VBScriptプロセス強制終了 Ⅲ.VBAからOKボタンクリック
toyosu25API

2021/07/13 05:45

回答ありがとうございます。 追記2でご提示頂いたコードを試してみました。 If ie.Busy = True Then    ・・・この条件が成立せず(falseのまま)タイムアウトとなり、先に進めません。 変数の ie は属性は object でしょうか。 事前に何かsetは必要でしょうか。 大変恐縮ですが、少し解説をお願いします。
TanakaHiroaki

2021/07/13 09:24

VBAのieはobject です。VBScriptのコードを追記3に示します。
toyosu25API

2021/07/15 02:51

ご提示頂いたコードを参考に対応したところ、問題解決いたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問