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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

16711閲覧

VBAで「Web ページからのメッセージ」を操作したい

koyamashinji

総合スコア45

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/09/26 07:55

編集2020/09/26 08:34

VBAで、WEB操作を自動化しています。
「Web ページからのメッセージ」のダイアログが出る場合、VBAで「OK」を押したく。

この質問は過去にもたくさんされているので、ネット検索しながらコードを切り貼りし
下記を作成しましたが、やはりどうしてもうまくいきません。

もしよろしければ、お知恵を貸していただけないでしょうか。
ちなみに、エラーは特に出ません。

動作環境
・OSは64ビットです。
・ブラウザはIEです。

Option Explicit 'DeclareステートメントにPtrSafe属性を追加;64ビット版Excel対応のため Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _ (ByVal hwndParent As Long, 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 'Postmassage Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long Const WM_COMMAND As Long = &H111& '*************************************************************** Sub hoge() ===省略=== Sleep 1000 'Webページからのポップアップをクリック Dim hwnd As LongPtr hwnd = FindWindow("#32770", "Web ページからのメッセージ") PostMessage hwnd, WM_COMMAND, vbOK, 0& 'システムダイアログのOKボタンを押す End sub

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

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

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

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

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

kuma_kuma_

2020/09/26 08:07

ブラウザによって違うので... ただ悪用できてしまうのでここでは書けないかな...
hana_yama_san

2020/09/26 08:20

動作環境OSは64or32ビットどちらですか。
koyamashinji

2020/09/26 08:32

@kuma_kuma_さん ブラウザはIEを使用しています。悪用できてしまう、とは具体的にはどのように悪用できてしまうのでしょうか。
koyamashinji

2020/09/26 08:34

@hana_yama_sanさん 動作環境を追記致しました。
kuma_kuma_

2020/09/26 15:27

> 悪用できてしまう セキュリティ警告の突破ができてしまいます。
guest

回答3

0

自己解決

自己解決しましたので、下記に記します。(回答頂いた皆様、誠に有難うございました。各ご回答、大変勉強になりました)
ここを参考にさせて頂きました)

ポイント - クリックの方法(VBAでなく、Javascriptでクリックする)

  • NGな方法

HTMLのボタンオブジェクト(=objButtonとする)を取得し、通常通りVBAのコードでobjButton.click()すると、NG。
**「WEBページからのメッセージ」**が表示された時点で、システム側に制御が移動し、Excelから制御が外れる為

  • 正しい方法

対象のボタンオブジェクト取得後、直後にie.document.Script.setTimeout "javascript:document.getElementById('hage').click()", 200を記述することで、Javascriptを使ってボタンを押すことができる。そうすれば、VBAに制御が残ったままになり、無事、次のコード("WEBページからのメッセージ"のウインドウのハンドルを取得するコード)を実行することができる。

動作NG

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Private 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& ________________________________________________________________________________________ Sub test() Dim HandleIE As InternetExplorerMedium Dim HTMLDoc As MSHTML.HTMLDocument Dim ie As InternetExplorerMedium Dim objButton As HTMLInputButtonElement '(省略) Set ie = IEオブジェクト For Each objButton In ie.document.getElementsByTagName("foo") If objButton.Value = "piyo" Then      objButton.click() 'VBAのclickメソッドでクリックすると、"WEBページからのメッセージ"が出現した時、システム側に制御を持っていかれてしまう ' 制御はシステム側に残ったままなので、↓以下のコードはいつまで経っても実行されない Sleep 1000 Dim hwnd As LongPtr hwnd = FindWindow("#32770", "Web ページからのメッセージ") PostMessage hwnd, WM_COMMAND, vbOK, 0& End Sub

###動作OK

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Private 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& ________________________________________________________________________________________ Sub test() Dim HandleIE As InternetExplorerMedium Dim HTMLDoc As MSHTML.HTMLDocument Dim ie As InternetExplorerMedium Dim objButton As HTMLInputButtonElement '(省略) Set ie = IEオブジェクト For Each objButton In ie.document.getElementsByTagName("foo") If objButton.Value = "piyo" Then      '対象のボタンを取得後、VBAではなく、javascriptでクリックする。そうすることで、制御はVBAに残ったままになり、以下のコードが実行される。 ie.document.Script.setTimeout "javascript:document.getElementById('hage').click()", 200 Sleep 1000 hwnd = FindWindow("#32770", "Web ページからのメッセージ") If hwnd <> 0 Then Debug.Print hwnd, ie.hwnd PostMessage hwnd, WM_COMMAND, vbOK, 0 End If Exit For End If Next

投稿2020/12/21 12:55

koyamashinji

総合スコア45

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

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

0

当方、VBAはデータ解析や、DB出力結果と人間が管理している
excelファイルの突合・運用手順の自動化等ではある程度経験が
有りますが、IE連携や(今やそれでもないらしい)webページのダイアログ
については、殆ど素人です。

しかも、「TanakaHiroaki」さんから有用そうな回答もあります。
(SendMessage も宣言が必要そうですが)

ただ追記・修正依頼に書いてしまった以上、外していても構わないので、
直感した回答を記させて頂きます。

>>'DeclareステートメントにPtrSafe属性を追加;64ビット版Excel対応のため
>>Declare PtrSafe Function FindWindowEx・・・

を定義しているのに、例文ではhoge()中に、この関数は登場していません
しかし実行環境は64bitとのことです。

ならば、
hwnd = FindWindowは
hwnd = FindWindowEx と書くべきなのではないかなと
感じました。

大外ししていれば、申し訳ないです。
先に謝って置きます「済みません」

投稿2020/09/26 09:47

hana_yama_san

総合スコア923

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

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

koyamashinji

2020/10/11 02:46

ご回答ありがとうございます。返信遅くなり申し訳ありません。仕事上、こちらの検証が月末日しかできず、また次回実施する際、頂いたご意見をもとにトライしてみます。
guest

0

SendMessage を使う方法です。

VBA

1hWindow = FindWindow("#32770", "Web ページからのメッセージ") 2hButton = FindWindowEx(hWindow, 0&, "Button", "OK") 3SendMessage hButton, &H6, 1, 0& 'ボタンをアクティブにする 4SendMessage hButton, &HF5, 0, 0& 'ボタンをクリックする

投稿2020/09/26 08:23

TanakaHiroaki

総合スコア1063

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

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

koyamashinji

2020/10/11 02:46

ご回答ありがとうございます。返信遅くなり申し訳ありません。仕事上、こちらの検証が月末日しかできず、また次回実施する際、頂いたご意見をもとにトライしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問