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

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

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

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

Internet Explorer

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1840閲覧

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

koyamashinji

総合スコア45

VBA

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

Internet Explorer

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/10/27 06:39

編集2020/10/27 10:24

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

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

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

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

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

'呼び出し側 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

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

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

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

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

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

guest

回答1

0

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

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

投稿2020/10/27 10:20

編集2020/10/27 10:25
TanakaHiroaki

総合スコア1063

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問