プロが教えるわが家の防犯対策術!

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

「VBA IE操作でダイアログ表示後、ファ」の質問画像

A 回答 (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の塊なのですが、すごいとしか言いようがないです。

私は、この手のコードは試したことがありません。通常、事前にダウンロード名が取れますので、後は、直接ダウンロードしてしまいます。ファイルを開くを押しても、インターネットキャッシュにてダウンロードして、展開するだけだと思います。
「VBA IE操作でダイアログ表示後、ファ」の回答画像1
    • good
    • 0
この回答へのお礼

早々に回答いただきありがとうございます。
Sendkeyで動作不安定だったため、調べて見つけたコードで試しましたが、この方法は「緊急避難的なもので通常使わない」ということですね。
教えていただいた別の方法”UWSCを使う方法”で再検討してみます。
また、教えていただきたいことが出てくると思いますが、その際にはまたご教示いただけると助かります。
ありがとうございました。

お礼日時:2017/07/04 09:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A