![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
盛りだくさんですみません。
ボタンを押してその後表示されたメッセージにVBAで応答したいのですが、
ボタンを押した後の制御をVBAに戻せなくて困っています。
CLICKじゃなくてjavascriptで呼んであげると応答をVBAに戻せるようなのですが、
エラーにならずに通るけど、メッセージも表示されません。
↓
objIE.Document.Script.setTimeout "javascript:ExecUp();", 1000
もう私の頭ではお手上げです。
どなたかアドバイスいただけると助かります。
よろしくお願いします!
ボタンのソース>------------------------------------------------------------
<INPUT TYPE=BUTTON
VALUE="更新"
NAME="btnUp"
onClick="ExecUp()">
VBA>------------------------------------------------------------
Dim objIE As InternetExplorer
Dim url As String
url = "http://www*******"
Set objShell = CreateObject("Shell.Application")
For Each objWin In objShell.Windows
If objWin.Name = "Internet Explorer" And objWin.LocationURL = url Then
Set objIE = objWin
Exit For
End If
Next
If objIE Is Nothing Then Stop
Dim objFrame As HTMLDocument
Set objFrame = objIE.document.frames
Dim i As Long
Dim objFrameDoc As HTMLDocument
Dim objtag As HTMLDocument
For i = 0 To objFrame.Length - 1
Set objFrameDoc = objFrame(i).document
For Each objtag In objFrameDoc.getElementsByTagName("input")
If objtag.Name = "btnUp" Then
objtag.Click '★1 ←ここでIEに制御が渡り、VBAが止まってしまう
Sleep 1000
Dim hwnd As Variant
hwnd = FindWindow("#32770", "Web ページからのメッセージ")
If hwnd <> 0 Then
PostMessage hwnd, WM_COMMAND, vbOK, 0
End If
GoTo ext
End If
Next
Next
ext:
No.4ベストアンサー
- 回答日時:
Frameが絡んだのはやった事が無いのでさらに推測での回答です。
objIE.document.parentWindow.execScript "window.setTimeout(""document.frames(" & cstr(i) & ").document.getElementsByTagName('input')(" & CStr(ri) & ").click
または、
objframedoc.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);"'
推測での回答では、無理がありますので、これ以上の回答は控えます。
objIEからたどってボタンを取得できるようにしないといけないのでは?と思います。(これも推測)
何か参考になるような事が分かれば、またお邪魔します。
ごめんなさい。
!!!!あーーーーー!!!
通りました!メッセージ出ました!
こちらで通りました!
objframedoc.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);"'
色々考えていただいて本当にありがとうございます!
私一人ではたどり着けませんでした。
本当に本当にありがとうございます。
大感謝です!
No.3
- 回答日時:
だめでしたか。
ごめんなさいね。確認ですけど、
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);" '★
の部分は通っています?
objIE.Document.getElementsByTagName("input")(ri).Click
にした場合、メッセージ表示されますか?
私も試行錯誤した結果なので、ちょっと違うだけでもうまくいかないかも。
こちらで試せればいいんですけどね。
後、ページが完全に読み込まれていなかったりで失敗する事があるので
私は、1度失敗したら1秒待って3回までチャレンジするようにしています。
ごめんなさいなんて、恐縮です!感謝しかありません。。
↓こちらはエラーにならずに通るけど、メッセージも表示されません。
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);" '★
↓こちらは以下のように表示されました。
実行時エラー91
オブジェクト変数またはwithブロック変数が設定されていません
objIE.Document.getElementsByTagName("input")(ri).Click
指定が間違っているのですね。う・ううーん。
画面は開いたままで行っているので読込はされているのではないかと思います。
No.2
- 回答日時:
参考になるか分かりませんが、私も先日同じ様な事で悩んでいました。
私の場合はタグが”A"でIDもNAMEもなかったので
cn = 0
For Each objInput In objIE.Document.getElementsByTagName("A")
If (objInput.innerText = "ファイル選択") Then
objIE.Document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('A')(" & CStr(cn) & ").click();"",10);"
Exit For
End If
cn = cn + 1
Next
という様な感じで作成しました。
これが正解か分かりませんが、とりあえず動いたので良しとしています。
NAMEがあるみたいなので
objIE.Document.parentWindow.execScript "window.setTimeout(""document.getElementsByName('btnUp').click();"",10);"
の様な感じで出来ませんか?
objIE.Document.parentWindow.execScriptはどこかのサイトから探してきた物で
詳細はよくわかりません。(とりあえず動いたので良しとしています。)
WindFallerさんも仰ってますが、検証のしようが無いので、
うまくいかなかったらごめんなさい。
同じように悩まれて解決された内容を教えていただいてありがとうございます!
変数riを追加して★マーク部分に変更して2通り流してみたのですが
状況変わらずエラーにならずに通るけど、メッセージも表示されませんでした。
クリックしたいボタンの指定がうまくできていないのだと思うので、
教えていただいた「objIE.document.parentWindow」などでうまく指定できるとよいのですが。。。
また何かヒントがありましたらどうぞよろしくお願いします。
dim ri As Long
For i = 0 To objFrame.Length - 1
Set objFrameDoc = objFrame(i).document
ri = 0
For Each objtag In objFrameDoc.getElementsByTagName("input")
If objtag.Name = "btnUp" Then
objIE.Document.parentWindow.execScript "window.setTimeout(""document.getElementsByName('btnUp').click();"",10);" '★
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);" '★
Sleep 1000
Dim hwnd As Variant
hwnd = FindWindow("#32770", "Web ページからのメッセージ")
If hwnd <> 0 Then
PostMessage hwnd, WM_COMMAND, vbOK, 0
End If
GoTo ext
End If
ri = ri + 1
Next
Next
No.1
- 回答日時:
今の状態では、URLがありませんので、ご質問のコード自体を試すことができません。
ですから、想像の範囲しか書けません。ここには、JavaScript で詳しい人もいるようですから、そちらのほうは、こちらでは応えられませんが、私の知る範囲で気がついたことを書かせていただきます。objtag As HTMLDocument
HTMLDocument は、もともと、テキストのソースを再構成させてオブジェクトにするものではなかったのではないでしょうか。だから、IE オブジェクトから切り離されてしまっているのではないでしょうか。
>objtag.Click '★1 ←ここでIEに制御が渡り、VBAが止まってしまう
objFrameDoc.getElementsByTagName("input") から、取り出したものを、オブジェクトのまま渡していれば、IEにつながっているけれども、HTMLDocument では、仮想オブジェクトになってしまっています。
それと、
● >hwnd = FindWindow("#32770", "Web ページからのメッセージ")
>If hwnd <> 0 Then
●で、止めてみて、ダイアログの Class:"#32770" は、確かに取れていますか?Windowsアプリのダイアログで、Webでは使わないような気がしたのですが……。
同様のコードを見てみると、サンプルサイトを使っているようですが、JavaScript が必要な場合は、コードの下に出てくるようですが、そうでない場合は、IEオブジェクトを確保したら、その中の objtagの一つを選び、Clickする、今のコードのままで良いはずなのです。
回答ありがとうございます!
とてもうれしいです。
objFrameDoc.getElementsByTagName("input") から、取り出したものを、オブジェクトのまま渡していれば、IEにつながっているけれども、HTMLDocument では、仮想オブジェクトになってしまっています。
→???
すみません。理解できませんでした。
宣言が違うということなのでしょうか。
試しに Dim objtag As Objectで実行してみましたが、やはり制御はIEのままでした。
せっかくのアドバイスを理解できずに申し訳ありません。
hwnd = FindWindow(”#32770”…
上記はまだメッセージ箇所が解決できていないため、値の取得の確認ができておりません。
元のURLは自分の判断で掲載してよいのかわからず、影響が想像つかないのでご容赦ください。
また何か声をかけていただければ助かります!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DOM要素を削除しても、イベント...
-
javascriptの基本的なことだと...
-
教えてください><
-
compatModeとは?
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
Boolean型配列中のTrueの有無を...
-
innerHTML実行後のイベント
-
翌月を取得するGASが分かりません
-
<a>タグのテキストを取得
-
ジャバスクリプトで空白(スペー...
-
このスクリプトを修正したいの...
-
functionから別のfunctionを実...
-
JavaScriptでのcheckbox作成
-
JavaScriptで簡単なクイズを作...
-
onclickを使わずにイベント処理...
-
なぜ、ジャバスクリプトが表示...
-
google apps scriptの終了のさせ方
-
総当りの配列を返す関数の作成
-
【Tabキー】特定の範囲内だけで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScript window.openで開く...
-
文字を一文字ずつ表示
-
DOM要素を削除しても、イベント...
-
FireFoxのjavascriptで自動でキ...
-
javascriptの基本的なことだと...
-
このjavascriptのif文、条件式...
-
XMLでのAttributeを持ったNode...
-
Latexに関する質問です。
-
Null またはオブジェクトではあ...
-
VBAでIEのボタンを押してメッセ...
-
乗換案内 VBAで操作したい
-
javascriptのdocument.allにつ...
-
TexでΣの添え字の位置直し
-
showModalDialogで開いた画面を...
-
ラジオボタンでreadonlyの切替え
-
excle VBA とweb上の検索を利用...
-
LaTeX:数式を等号揃えにする方法
-
TEXTAREA内の改行位置をinnerHT...
-
iframe内のページ(複数)を変更
-
ブラウザのウィンドウサイズに...
おすすめ情報
こんにちは。
WindFallerさんの回答をじっと見ていたら、「JavaScript が必要な場合は、コードの下に出てくるようですが」の「コードの下」ってなんだろう?と気になりました。
私が呼び出したかった「ExecUp」はソースの上部に記述があって、次のように書かれています。
function ExecEntry(){…
さらに上部に「SCRIPT LANGUAGE="JavaScript"」という箇所があったのでJavaScriptで呼び出しできるのかと思っていたのですが、違うのかな…?
補足文字数に限りがあるので細切れですみません。
そしてtaisuke555さんの回答から、「objIE.document.parentWindow」で検索をしていたらこちらのサイトに行きつきました。
https://teratail.com/questions/92430
こちらを参考に次のように書いてみたところ、「undefined」のメッセージが表示されました。
objIE.document.parentWindow.execScript "window.setTimeout(""alert(document.getElementsByName('btnUp').name);"",10);"
ごめんなさい。1個目の補足書き間違えました。。
誤り>
function ExecEntry(){…
正しい>
function ExecUp(){…
taisuke555さんの回答から少し変更してみました。
★1は動作するのですが★2では反応がありません。
For ri = 0 To objFrameDoc.getElementsByTagName("input").Length - 1
If objFrameDoc.getElementsByTagName("input")(ri).Name = "btnUp" Then
objFrameDoc.getElementsByTagName("input")(ri).Click '★1制御がie
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);"'★2無反応
End If