• 締切
  • 困ってます

ダウンロードダイアログをVBAから操作するには?

  • 質問No.1809850
  • 閲覧数16749
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 50% (1/2)

ExcelVBAで、IEを操作してます。
submitでダウンロードダイアログが表示される
HPで、ダウンロードダイアログを操作したい(保存、ファイル名指定)のですがどういう方法がありますか?
対象オブジェクト.sendkeysも考えましたが
対象オブジェクトが何であるのかわかりません。
どうかよろしくお願いします。

回答 (全2件)

  • 回答No.2

ベストアンサー率 69% (477/687)

>やれるならsendkeysでやろうと思っています。

個人的には、このメソッドは嫌いですが、sendkeysでやることに反対はしません。


徹夜サポで暇してます。

ここを参考にやってみました。
http://okwave.jp/kotaeru.php3?q=894824


sendkeysは使用しておりませんが、もし使用する場合にも参考になるかと思います^^


Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetDlgCtrlID Lib "user32" (ByVal hwnd As Long) As Long

Private Const WM_COMMAND As Long = &H111
Private Const CLASSNAME_ダイアログ As String = "#32770"
Private Const CLASSNAME_ボタン   As String = "Button"

Private Sub Test()
  Const STEP1_TITLE  As String = "ファイルのダウンロード"
  Const STEP2_TITLE  As String = "名前を付けて保存"

  Dim l_lngWnd_Window_Step1  As Long
  Dim l_lngWnd_Window_Step2  As Long
  
  'step1
  If Not FindDialog(STEP1_TITLE, l_lngWnd_Window_Step1) Then
    Exit Sub
  End If
  Call PushSaveBtn(l_lngWnd_Window_Step1)
  
  
  'step2
  If Not FindDialog(STEP2_TITLE, l_lngWnd_Window_Step2) Then
    Exit Sub
  End If
  Call PushSaveBtn(l_lngWnd_Window_Step2)
End Sub

'ダイアログを探す
Private Function FindDialog(ByVal p_strCaption As String, ByRef p_lngFindWnd As Long) As Boolean
  p_lngFindWnd = 0
  Do
    DoEvents
'    If Not IEがBUSY Then
'      Exit Do
'    End If
    p_lngFindWnd = FindWindow(CLASSNAME_ダイアログ, p_strCaption)
  Loop While p_lngFindWnd = 0
  
  FindDialog = p_lngFindWnd <> 0
End Function

'ボタンを押す
Private Sub PushSaveBtn(ByVal p_lngWindowWnd As Long, Optional p_strBtnCaption As String = "保存(&S)")
  Dim l_lngWnd_Save  As Long
  l_lngWnd_Save = FindWindowEx(p_lngWindowWnd, 0, CLASSNAME_ボタン, p_strBtnCaption)
  Call SendMessage(p_lngWindowWnd, WM_COMMAND, GetDlgCtrlID(l_lngWnd_Save), ByVal l_lngWnd_Save)
End Sub
お礼コメント
oldhacker

お礼率 50% (1/2)

大変助かりました。メドがつきそうです。
sendkeysは使わずにやってみます。
ありがとうございました。
投稿日時:2005/12/02 11:34
  • 回答No.1

ベストアンサー率 69% (477/687)

確かXPのSPの状況によって、ダウンロードダイアログの出方が異なったと思います。

さらにOS別を考慮すると、さらにパターンが増えます。

個別のSendKeysパターンを網羅するプログラムを組むか、WM_COMMANDでOKボタンを押させる必要があると思います。
http://okwave.jp/kotaeru.php3?q=199357
補足コメント
oldhacker

お礼率 50% (1/2)

ご回答ありがとうございます。
対象OSは限定ですので(XP SP2)
やれるならsendkeysでやろうと思っています。

sendkeysを送るタイミングも不明で、
busyを検知しておけばいいかと思ったら、
ダウンロードダイアログが表示してる間はbusyの
ようで状況把握を何のプロパティで確認すれば
よいかわかりません。
投稿日時:2005/11/30 23:15
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

ピックアップ

ページ先頭へ