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

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

新規登録して質問してみよう
ただいま回答率
86.12%
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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

解決済

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

koyamashinji
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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

3回答

0グッド

0クリップ

11492閲覧

投稿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

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

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

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

回答3

1

自己解決

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

ポイント - クリックの方法(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

TanakaHiroaki👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

1

当方、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👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

koyamashinji

2020/10/11 02:46

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

1

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👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

koyamashinji

2020/10/11 02:46

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。