人に聞けない痔の悩み、これでスッキリ >>

IEをvb.netから操作しています。
webからファイルのダウンロードを自動で行いたいのですが、どのようにすればいいのかわからず悩んでいます。

画像の赤枠で括ってあるボタンの押下を、vb.netからの操作で行いたいのですが、どのようにすれば良いでしょうか。
InternetExplorer.Applicationに何らかのメンバ関数のようなものがあるのか、sendkeysを使うしかないのか、sendkeysを使うなら、具体的にどのキー操作を送れば良いのかなど、お教えいただけないでしょうか。

よろしくお願いします!

「IE操作時、ファイルのダウンロードボタン」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Windows7 IE9ですが、↓で動きました



Private Delegate Function D_EnumChildWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As IntPtr

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

Private Const WM_ACTIVATE = &H6
Private Const BM_CLICK = &HF5
Private Const WM_GETTEXT = &HD
Private Const WM_QUIT = &H10

Private Const NAVDIR_NEXT = &H5
Private Const NAVDIR_FIRSTCHILD = &H7
Private Const CHILDID_SELF = &H0
Private Const OBJID_CLIENT = &HFFFFFFFC

Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
(ByVal hWnd As IntPtr, ByVal dwId As IntPtr, _
ByRef riid As Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As IntPtr
Declare Function AccessibleChildren Lib "oleacc" _
(ByVal paccContainer As IAccessible, ByVal iChildStart As IntPtr,
ByVal cChildren As IntPtr, <[Out]()> ByVal rgvarChildren() As Object, ByRef pcObtained As IntPtr) As IntPtr

Private IID_IAccessible As Guid = New Guid(&H20400, 0, 0, {&HC0, 0, 0, 0, 0, 0, 0, &H46})

Sub FileDownLoad_Proc()
Dim strCaption As String
Dim PWnd As IntPtr
Dim cWnd As IntPtr

' 親ウィンドウ取得
strCaption = "○○○○ - Windows Internet Explorer"
While PWnd = 0
PWnd = FindWindowEx(0, 0, "IEFrame", strCaption)
System.Threading.Thread.Sleep(50)
End While

' 通知バーのハンドル
While cWnd = 0
cWnd = FindWindowEx(PWnd, 0&, "Frame Notification Bar", vbNullString)
System.Threading.Thread.Sleep(50)
End While

' 通知バーボタン群のハンドル
Dim hChild As IntPtr = FindWindowEx(cWnd, 0&, "DirectUIHWND", vbNullString)
Dim objAcc As IAccessible = Nothing

AccessibleObjectFromWindow(hChild, OBJID_CLIENT, IID_IAccessible, objAcc)

If Not IsNothing(objAcc) Then
ClickPreserve(objAcc)
While cWnd = 0
cWnd = FindWindowEx(PWnd, 0&, "Frame Notification Bar", vbNullString)
System.Threading.Thread.Sleep(50)
End While
SendMessage(cWnd, WM_QUIT, 0, 0&)

End If

End Sub
Private Sub ClickPreserve(ByVal acc As IAccessible)

Dim i As Long
Dim count = acc.accChildCount
Dim lst(count - 1) As Object

If count > 0 Then
AccessibleChildren(acc, 0, count, lst, 0)
If Not IsNothing(lst) Then
For i = LBound(lst) To UBound(lst)
With lst(i)
'On Error Resume Next
'Debug.Print("ChildCount: " & .accChildCount)
'Debug.Print("Value: " & .accValue(CHILDID_SELF))
'Debug.Print("Name: " & .accName(CHILDID_SELF))
'Debug.Print("Description: " & .accDescription(CHILDID_SELF))
'On Error GoTo 0
'保存ボタンを見つけたらクリック(デフォルトアクション)する
If .accName(CHILDID_SELF) = "保存" Then

System.Threading.Thread.Sleep(500)
.accDoDefaultAction(CHILDID_SELF)
System.Threading.Thread.Sleep(500)
End If
End With
ClickPreserve(lst(i)) '再帰
Next
End If
End If
End Sub
    • good
    • 1
この回答へのお礼

ぬおーー!!ありがとうございます!

ちょっと私には難解な感じですが、とりあえず頑張って読み解いてみます。
ありがとうございました!

お礼日時:2013/05/08 14:03

それね、なかなか簡単に押せないんだよー。


俺も自動的にダウンロードするアプリを仕事で作ることになったんだけどVBAで簡単に作ろうと思ったらそこで引っかかった。
諦めてWebClient使って直接ファイルをダウンロードすることにしたよ。


参考になるかわからないけど過去に同じような質問あったよ。
http://oshiete.goo.ne.jp/qa/1809850.html
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QvbaでIEの名前を付けて保存(A)をしたい

VBA で IEの通知バー を操作したいです。
SendKeys で 通知バーの 保存(S) はできたのですが、
保存(s)の右隣の ▼ をクリックするとでてくる、 名前を付けて保存(A) の方法がわかりません。

どのようなキーをおくればよいのでしょうか。


他の質問をみると、SendKeysではなく ○○がよいですよ みたいな内容しか見つからず、
回答をみつけることができなくて困っておりますのでよろしくお願いいたします。

Aベストアンサー

VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。 | 初心者備忘録
http://www.ka-net.org/blog/?p=4855
とか。

QIEのダウンロード通知バーのVBA制御(保存他)

以前投稿された表題の質問をマネしてVBAから通知バーの制御を試みたらエラーになりました。
原因がわからず困っています。どこに問題があるか教えて頂けないでしょうか?
http://okwave.jp/qa/q8121989.html
■実行エラー91
「オブジェクト変数またはWithブロック変数が設定されていません」
■エラー停止箇所
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
■補足
・参照設定はしています。
・下記2点に示すようにお尻の数字を削除しています。(他のエラーがでてしまうため)
  Dim o As IUIAutomation2→IUIAutomation
  Set o = New CUIAutomation8→CUIAutomation

---【http://okwave.jp/qa/q8121989.html】------------------------------------------------------
Option Explicit
'参照設定 UIAutomationClient
'C:\Windows\System32\UIAutomationCore.dll
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr

Sub hoge2()

Const url As String = ""
Dim ie As Object
Set ie = CreateObject("Shell.Application").Windows.findwindowSW(url, Empty, 1, 0, 1)
If ie Is Nothing Then Exit Sub

Dim o As IUIAutomation2
Dim e As IUIAutomationElement
Set o = New CUIAutomation8
Dim h As LongPtr

h = ie.Hwnd
h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)

Dim iCnd As IUIAutomationCondition
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "保存")

Dim Button As IUIAutomationElement
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)

Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke

DoEvents
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "通知バーのテキスト")
Dim iElemFound As IUIAutomationElement
Set iElemFound = e.FindFirst(TreeScope_Subtree, iCnd)
Dim iValuePattern As IUIAutomationValuePattern
Set iValuePattern = iElemFound.GetCurrentPattern(UIA_ValuePatternId)

Do
DoEvents
If iValuePattern.CurrentValue Like "*のダウンロードが完了しました。*" Then
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "閉じる")
Set iElemFound = e.FindFirst(TreeScope_Subtree, iCnd)
Set InvokePattern = iElemFound.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
Exit Do
End If
Loop

End Sub

以前投稿された表題の質問をマネしてVBAから通知バーの制御を試みたらエラーになりました。
原因がわからず困っています。どこに問題があるか教えて頂けないでしょうか?
http://okwave.jp/qa/q8121989.html
■実行エラー91
「オブジェクト変数またはWithブロック変数が設定されていません」
■エラー停止箇所
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
■補足
・参照設定はしています。
・下記2点に示すようにお尻の数字を削除しています。(他のエラーがでてしまうため)
...続きを読む

Aベストアンサー

そのコードは通知バーが完全に表示されている状態での実行を期待しています。
なので、ループで参照がセット出来るまで、待ち合わせてみるとか。

Dim Button As IUIAutomationElement
Dim InvokePattern As IUIAutomationInvokePattern

While Not InvokePattern Is Nothing
DoEvents
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
Wend
InvokePattern.Invoke

QVBA IE ダウンロード ダイアログ制御(名前を付けて保存)

IE上に表示されたイメージアイコンをクリックすると、図に示す画面が現われます。
これをVBA制御により「名前を付けて保存」ボタンを押したいのですがうまくいかずご教授頂きたいです。
(なお、恐縮ながらSendkeysを利用する方法は求めておりません。また、こちら社内システムででてくる画面であるためリンクを示すことができません、申し訳ございませんがご理解願います。)

質問は↑につきますが、やってみたこと①②について補足で示します。
①SendMessageを利用する場合
https://oshiete.goo.ne.jp/qa/1809850.html

→コピペでやりたいことにかなり近いことができましたが、「開く(O)」ボタンを押してしまっています。若干理解不足ではありますが、このソースでは、「名前を付けて保存」、又は「保存」という記述しかないのに、なぜ「開く」ボタンが押さる挙動となるのかわかっていません。

②UIAutomationを利用する場合
https://oshiete.goo.ne.jp/qa/9622324.html

→エラーがでてしまい、うまくボタンをおすところまで行きませんでした。
わからないなりにUIAutomation関連の知識を入れながらパラメータを変えての試行錯誤しましたがギブアップです。うまくボタンをとらえることができません。(いや、知識不足がかなり大きいです。。)

こちらは、以前「通知バー」制御に関する投稿させて頂いた内容で、うまくいった経緯があること、また、「名前を付けて保存」ボタンが押下が成功したら、後の「名前を付けて保存ダイアログボックス」制御がそのまま利用できそうなので試してみた次第です。

IE上に表示されたイメージアイコンをクリックすると、図に示す画面が現われます。
これをVBA制御により「名前を付けて保存」ボタンを押したいのですがうまくいかずご教授頂きたいです。
(なお、恐縮ながらSendkeysを利用する方法は求めておりません。また、こちら社内システムででてくる画面であるためリンクを示すことができません、申し訳ございませんがご理解願います。)

質問は↑につきますが、やってみたこと①②について補足で示します。
①SendMessageを利用する場合
https://oshiete.goo.ne.jp/qa/18...続きを読む

Aベストアンサー

こんな感じですかね。
---
Option Explicit
'参照設定 UIAutomationClient
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr

Sub hoge()

Dim o As IUIAutomation
Dim e As IUIAutomationElement
Set o = New CUIAutomation
Dim h As LongPtr

h = FindWindowEx(0, 0, "#32770", "Internet Explorer")
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)

Dim iCnd As IUIAutomationCondition
iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "名前を付けて保存(A)")

Dim Button As IUIAutomationElement
Button = e.FindFirst(TreeScope_Subtree, iCnd)

Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke

End Sub

こんな感じですかね。
---
Option Explicit
'参照設定 UIAutomationClient
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr

Sub hoge()

Dim o As IUIAutomation
Dim e As IUIAutomationElement
Set o = New CUIAutomation
Dim h As LongPtr

h = FindWindowEx(0, 0, "#32770", "Internet Explorer")
If h = 0 Then Exit Sub
Set e...続きを読む

QIEのダウンロード通知バーVBA制御

下記URLを参考にUIAutomationClientを利用して通知バーを制御していますが、通知バーはでているのにボタン取得に失敗しやすいです。
また、分割の名前を付けて保存
http://okwave.jp/qa/q8121989.html
基本的にSetの箇所にDo while オブジェクト is nothingを入れて確実に取得できるようにしました。しかし、そうすると取得までに時間がかかる場合があります。時間短縮の方法をアドバイス頂きたいのがこの度の趣旨になります。

具体的にはダウンロード時に名前を付けて保存をしたいのですが、例えば保存バーがでているのにドロップボタンを押すまで時間がかかる。また、ドロップボタンは押せているのに名前を付けて保存をなかなかすぐに押してくれないといった感じです。またその後の保存ダイアログでも同様に、表示されているのになかなか押してくれないといった状況です。
やはり、オブジェクトの取得がうまくできていないためWhileでぐるぐると取得するのに時間を費やしているようでした。どのようにすれば時間短縮ができるかアドバイス頂けると助かります。回答でなくても、これやってみたら?みたいな感じでアドバイス頂けると助かります。
宜しくおねがいします。

下記URLを参考にUIAutomationClientを利用して通知バーを制御していますが、通知バーはでているのにボタン取得に失敗しやすいです。
また、分割の名前を付けて保存
http://okwave.jp/qa/q8121989.html
基本的にSetの箇所にDo while オブジェクト is nothingを入れて確実に取得できるようにしました。しかし、そうすると取得までに時間がかかる場合があります。時間短縮の方法をアドバイス頂きたいのがこの度の趣旨になります。

具体的にはダウンロード時に名前を付けて保存をしたいのですが、例えば保存バ...続きを読む

Aベストアンサー

IE制御に於いてループ中のDoEventsは遅延を招くそうで、Sleepに置き換えるとか。

(ネットワークタブでキャプチャすれば)
後は、F12Chooser.exeを制御してダイアログや通知バーが表示されるタイミングで、ファイルへのアドレスが分かるので、
(UI Automation辺りで)

XMLHTTPとADODB.Streamの組み合わせでダウンロードするとか、ぐらいですかね。

QVBA IE操作でダイアログ表示後、ファイルを開くボタンが押下できない

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を操作するマクロを作っています。

ホームページでCSVダウンロードボタンを押すと、添付図の様なダイアログが表示されます。
このダイアログで"ファイルを開く(o)"のボタンを押したいのですが、方法が分かりません。
Sendkeyで試しましたが不安定なため、別の方法がないか探していたところ、この教えてgooでタイトル「IE操作時、ファイルのダウンロードボタンの押下」を見つけました。

早速、そこのベストアンサーになっていたコードをコピーし、下記2か所のみ変更し組み込みました。①親ウィンドウ...続きを読む

Aベストアンサー

>コンパイルエラーとなっている行番号は、下記です。

まず、行番号の使い方が違っていて、行番号は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#NotificationBar

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

私は、この手のコードは試したことがありません。通常、事前にダウンロード名が取れますので、後は、直接ダウンロードしてしまいます。ファイルを開くを押しても、インターネットキャッシュにてダウンロードして、展開するだけだと思います。

>コンパイルエラーとなっている行番号は、下記です。

まず、行番号の使い方が違っていて、行番号はBasic の時代だけではありません。VB系の行番号は、エディタの行番号とは違います。VBのコードの行番号は、プログラムの書法のひとつです。Win32 API や dim の所には行番号は入れてはいけないのです。

今回の掲示のコードは、VBA のコードではありません。VB.Net のコードです。

次に、このような目的のコードは、緊急避難的なもので、時々、ダウンロード・ファィル名が、通知バーが出るまで分からないものが...続きを読む

QWebページ中の javascript をVBAから実行するには

VBAで objIE を使用して Webページ中の javascript を実行したいのですが、
onclick="~~" の記述がないケースがあり困っております。
例えば以下のような記述です。

<a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>

onclick の記述がない上記のようなケースでは、javascript の呼び出しはどのようにすればよいのでしょうか?
不可能でしょうか?

Aベストアンサー

ここを読んでみればよいのですが、だらだらと文章が長いですね。^^;
http://www.ken3.org/vba/backno/vba170.html
この内容のまとめは、この後でします。もし、ダメだったら、こちらも読んでください。

>onclick="~~" の記述がないケースがあり困っております。

最初に、ストレートな回答ではありませんが、私の場合、いくつかの方法を試しています。

>a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>
この場合は、id がありますから、確実のオブジェクトとして取得できますから、まず最初に、ダメ元で、
id名.Click を一度試してみます。もしくは、この行の上部のコードのオブジェクトのClass名のオブジェクトのひとつから、ヒットさせようとします。

そこでダメなら、ということで、ken3の内容に入るのですが、この著者の結論(正解)は、

ご質問に沿って書くと
For i =0 To objIE.Document.links.Length -1
If objIE.Document.links(i).href ="javascript:;" Then '文字の比較は、大文字・小文字がある
   objIE.Document.Links(i).Click
End if
Next i

ということになっています。私は、このコードは少し古臭く感じます。

ここで、ken3 の所では、Testサイトを用意してくれているので、試してみましたが、ダイレクトでサイトがとれている限りは、やはり、

Testサイト:http://www.ken3.org/vba/test170f.html

 objIE.Navigate "javascript:xxxxx;"

が利くことが分かりました。ただし、実際は、ここで時間待ちをしなくてはならないでしょう。
解説は、フレームからですので、うまく行かなかったようです。

ここを読んでみればよいのですが、だらだらと文章が長いですね。^^;
http://www.ken3.org/vba/backno/vba170.html
この内容のまとめは、この後でします。もし、ダメだったら、こちらも読んでください。

>onclick="~~" の記述がないケースがあり困っております。

最初に、ストレートな回答ではありませんが、私の場合、いくつかの方法を試しています。

>a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>
この場合は、id がありますから、確実のオブジェクトとして取得できますか...続きを読む

Q起動済みのIEをハンドルから操作するには

既に起動済みのIEブラウザをWSH(VBS)などから、ハンドルを取得して
HTMLソース内のフォームに値をセット(Document forms elementなどで)
する事はできますでしょうか?
出来るとすれば、IEを捕まえて操作するには、どのようにすれば良い
でしょうか?

■補足
起動したIEは、自身のスクリプトからオブジェクトを生成したもの
では無く、ウインドウタイトルくらいしか解りません。

Aベストアンサー

とりあえず
Set ie = GetObject("", "InternetExplorer.Application")
Set ie = GetObject(, "InternetExplorer.Application")
のどちらかで取得できると思います。
Set ie = CreateObject("Shell.Application").Windows(0)
で取得する方法もあるらしいのですが、普通のフォルダもieとして認識してしまうため、純粋にieだけを取得する場合はチェックが必要だと思います。
取得したieでyahooで"おいしいラーメン"の検索結果の件数を表示します。
Sub sample()
Const READYSTATE_COMPLETE = 4
Dim ie As Object
Dim obj As Object
For Each obj In CreateObject("Shell.Application").Windows
If TypeName(obj.Document) = "HTMLDocument" Then
Set ie = obj
Exit For
End If
Next
If ie Is Nothing Then
MsgBox "ありません"
Exit Sub
End If
MsgBox "取得したieの情報" & vbCrLf & ie.LocationName & vbCrLf & ie.LocationURL & vbCrLf & TypeName(ie.Document)
ie.Navigate "www.yahoo.co.jp" 'yahooへ
Do While (ie.ReadyState <> READYSTATE_COMPLETE) Or ie.Busy: Loop '表示待ち
ie.Document.forms("sf1").elements("srchtxt").Value = "おいしいラーメン" '検索文字
ie.Document.forms("sf1").submit '検索
Do While (ie.ReadyState <> READYSTATE_COMPLETE) Or ie.Busy: Loop '表示待ち
If InStr(ie.Document.body.innertext, "に一致するウェブページは見つかりませんでした") > 0 Then
MsgBox "0件"
Else
MsgBox ie.Document.all("yschinfo").all(6).innertext & "件"
End If
Set ie = Nothing
End Sub

とりあえず
Set ie = GetObject("", "InternetExplorer.Application")
Set ie = GetObject(, "InternetExplorer.Application")
のどちらかで取得できると思います。
Set ie = CreateObject("Shell.Application").Windows(0)
で取得する方法もあるらしいのですが、普通のフォルダもieとして認識してしまうため、純粋にieだけを取得する場合はチェックが必要だと思います。
取得したieでyahooで"おいしいラーメン"の検索結果の件数を表示します。
Sub sample()
Const READYSTATE_COMPLETE = 4
Dim ie As Ob...続きを読む

Q【VBA】UI Automationコンボボックスを制御したい

添付画像に示すような、あるアプリ(非MicroSoft)で表示される2つのコンボボックスをもつダイアログボックスをUI AutomationでVBA制御したいです。
(参照添付画像:調べたコントローラ情報も載せました。)
具体的に制御したい事は以下2点ですが、うまく動作できないためご助言を頂きたいです。

■制御したいこと
①右側のコンボボックスを▼を押す。
→現状:左側のコンボボックスの▼が押されてしまう。
②任意のファイル形式を選択する。
→現状:入力はできないため、ボックス内にあるPNG形式を選択したい。

■実際にやったこと。
制御コードは、下記サイトの最下段コード「通知バーの名前を付けて保存」を参考にしました。
<https://www.ka-net.org/blog/?p=4855>
①の対応のみ(以下参照)
Set uiAuto = New UIAutomationClient.CUIAutomation
Set elmRoot = uiAuto.GetRootElement

Set W= uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "開く")
'この開くは、ダイアログボックスの名前
Set X= uiAuto.CreatePropertyCondition(UIA_ClassNamePropertyId, "#32770")
Set Y= uiAuto.CreateAndCondition(W, X)

Set Z = elmRoot.FindFirst(TreeScope_Subtree, Y)

 SET A = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "開く")
'(この「開く」は、どちらコンボボックスも▼(ドロップダウン)の名前が「開く」という名前であったため採用)
 SET B = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_ButtonControlTypeId)
 SET C =uiAuto.CreateAndCondition(A,B)

Set O = Z.FindFirst(TreeScope_Subtree, C)
Set P= O.GetCurrentPattern(UIA_InvokePatternId)
P.Invoke

その他下記2つも試してみましたが、Set Zで取得できずでした(Z is Nothing)。
・Set Aで、"開く"→"ファイルの種類(T):" (右側のコンボボックスの名前)
・Set Bで、UIA_ButtonControlTypeId → UIA_ComboBoxControlTypeId

なお、②については対応方針を打ち出せていないです。
このような状況ですが、ご助言頂けると助かります。

添付画像に示すような、あるアプリ(非MicroSoft)で表示される2つのコンボボックスをもつダイアログボックスをUI AutomationでVBA制御したいです。
(参照添付画像:調べたコントローラ情報も載せました。)
具体的に制御したい事は以下2点ですが、うまく動作できないためご助言を頂きたいです。

■制御したいこと
①右側のコンボボックスを▼を押す。
→現状:左側のコンボボックスの▼が押されてしまう。
②任意のファイル形式を選択する。
→現状:入力はできないため、ボックス内にあるPNG形式を選択したい。
...続きを読む

Aベストアンサー

http://wayback.archive.org/web/20130322175258/http:/www.moug.net/faq/viewtopic.php?t=65909
まあ、自分も教わったクチなので余り大した事が言えません・ω・

>IUIAutomationElementArray
複数の要素を一度に取得して、ループさせてインデックスで目的の要素を判別したらどうでしょう。

QWEBページからのメッセージをVBAで

いつもお世話になっております。
エクセルVBAでIE制御についてです。
環境はWIN7、IE 9or11とエクセル2010です。

あるページのリンクをクリックすると、
WEBからのメッセージというダイアログボックスが出てきて、
続行しますか? はい いいえ を聞かれます。

その「はい」をVBAで押したいのですが、
sendkeysメソッドで押そうとしてもうまくいきません。

以下に記載したサイトのOKボタンを押すと出てくるものです。
http://kamicha1.web.fc2.com/Excel/Test20090726.html


以下が書いたコードです。


Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)


Sub test()

Dim ie As Object

Set ie = CreateObject("InternetExplorer.Application")

ie.Visible = True
ie.navigate "http://kamicha1.web.fc2.com/Excel/Test20090726.html"
      
Do While ie.Busy Or ie.readyState < 4
DoEvents
Loop

ie.document.getElementsByClassName("bt2")(0).Click '-ここで止まる

Sleep 2000

SendKeys "{Enter}"

End Sub

ステップ実行していくと、ここで止まると書いた所で、
IE上にダイアログは表示されるのですが、
それ以上ステップ実行ができなくなってしまいます。

ダイアログを自分でOKかキャンセルで消すと続きが動くようになります。
その間はVBEはビジー状態となり操作できません。

そのためそれ以降のsendkeysメソッドに
たどり着けない状況かと思われます。

いろいろ調べたところIE8以降はダイアログボックスは
IEから出ているのではなくOS?から出ているとの事でした。

上記のサイトはHTML本体にjavaスクリプトが記載されており、
それをVBAから操作すればどうにかOKボタンが押せるらしいのですが、
自分が操作したいページにはそれらしき記載がありませんでした。

対象のアンカータグは
<a herl=URL 中略 data-comfirm=続行しますか? >
のような感じで記載がありました。

完全に煮詰まっております。
自動でOKをクリックするかEnterキーでOKを押すでも構いません。
どうかご教授お願いいたします。

いつもお世話になっております。
エクセルVBAでIE制御についてです。
環境はWIN7、IE 9or11とエクセル2010です。

あるページのリンクをクリックすると、
WEBからのメッセージというダイアログボックスが出てきて、
続行しますか? はい いいえ を聞かれます。

その「はい」をVBAで押したいのですが、
sendkeysメソッドで押そうとしてもうまくいきません。

以下に記載したサイトのOKボタンを押すと出てくるものです。
http://kamicha1.web.fc2.com/Excel/Test20090726.html


以下が書いたコードです。


Dec...続きを読む

Aベストアンサー

ご参考
https://gist.github.com/kumatti1/4028479

QExcel VBAでのIE操作でクリックができないボタンはあるのでしょうか

お世話になります。

Excel2016 32bit Windows10

IE自動操作に取り組んでいます。まだ勉強が足りず、ボタンのクリックができません(画像Gカレンダー保存ボタン)。
InputTypeでもaタグでもありません。idで取得はでき、roleがボタンでタブ選択もできるのに、VBAでクリックができません。
この手のボタンはVBA操作不可能なのでしょうか。初歩的な質問かもしれませんが、みなさまのお力添えを頂きたいです。

<div class="goog-inline-block goog-imageless-button" role="button" tabindex="0" style="user-select: none;">
<div class="goog-inline-block goog-imageless-button-outer-box">
<div class="goog-inline-block goog-imageless-button-inner-box"><div class="goog-imageless-button-pos">
<div class="goog-imageless-button-top-shadow"></div>
<div class="goog-imageless-button-content">保存</div>
</div>
</div>
</div>
</div>

お世話になります。

Excel2016 32bit Windows10

IE自動操作に取り組んでいます。まだ勉強が足りず、ボタンのクリックができません(画像Gカレンダー保存ボタン)。
InputTypeでもaタグでもありません。idで取得はでき、roleがボタンでタブ選択もできるのに、VBAでクリックができません。
この手のボタンはVBA操作不可能なのでしょうか。初歩的な質問かもしれませんが、みなさまのお力添えを頂きたいです。

<div class="goog-inline-block goog-imageless-button" role="button" tabindex="0" style="us...続きを読む

Aベストアンサー

こんにちは。

すみません。画像が、ものすごく小さかったのが災いしたのと、

「:jc.save_top」って、wrapper となっている所をみると、何かと組み合わさっていると思います。それをクリックされようとしていたので、なんだろうと考えしまいました。

>(画像Gカレンダー保存ボタン)

カレンダーの赤い「保存ボタン」をクリックですか?
質問の回答になっているのか、あまり確信がありません。

初歩の初歩としては、
<div class="goog-imageless-button-content" unselectable="on">保存</div>
ここから、

With objIE

Set buttons = .Document.getElementsByClassName("goog-imageless-button-content")
For Each n In buttons
   If n.innerText Like "保存*" Then ''= "保存" でもよい
    n.Click
    Exit For
   End If
Next n

End With

で、行けるのではないでしょうか。
もちろん、オブジェクト配列になっているはずですから、それで、何番目か探して、直接、buttons(9).Clickとしても行けるかとは思います。

質問と食い違っていたら、補足をつけてください。

それと、余談なのですが、Googleで、IEを使うのは抵抗ありませんか?フルに動かないと思います。かと言って、Google Chrome をVBAで扱う方法が、なぜか確立できていませんね。Selenium VBAを使うことにはなっているのですが、いろいろやってみて、どうやらバージョンが遅れていることに気が付きました。前から、ずっと遅れているようです。

こんにちは。

すみません。画像が、ものすごく小さかったのが災いしたのと、

「:jc.save_top」って、wrapper となっている所をみると、何かと組み合わさっていると思います。それをクリックされようとしていたので、なんだろうと考えしまいました。

>(画像Gカレンダー保存ボタン)

カレンダーの赤い「保存ボタン」をクリックですか?
質問の回答になっているのか、あまり確信がありません。

初歩の初歩としては、
<div class="goog-imageless-button-content" unselectable="on">保存</div>
ここから、

Wit...続きを読む


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

人気Q&Aランキング