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

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

ただいまの
回答率

88.59%

VBAで「WEBからのメッセージ」をクリックするコードについて

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 140

koyamashinji

score 27

「WEBからのメッセージ」が出ると、VBAの自動化プログラムが止まってしまい
毎回その部分だけ手動でクリックが必要でした。
どうにかVBAを止めることなく、この「WEBからのメッセージ」をクリックしたく

色々調べると、
どうやら 実行中のVBA制御がシステムウィンドウに持っていかれることが原因で、
VBA側に制御が返ってこないためにVBAが止まった状態になる、ということがわかり
VBAに制御を残したまま システムウィンドウに対してアプローチを行うために、
ココを参考にしながらJavascriptでシステムウインドウを出現させるコードを作成しました。

実行すると、
★の部分(If objButton(i).Value = ValueChar Then  )で下記エラーがでます。

実行時エラー-214735231980020101)
オートメーションエラーです。

調べても原因が分からずお知恵を貸していただきたく。

'呼び出し側
Sub テスト()

~省略~

Call ButtonClick(ie:=ie, ValueChar:="hoge")

~省略~

End Sub
Option Explicit
'64bitのためPtrSafeをつけています

Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
(ByVal hwndParent As LongPtr, ByVal hwndChildAfter As Long, _

ByVal lpszClass As String, ByVal lpszWindow As String) As Long

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As LongPtr, ByVal wMsg As LongPtr, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr

Const WM_COMMAND As Long = &H111&

Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

===========================================================
'WEBからのメッセージ_ボタンを押す
Sub ButtonClick(ie As InternetExplorerMedium, ValueChar As String)

    Dim objButton As HTMLInputButtonElement
    Dim objButtonCollection As Variant

    Set objButtonCollection = ie.document.getElementsByTagName("INPUT")
    For Each objButton In objButtonCollection

        Dim i As LongPtr
        Dim h As LongPtr

        i = 0
        For i = 0 To objButtonCollection.Length - 1
            If objButton(i).Value = ValueChar Then'Javascriptで対象のinputを押して「Web からのメッセージ」を表示させる。
                'ポイントはJavascriptでクリックするからEXCEL側の制御が外れない。
                ie.document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & i & ").click()", 200 '←200は0.2秒後にクリックしてねの意味
                'Javascriptのsettimeoutで 0.2秒後にクリックされるから、Sleepで待っておく必要がある。
                Sleep 2000

                '「Webからのメッセージ」のウィンドウをキャッチする
                h = FindWindow("#32770", "Web ページからのメッセージ")

                'OKボタンを押す
                PostMessage h, WM_COMMAND, 1, 0
                Call waitIE(ie:=ie)
                Exit For
            End If
        Next i
    Next objButton
Exit Sub
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

私の経験上、Javascriptを用いる方法であっても、クリック後はVBAの制御が外れて待ち状態になることが予想されます。
その場合の解決方法はかなり難易度が高く、VBAがマルチスレッドによる並列処理できないことから、VBAから他のアプリケーションを非同期で起動して処理する等、VBA以外の知識が必要になります。

過去の質問と回答に、VBAからVBSを起動する方法がありましたのでJavascriptがうまくいかない場合は参考にしてください。
https://teratail.com/questions/253981?link=qa_related_pc

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る