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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
IE操作時、ファイルのダウンロードボタンの押下
Visual Basic(VBA)
-
VBA IE通知バーの制御 バー内のボタン 開く/保存/キャンセルを押す
Visual Basic(VBA)
-
vbaでIEの名前を付けて保存(A)をしたい
Microsoft ASP
-
-
4
VBA IE ダウンロード ダイアログ制御(名前を付けて保存)
Visual Basic(VBA)
-
5
ダウンロードダイアログをVBAから操作するには?
Visual Basic(VBA)
-
6
IEのダウンロード通知バーのVBA制御(保存他)
Visual Basic(VBA)
-
7
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
8
VBAでIEを操作、ポップアップされた画面の処理(Enter)を行いたい
Visual Basic(VBA)
-
9
(UWSC) 「#32770」の意味わかりますか?
その他(プログラミング・Web制作)
-
10
VBA IE操作 ダイアログボックス操作(ファイルを開く)
Visual Basic(VBA)
-
11
IEのダウンロード通知バーVBA制御
Visual Basic(VBA)
-
12
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
13
WEBページからのメッセージをVBAで
Visual Basic(VBA)
-
14
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
15
VBAでIEのボタンを押してメッセージ応答したい
Excel(エクセル)
-
16
Webページ中の javascript をVBAから実行するには
Visual Basic(VBA)
-
17
Excel VBAでのIE操作でクリックができないボタンはあるのでしょうか
Visual Basic(VBA)
-
18
EXCEL マクロ クリップボードクリア方法
Excel(エクセル)
-
19
VBAのIE操作でframe構造のサイト画面をscrollする方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java_run.batがダウンロードで...
-
選択した複数のファイルを、一...
-
【HTML】1クリックで複数ファイ...
-
ファイルをダウンロードすると...
-
htmlにてクリックするとダウン...
-
HTMLページが勝手にダウンロー...
-
IE操作時、ファイルのダウンロ...
-
Webサイトから、txtファイルを...
-
エクセルのファイルのダウンロ...
-
パソコンの隠しファイルについて
-
VBA URLDownloadToFileについて
-
教えてください!
-
スタイルシートの暗号化について
-
XMLファイルのダウンロード
-
ホームページ内のPDFを開くとエ...
-
複数のファイルをダウンロード...
-
Perlで圧縮ファイルを作成する...
-
ファイルを一括ダウンロードす...
-
docomoの構成プロファイルはど...
-
CSVファイルをサーバからクライ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLページが勝手にダウンロー...
-
Webサイトから、txtファイルを...
-
VBA URLDownloadToFileについて
-
java_run.batがダウンロードで...
-
【HTML】1クリックで複数ファイ...
-
URLDownloadToFile でダウンロ...
-
ファイルをダウンロードすると...
-
XMLファイルのダウンロード
-
エクセルのファイルのダウンロ...
-
VBA IE操作でダイアログ表示後...
-
エアーマンが倒せないのtab譜
-
WEB上でPDF閲覧のみにしたいです。
-
IE操作時、ファイルのダウンロ...
-
ASPでPDFファイルのサム...
-
会員制ホームページの作り方。
-
bcpadのコンパイラのインストー...
-
asp ダウンロード中にタイムア...
-
メールの直リンクがダウンロー...
-
ダウンロードしたファイルが「...
-
イラストレーターのaiファイル...
おすすめ情報