アレルギー対策、自宅でできる効果的な方法とは?

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

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


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

「vbaでIEの名前を付けて保存(A)をし」の質問画像

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

A 回答 (1件)

VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。

| 初心者備忘録
http://www.ka-net.org/blog/?p=4855
とか。
    • good
    • 1
この回答へのお礼

詳しいサイトを教えていただきありがとうございました。うれしいです。

お礼日時:2014/10/25 01:00

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

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

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

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

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

QIE操作時、ファイルのダウンロードボタンの押下

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

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

よろしくお願いします!

Aベストアンサー

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

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 lP...続きを読む

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

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

QVBAを使い、Web上からファイルをダウンロードしたいのですが・・・

はじめまして。
今、日証金から日々の融資・貸株残高のデータ(CSV)を自動的に
ダウンロードしてExcelに取り込むというマクロを作ろうとして
いるのですが、うまくいきません。


具体的には、

range("A1").value = "http://www.jsf.co.jp/de/stock/dlcsv.php?target=balance&date=" & format(now,"YYYY-MM-DD")
range("A1").select
Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True

しかし、これだと「ファイルを保存」のWindowがあがってしまうので
処理が途中で止まります。

VBAで、あらかじめ指定したディレクトリに、指定したURLからファイルを自動的にダウンロードする
には、どのようにすればよいのでしょうか?

Aベストアンサー

ちょっと無茶ですね・・・。
APIという機能を使う事になります。
これでVBAの機能を拡張して新たな機能を取り込む事ができるようになります。


http://www.accessclub.jp/bbs5/0009/vba2406.html
http://www.ken3.org/vba/backno/vba120.html

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 がありますから、確実のオブジェクトとして取得できますか...続きを読む

QIE9のダウンロード通知バーで名前を付けて保存

IE9のダウンロード通知バーをVBAから制御する方法について、下記のQ&Aでkumatti1さんの解にあるコードでは「保存」をさせる動作となっています。これを「名前に付けて保存」させることはできないでしょうか。よろしくお願いします。
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

--------------------------------------------------------------------------------

IE9のダウンロード通知バーをVBAから制御する方法について、下記のQ&Aでkumatti1さんの解にあるコードでは「保存」をさせる動作となっています。これを「名前に付けて保存」させることはできないでしょうか。よろしくお願いします。
http://okwave.jp/qa/q8121989.html

--------------------------------------------------------------------------------
Option Explicit
'参照設定 UIAutomationClient
'C:\Windows\System32\UIAutomationCore.dll
Private Declare PtrSafe Function FindWindowEx Lib "user32"...続きを読む

Aベストアンサー

後は、先の保存ダイアログのコードと組み合わせて使うだけです。
以上。

QEXCEL VBAでWEBページ保存2

何度もお世話になります、よろしくお願いいたします。

本日、EXCEL VBAでWEBページを完全保存する方法を質問して
下記を紹介していただきました。
Option Explicit
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" ( _
ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long

--------------------------------------------------------------------------------

Sub DownloadFileFromWeb()
Const strUrl As String = "http://www.puremis.net/excel/index.shtml"
Dim strSavePath As String
Dim returnValue As Long
strSavePath = ThisWorkbook.Path & "\" & "Test.htm"
returnValue = URLDownloadToFile(0, strUrl, strSavePath, 0, 0)
If returnValue = 0 Then
MsgBox "Sccess!"
Else
MsgBox "Did not success."
End If
End Sub
-------------------------------------------------
この状態だと動作は完璧なんですが
たくさんのWEBページを保存するようにVBAを組みたいので
HPアドレスの部分に変数を使いたいのです。
この部分です:Const strUrl As String = "http://www.puremis.net/excel/index.shtml"

でも変数を使うとエラーになってしまうので困り果てております。何か良い方法はございませんでしょうか。
よろしくお願いいたします。

何度もお世話になります、よろしくお願いいたします。

本日、EXCEL VBAでWEBページを完全保存する方法を質問して
下記を紹介していただきました。
Option Explicit
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" ( _
ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, _
...続きを読む

Aベストアンサー

こんにちは。

> WEBページを完全保存する方法

ご質問なさっていることは、かなり面倒なことです...ね。

ご存じかもしれませんが、WEB ページとは HTML ファイル以外にも

 ・CSS スタイルシートファイル
 ・JS などのスクリプトファイル
 ・画像ファイル

など複数の外部ファイルで構成されています。

 # もちろん、HTML 単一で構成されたページもあります。

ご質問文にあるコードだと、この内 HTML ファイルのみローカルに保存して
いるだけで、出力されたファイルをブラウザで開くと、フルパス指定されて
いない画像などは欠けた状態になるはずです。

画像等も含めてローカルに保存したい場合、URLDownloadToFile API を使用
するなら、HTML の中で参照されている先述の外部ファイルも一緒に
URLDownloadToFile API でダウンロードし、かつ HTML ファイルを解析して
参照リンクも書き変えなければなりません。

■案1. IE を操作して保存ダイアログを使う方法

' // IE で WEB ページを保存する
Sub Sample1()

  Const READYSTATE_COMPLETE   As Long = 4
  Const OLECMDID_SAVEAS     As Long = 4
  Const OLECMDEXECOPT_PROMPTUSER As Long = 1
  
  Dim ie As Object  ' // InternetExplorer
  Dim url As String
  
  url = "http://www.goo.ne.jp/"
  
  ' // ie を起動して目的のページを開く
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = True
  ie.Navigate url
  While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
    DoEvents
  Wend
  ' // 初期ファイル名を指定するため WEB ページタイトルを変更します
  ie.Document.Title = "test"
  ' // ie の保存ダイアログを表示します
  ie.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER

End Sub

保存ダイアログの自動化は可能ですけど、API を駆使した面倒なコードになり
ますので省略します。


■案2. MHT ファイルでも良ければ...な方法(Windows2000以降限定)

参考(Wiki): http://ja.wikipedia.org/wiki/MHTML

Sub sample2()

  ' // この方法でも完全ではないが、実用上はほぼ問題ないか。。な

  Const cdoSuppressNone    As Long = 0
  Const adSaveCreateOverWrite As Long = 2
  
  Dim msg     As Object ' // CDO.Message
  Dim stm     As Object ' // ADODB.Stream
  Dim url     As String
  Dim outFilename As String
  
  url = "http://www.goo.ne.jp/"
  outFilename = ThisWorkbook.Path & "\sample.mht"
  
  Set msg = CreateObject("CDO.Message")
  msg.CreateMHTMLBody url, cdoSuppressNone, "", ""
  Set stm = msg.GetStream
  stm.SaveToFile outFilename, adSaveCreateOverWrite
  stm.Close

  Set stm = Nothing
  Set msg = Nothing

End Sub

要するに、メールのように HTML に画像ファイルなどが添付されるような
イメージです。

なお、コードは一切エラー処理はしてませんし、必要最小限しか書いてません。
お試しになる場合は、ご自身で試行錯誤してみて下さい。

こんにちは。

> WEBページを完全保存する方法

ご質問なさっていることは、かなり面倒なことです...ね。

ご存じかもしれませんが、WEB ページとは HTML ファイル以外にも

 ・CSS スタイルシートファイル
 ・JS などのスクリプトファイル
 ・画像ファイル

など複数の外部ファイルで構成されています。

 # もちろん、HTML 単一で構成されたページもあります。

ご質問文にあるコードだと、この内 HTML ファイルのみローカルに保存して
いるだけで、出力されたファイルをブラウザで開くと...続きを読む

QVBAからIEを操作する時のウィンドウの選択の仕方がわかりません

VBAで、webページを操作するマクロを組んでいます。
具体的な手順としては、セルの商品番号をweb上の検索ボックスに入力して、別ウィンドウで開いた情報を「すべて選択」「コピー」してexcellの別シートに「貼り付け」までを行うものなのですが、
別ウィンドウで開いたページに対して、Sendkeysを行うにはどうやったらいいのでしょうか。
仮に、入力ページをA、結果ページをBとしたとき、Aに対しての入力とBページの表示までは出来ているのですが、Bページに対しての操作が出来ません。

ちなみに、事情があってwebクエリはあえて使っていません。
どなたか、いい解決方法・プロシージャをご存知でしたらよろしくお願いします。

Aベストアンサー

こんにちは。KenKen_SP です。

検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか?
例えば、教えてGooなら

http://oshiete1.goo.ne.jp/kotaeru.php3?q=


URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。
q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、
この URL に質問番号を連結してやれば、直接開くことができます。

仮に、質問番号が A1 セルに入っているなら

IE.Navigate "http://oshiete1.goo.ne.jp/kotaeru.php3?q=" & Range("A1").Value

みたいなコードで検索結果ページを開くことができると思います。同様に、商品番号
を渡すパラメータがあるはずですから、探して見て下さい。CGI にパラメータを渡す
方法が Get でも Post の場合でも検索フォームの HTML ソースを見れば分かります。

取り合えず、一度検索フォームの HTML ソースを見てみましょう。

これが可能なら、コードで IE オブジェクトを作り、直接検索結果のページを開くこ
とができますので、IE のウインドウハンドルやウインドウタイトルは簡単に取得
できます。

簡単な例です。A1 セルの値を Google で検索し、結果を A5 セルに貼り付けます。


Option Explicit

Private Declare Function SetForegroundWindow Lib "user32.dll" ( _
  ByVal hWnd As Long _
) As Long
  
Sub Sample()

  Dim IE   As Object
  Dim strURL As String
  Dim lngRet As Long
  
  Const READYSTATE_COMPLETE = &H4
  
  strURL = "http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q="
  strURL = strURL & Range("A1").Value
   
  Set IE = CreateObject("InternetExplorer.application")
  IE.Visible = True
  IE.navigate strURL
  Do
    DoEvents
  Loop Until Not IE.Busy And IE.readyState = READYSTATE_COMPLETE
  
  ' IE のウインドウをアクティブにする
  lngRet = SetForegroundWindow(IE.hWnd)
  If lngRet <> 0 Then
    ' アクティブにできたらキー送信して結果をコピー
    SendKeys "^a", True
    SendKeys "^c", True
    ' 貼り付け
    Range("A5").Select
    ActiveSheet.Paste
  End If
  Set IE = Nothing

End Sub

どうしても検索フォームを経由し、新しい IE を開く必要がある場合は、
参考 URL 先の記事が参考になると思います。

参考 URL: http://www.ken3.org/cgi-bin/group/vba_ie.asp

ちなみに、SendKeys を使わない方法としては、IE.Document.body.innerHTML
で HTML ソースは取得し、クリップボードに転送してからペースト、、

というのでも良いかもしれません。

では。

こんにちは。KenKen_SP です。

検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか?
例えば、教えてGooなら

http://oshiete1.goo.ne.jp/kotaeru.php3?q=


URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。
q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、
この URL に質問番号を連結してやれば、直接開くことができます。

仮に、質問番号が A1 セルに入っているなら

IE.Navigate "http://oshiete1.goo.ne.jp/kot...続きを読む

Q(UWSC) 「#32770」の意味わかりますか?

(UWSC)で、他人が作ったプログラムを見ています。

その中で、
GETID("タイトルの名前","#32770")
となっている箇所があります。
この"#32770"の意味がわかる方いらっしゃいますか?

教えてください。

Aベストアンサー

> この"#32770"の意味

ダイアログのクラス名

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。


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

人気Q&Aランキング

おすすめ情報