VBAでIEを操作するマクロを作っています。
ホームページでCSVダウンロードボタンを押すと、添付図の様なダイアログが表示されます。
このダイアログで"ファイルを開く(o)"のボタンを押したいのですが、方法が分かりません。
Sendkeyで試しましたが不安定なため、別の方法がないか探していたところ、この教えてgooでタイトル「IE操作時、ファイルのダウンロードボタンの押下」を見つけました。
早速、そこのベストアンサーになっていたコードをコピーし、下記2か所のみ変更し組み込みました。①親ウィンドウ取得のstrCaptionを所定のページタイトル(shoene.org)に変更
②保存ボタンを見つけたらクリックするのaccName(CHILD_SELF)="ファイルを開く"に変更
しかしながら、コンパイルエラーとなり、実行できません。
VBA、IEとも初心者で内容詳細が分からず、エラーの修正箇所が分かりません。
コードを下記します。コンパイルエラーとなっている行番号は、下記です。
<エラー行番号>
1、12-14、15-17、18、30、36、39、40、42、49、50、58、62
間違っているところ、修正内容についてお教え願います。
ーーーーーーーーーーー以下コードーーーーーーーーーーーーーーーーーーーーーーーーー
行番号
1 Private Delegate Function D_EnumChildWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As IntPtr
2 Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
3 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal wMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
4 Private Const WM_ACTIVATE = &H6
5 Private Const BM_CLICK = &HF5
6 Private Const WM_GETTEXT = &HD
7 Private Const WM_QUIT = &H10
8 Private Const NAVDIR_NEXT = &H5
9 Private Const NAVDIR_FIRSTCHILD = &H7
10 Private Const CHILDID_SELF = &H0
11 Private Const OBJID_CLIENT = &HFFFFFFFC
12 Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
13 (ByVal hWnd As IntPtr, ByVal dwId As IntPtr, _
14 ByRef riid As Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As IntPtr
15 Declare Function AccessibleChildren Lib "oleacc" _
16 (ByVal paccContainer As IAccessible, ByVal iChildStart As IntPtr,
17 ByVal cChildren As IntPtr, <[Out]()> ByVal rgvarChildren() As Object, ByRef pcObtained As IntPtr) As IntPtr
18 Private IID_IAccessible As Guid = New Guid(&H20400, 0, 0, {&HC0, 0, 0, 0, 0, 0, 0, &H46}
19
20 Sub FileDownLoad_Proc()
21 Dim strCaption As String
22 Dim PWnd As IntPtr
23 Dim cWnd As IntPtr
24
25 ' 親ウィンドウ取得
26 strCaption = "shoene.org"
27 While PWnd = 0
28 PWnd = FindWindowEx(0, 0, "IEFrame", strCaption)
29 System.Threading.Thread.Sleep (50)
30 End While
31
32 ' 通知バーのハンドル
33 While cWnd = 0
34 cWnd = FindWindowEx(PWnd, 0&, "Frame Notification Bar", vbNullString)
35 System.Threading.Thread.Sleep (50)
36 End While
37
38 ' 通知バーボタン群のハンドル
39 Dim hChild As IntPtr = FindWindowEx(cWnd, 0&, "DirectUIHWND", vbNullString)
40 Dim objAcc As IAccessible = Nothing
41
42 AccessibleObjectFromWindow(hChild, OBJID_CLIENT, IID_IAccessible, objAcc)
43
44 If Not IsNothing(objAcc) Then
45 ClickPreserve (objAcc)
46 While cWnd = 0
47 cWnd = FindWindowEx(PWnd, 0&, "Frame Notification Bar", vbNullString)
48 System.Threading.Thread.Sleep (50)
49 End While
50 SendMessage(cWnd, WM_QUIT, 0, 0&)
51
52 End If
53
54 End Sub
55 Private Sub ClickPreserve(ByVal acc As IAccessible)
56
57 Dim i As Long
58 Dim count = acc.accChildCount
59 Dim lst(Count - 1) As Object
60
61 If Count > 0 Then
62 AccessibleChildren(acc, 0, count, lst, 0)
63 If Not IsNothing(lst) Then
64 For i = LBound(lst) To UBound(lst)
65 With lst(i)
66 'On Error Resume Next
67 'Debug.Print("ChildCount: " & .accChildCount)
68 'Debug.Print("Value: " & .accValue(CHILDID_SELF))
69 'Debug.Print("Name: " & .accName(CHILDID_SELF))
70 'Debug.Print("Description: " & .accDescription(CHILDID_SELF))
71 'On Error GoTo 0
72 '保存ボタンを見つけたらクリック(デフォルトアクション)する
73 If .accName(CHILDID_SELF) = "ファイルを開く" Then
74
75 System.Threading.Thread.Sleep (500)
76 .accDoDefaultAction (CHILDID_SELF)
77 System.Threading.Thread.Sleep (500)
78 End If
79 End With
80 ClickPreserve (lst(i)) '再帰
81 Next
82 End If
83 End If
84 End Sub
No.1ベストアンサー
- 回答日時:
>コンパイルエラーとなっている行番号は、下記です。
まず、行番号の使い方が違っていて、行番号はBasic の時代だけではありません。VB系の行番号は、エディタの行番号とは違います。VBのコードの行番号は、プログラムの書法のひとつです。Win32 API や dim の所には行番号は入れてはいけないのです。
今回の掲示のコードは、VBA のコードではありません。VB.Net のコードです。
次に、このような目的のコードは、緊急避難的なもので、時々、ダウンロード・ファィル名が、通知バーが出るまで分からないものがあります。そういう時に、力を発揮するもので、通常は使いません。
今、調べてみましたが、現在の通知バーではないようです。Spy++ (ファイル名:spyxx.exe -visual studio ??\Common7\Tools やVector の miniSpy.exe でも使っておなしてください。
◦通知バーを操作してファイルをダウンロードする方法
https://www.ka-net.org/blog/?p=4855#Notification …
hSaveAsDialog = FindWindowEx(0, 0, "#32770", "名前を付けて保存")
これと同等のUWSCがあるはずですから、Excel 等のVBAからUWSCを起動すれば済むはずです。
http://www.uwsc.info/
http://nymemo.com/uwsc/193/
もちろん、これを読み取って、それをVBAに移植は可能なはずです。
しかし、それ以上です。コードは信じられないほど簡単になっています。
>handle = GETCTLHND(id,"DirectUIHWND",2) ←通知バーの現在のハンドル
>ハンドルをIDに変換 id2 = HNDtoID(handle)
>保存ボタンを押す CLKITEM(id2, "保存", CLK_ACC)
単にやっていことは、これだけなのです。UWSC は、内部はWin APIの塊なのですが、すごいとしか言いようがないです。
私は、この手のコードは試したことがありません。通常、事前にダウンロード名が取れますので、後は、直接ダウンロードしてしまいます。ファイルを開くを押しても、インターネットキャッシュにてダウンロードして、展開するだけだと思います。
早々に回答いただきありがとうございます。
Sendkeyで動作不安定だったため、調べて見つけたコードで試しましたが、この方法は「緊急避難的なもので通常使わない」ということですね。
教えていただいた別の方法”UWSCを使う方法”で再検討してみます。
また、教えていただきたいことが出てくると思いますが、その際にはまたご教示いただけると助かります。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
vbaでIEの名前を付けて保存(A)をしたい
Microsoft ASP
-
VBA IE ダウンロード ダイアログ制御(名前を付けて保存)
Visual Basic(VBA)
-
VBA IE通知バーの制御 バー内のボタン 開く/保存/キャンセルを押す
Visual Basic(VBA)
-
-
4
ダウンロードダイアログをVBAから操作するには?
Visual Basic(VBA)
-
5
IE操作時、ファイルのダウンロードボタンの押下
Visual Basic(VBA)
-
6
WEBページからのメッセージをVBAで
Visual Basic(VBA)
-
7
VBAでIEを操作、ポップアップされた画面の処理(Enter)を行いたい
Visual Basic(VBA)
-
8
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
9
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
10
IEのダウンロード通知バーのVBA制御(保存他)
Visual Basic(VBA)
-
11
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
12
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
13
IEのダウンロード通知バーVBA制御
Visual Basic(VBA)
-
14
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
15
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
16
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
-
17
VBAでIEの「ファイルのダウンロード」ダイアログを制御
Visual Basic(VBA)
-
18
(UWSC) 「#32770」の意味わかりますか?
その他(プログラミング・Web制作)
-
19
起動済みのIEをハンドルから操作するには
Visual Basic(VBA)
-
20
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLページが勝手にダウンロー...
-
VBA URLDownloadToFileについて
-
Webサイトから、txtファイルを...
-
【HTML】1クリックで複数ファイ...
-
URLDownloadToFile でダウンロ...
-
イラストレーターのaiファイル...
-
ホームページでファイルをダウ...
-
複数のデータをダウンロードさ...
-
ダウンロードサイト作成方法に...
-
Excelファイルをダウンロ...
-
WEB上でPDF閲覧のみにしたいです。
-
hrefでリンクしたテキストファ...
-
java_run.batがダウンロードで...
-
ホームページ内のPDFを開くとエ...
-
JSP/Servlet DBからデータを読...
-
bcpadのコンパイラのインストー...
-
大量画像の送信
-
iPhoneです。 Adobeフラッシュ...
-
ZIPの拡張子のついたURLがダウ...
-
エクセルのファイルのダウンロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Webサイトから、txtファイルを...
-
【HTML】1クリックで複数ファイ...
-
HTMLページが勝手にダウンロー...
-
XMLファイルのダウンロード
-
VBA URLDownloadToFileについて
-
java_run.batがダウンロードで...
-
URLDownloadToFile でダウンロ...
-
ZIPの拡張子のついたURLがダウ...
-
WEB上でPDF閲覧のみにしたいです。
-
ファイルをダウンロードすると...
-
Excelのマクロについて教えてく...
-
イラストレーターのaiファイル...
-
VBA IE操作でダイアログ表示後...
-
rdfファイルをブラウザで表示さ...
-
aタグでワードファイルを開くor...
-
iPhoneです。 Adobeフラッシュ...
-
HTTP上にあるファイルの更新日時
-
ホームページでファイルをダウ...
-
HTMLファイルの配布、良い方法は?
-
VC++でのZIPファイル解凍方法を...
おすすめ情報