dポイントプレゼントキャンペーン実施中!

盛りだくさんですみません。

ボタンを押してその後表示されたメッセージに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:

質問者からの補足コメント

  • うーん・・・

    こんにちは。
    WindFallerさんの回答をじっと見ていたら、「JavaScript が必要な場合は、コードの下に出てくるようですが」の「コードの下」ってなんだろう?と気になりました。
    私が呼び出したかった「ExecUp」はソースの上部に記述があって、次のように書かれています。

    function ExecEntry(){…

    さらに上部に「SCRIPT LANGUAGE="JavaScript"」という箇所があったのでJavaScriptで呼び出しできるのかと思っていたのですが、違うのかな…?

      補足日時:2019/05/07 16:11
  • うーん・・・

    補足文字数に限りがあるので細切れですみません。

    そしてtaisuke555さんの回答から、「objIE.document.parentWindow」で検索をしていたらこちらのサイトに行きつきました。
    https://teratail.com/questions/92430

    こちらを参考に次のように書いてみたところ、「undefined」のメッセージが表示されました。
    objIE.document.parentWindow.execScript "window.setTimeout(""alert(document.getElementsByName('btnUp').name);"",10);"

      補足日時:2019/05/07 16:16
  • へこむわー

    ごめんなさい。1個目の補足書き間違えました。。

    誤り>
    function ExecEntry(){…

    正しい>
    function ExecUp(){…

      補足日時:2019/05/07 16:19
  • うーん・・・

    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

      補足日時:2019/05/07 17:23

A 回答 (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からたどってボタンを取得できるようにしないといけないのでは?と思います。(これも推測)

何か参考になるような事が分かれば、またお邪魔します。
ごめんなさい。
    • good
    • 1
この回答へのお礼

!!!!あーーーーー!!!
通りました!メッセージ出ました!

こちらで通りました!
objframedoc.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);"'

色々考えていただいて本当にありがとうございます!
私一人ではたどり着けませんでした。

本当に本当にありがとうございます。
大感謝です!

お礼日時:2019/05/07 18:26

だめでしたか。

ごめんなさいね。
確認ですけど、
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);" '★
の部分は通っています?

objIE.Document.getElementsByTagName("input")(ri).Click
にした場合、メッセージ表示されますか?

私も試行錯誤した結果なので、ちょっと違うだけでもうまくいかないかも。

こちらで試せればいいんですけどね。

後、ページが完全に読み込まれていなかったりで失敗する事があるので
私は、1度失敗したら1秒待って3回までチャレンジするようにしています。
    • good
    • 0
この回答へのお礼

ごめんなさいなんて、恐縮です!感謝しかありません。。

↓こちらはエラーにならずに通るけど、メッセージも表示されません。
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(" & CStr(ri) & ").click();"",10);" '★

↓こちらは以下のように表示されました。
実行時エラー91
 オブジェクト変数またはwithブロック変数が設定されていません
objIE.Document.getElementsByTagName("input")(ri).Click

指定が間違っているのですね。う・ううーん。

画面は開いたままで行っているので読込はされているのではないかと思います。

お礼日時:2019/05/07 16:44

参考になるか分かりませんが、私も先日同じ様な事で悩んでいました。


私の場合はタグが”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さんも仰ってますが、検証のしようが無いので、
うまくいかなかったらごめんなさい。
    • good
    • 0
この回答へのお礼

同じように悩まれて解決された内容を教えていただいてありがとうございます!

変数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

お礼日時:2019/05/07 14:00

今の状態では、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する、今のコードのままで良いはずなのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
とてもうれしいです。

objFrameDoc.getElementsByTagName("input") から、取り出したものを、オブジェクトのまま渡していれば、IEにつながっているけれども、HTMLDocument では、仮想オブジェクトになってしまっています。
→???
すみません。理解できませんでした。
宣言が違うということなのでしょうか。
試しに Dim objtag As Objectで実行してみましたが、やはり制御はIEのままでした。
せっかくのアドバイスを理解できずに申し訳ありません。

hwnd = FindWindow(”#32770”…
上記はまだメッセージ箇所が解決できていないため、値の取得の確認ができておりません。

元のURLは自分の判断で掲載してよいのかわからず、影響が想像つかないのでご容赦ください。

また何か声をかけていただければ助かります!

お礼日時:2019/05/05 22:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!