「VBA ファイル ダウンロード」といったキーワード検索でのアクセスがありました。
Office系のQ&Aサイトを見ても「VBAでインターネット上のファイルをダウンロードしたい」という要望は多いようなので、色々な方法をまとめてみることにしました。
注意点
- 当記事は元々2014年に公開したものですが、一部冗長な処理があったので、2019年2月に改めて書き直すことにしました。
- 当記事に掲載しているコードは、Windows 10 Pro バージョン 1809 64ビット版+Office 365 ProPlus バージョン 1903 32ビット版、Windows 7 Professional 64ビット版+Office 2013 32ビット版で動作確認を行いました。
- 環境によってはコードが上手く動作しない可能性がありますので、その点はご注意ください。
目次
- URLDownloadToFileを使ってファイルをダウンロードする方法
- XMLHTTPRequest + ADODB.Streamを使ってファイルをダウンロードする方法
- Basic認証によるアクセス制限がかかったサイトのファイルをダウンロードする方法
- フォーム認証によるアクセス制限がかかったサイトのファイルをダウンロードする方法
- 通知バー/Internet Explorerダイアログを操作してファイルをダウンロードする方法
URLDownloadToFileを使ってファイルをダウンロードする方法
インターネット上でよく見かけるのがこの方法、API関数の「URLDownloadToFile」を使ってファイルをダウンロードする方法です。
Option Explicit
'※ 64ビット版Officeアプリケーションの場合は要修正
Private Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryW" ( _
ByVal lpszUrlName As Long) As Long
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileW" ( _
ByVal pCaller As Long, _
ByVal szURL As Long, _
ByVal szFileName As Long, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long
Public Sub Sample01()
DownloadFile "https://www.ka-net.org/images/logo.jpg", _
"C:\Test\Sample_001.jpg"
MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub
Private Sub DownloadFile(ByVal Url As String, ByVal SaveFilePath As String)
'URLDownloadToFileでファイルをダウンロード
'http://msdn.microsoft.com/en-us/library/aa383983.aspx
'http://msdn.microsoft.com/en-us/library/ms775123.aspx
'http://www.ken3.org/vba/backno/vba120.html 参考
Dim ret As Long
ret = 0 '初期化
DeleteUrlCacheEntry StrPtr(Url) 'キャッシュクリア
ret = URLDownloadToFile(0, StrPtr(Url), StrPtr(SaveFilePath), 0, 0)
If ret <> 0 Then MsgBox "処理が失敗しました。", vbCritical + vbSystemModal
End Sub
DeleteUrlCacheEntry関数でキャッシュを削除した後、URLDownloadToFile関数で指定したファイルを指定した場所に保存するという、シンプルなものですね。説明も要らないくらいです。
ダウンロードしたいファイルのURLが分かっている場合には、この方法を使うのが簡単です。
ただし、64ビット版Officeアプリケーションで上記のコードを動かす際には、APIの宣言部分を64ビット用に修正する必要があります。
XMLHTTPRequest + ADODB.Streamを使ってファイルをダウンロードする方法
次はXMLHTTPRequestとADODB.Streamを使ってファイルをダウンロードする方法の紹介です。
Option Explicit
Public Sub Sample02()
DownloadFile "https://www.ka-net.org/images/logo.jpg", _
"C:\Test\Sample_002.jpg"
MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub
Private Sub DownloadFile(ByVal Url As String, ByVal SaveFilePath As String)
'XMLHTTPRequest + ADODB.Streamでファイルをダウンロード
Dim req As Object
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Set req = CreateObject("Msxml2.XMLHTTP")
req.Open "GET", Url, False
'キャッシュ対策
'http://vird2002.s8.xrea.com/javascript/XMLHttpRequest.html#XMLHttpRequest_Cache-Control
'http://www.atmarkit.co.jp/ait/articles/0305/10/news002.html 参考
req.setRequestHeader "Pragma", "no-cache"
req.setRequestHeader "Cache-Control", "no-cache"
req.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
req.Send
Select Case req.Status
Case 200
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.Write req.responseBody
.SaveToFile SaveFilePath, adSaveCreateOverWrite
.Close
End With
Case Else
MsgBox "エラーが発生しました。" & vbCrLf & _
"ステータスコード:" & req.Status, _
vbCritical + vbSystemModal
Exit Sub
End Select
End Sub
大雑把に言えば、XMLHTTPRequestを使って指定したURLにリクエストを投げ、受け取ったバイナリ形式のレスポンスをADODB.Streamでローカルに保存する、というやり方です。
XMLHTTPRequestで上手くいかない場合は、下記のようにWinHttpRequestを使用してください。
Private Sub DownloadFile(ByVal Url As String, ByVal SaveFilePath As String)
'WinHttpRequest + ADODB.Streamでファイルをダウンロード
Dim req As Object
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.Open "GET", Url, False
req.Send
Select Case req.Status
Case 200
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.Write req.responseBody
.SaveToFile SaveFilePath, adSaveCreateOverWrite
.Close
End With
Case Else
MsgBox "エラーが発生しました。" & vbCrLf & _
"ステータスコード:" & req.Status, _
vbCritical + vbSystemModal
Exit Sub
End Select
End Sub
Basic認証によるアクセス制限がかかったサイトのファイルをダウンロードする方法
次はBasic認証によるアクセス制限がかかったサイトのファイルをダウンロードする方法の紹介です。
会員制のサイト等を開こうとしたとき、下図のようにユーザー名とパスワードの入力を求められた経験のある人も多いだろうと思いますが、このタイプの認証で多いのがBasic認証です。
Option Explicit
Public Sub Sample03()
DownloadFileBasicAuth "http://www.chama.ne.jp/htaccess_sample/index.htm", _
"C:\Test\BasicAuth.html", _
"chama", _
"1111"
MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub
Private Sub DownloadFileBasicAuth(ByVal Url As String, _
ByVal SaveFilePath As String, _
ByVal UserName As String, _
ByVal PassWord As String)
'XMLHTTPRequest + ADODB.Streamでファイルをダウンロード
'http://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC 参考
Dim req As Object
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Set req = CreateObject("Msxml2.XMLHTTP")
req.Open "GET", Url, False
'Authorizationヘッダーでユーザー名とパスワード送信
req.setRequestHeader "Authorization", "Basic " & EncodeBase64Str(UserName & ":" & PassWord)
'キャッシュ対策
req.setRequestHeader "Pragma", "no-cache"
req.setRequestHeader "Cache-Control", "no-cache"
req.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
req.Send
Select Case req.Status
Case 200
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.Write req.responseBody
.SaveToFile SaveFilePath, adSaveCreateOverWrite
.Close
End With
Case Else
MsgBox "エラーが発生しました。" & vbCrLf & _
"ステータスコード:" & req.Status, _
vbCritical + vbSystemModal
Exit Sub
End Select
End Sub
Private Function EncodeBase64Str(ByVal str As String) As String
'文字列をBase64エンコード
Dim ret As String
Dim d() As Byte
Const adTypeBinary = 1
Const adTypeText = 2
ret = "" '初期化
On Error Resume Next
With CreateObject("ADODB.Stream")
.Open
.Type = adTypeText
.Charset = "UTF-8"
.WriteText str
.Position = 0
.Type = adTypeBinary
.Position = 3
d = .Read()
.Close
End With
With CreateObject("MSXML2.DOMDocument").createElement("base64")
.DataType = "bin.base64"
.nodeTypedValue = d
ret = .Text
End With
On Error GoTo 0
EncodeBase64Str = ret
End Function
仕組みとしては、Authorizationヘッダーでユーザー名とパスワードを付けてリクエストを投げ、認証に成功したらファイルをダウンロードする、というやり方です。
Wikipediaの記事にも書いてある通り、Basic認証ではユーザー名とパスワードをBase64エンコードする必要があるため、そのための関数「EncodeBase64Str」を用意しています。
フォーム認証によるアクセス制限がかかったサイトのファイルをダウンロードする方法
次は、下図のようにWebページ上でユーザー名やパスワードを入力してログインするのが必要なサイト(フォーム認証とします)からファイルをダウンロードする方法を紹介します。
ここでは、下記のようにごく簡単な構成のテスト環境を用意してみました。
.htaccessでファイルの直アクセスを禁止し、auth.phpで認証に成功しないとsample.pdfファイルがダウンロードできないような仕組みです。
| localhost/auth | |||
| 1. login.html | ログインページ | ||
| 2. auth.php | 認証用ページ | ||
| 3. down.php | ファイルダウンロード用ページ | ||
| /files | |||
| 4. .htaccess | アクセス制限用ファイル | ||
| 5. sample.pdf | ダウンロードしたいファイル | ||
※ 下記コードはあくまでもテスト用に書いた簡易的な認証のコードです。実際のサイトには使用しないでください。
1. login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>認証サンプル</title>
</head>
<body>
<form method="post" action="auth.php">
<table>
<tr>
<td>ユーザー名:</td>
<td><input name="username" type="text" size="30"></td>
</tr>
<tr>
<td>パスワード:</td>
<td><input name="password" type="text" size="30"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="ログイン"></td>
</tr>
</table>
</form>
</body>
</html>
2. auth.php
<?php
define("PW", "pass"); //パスワード
define("UN", "user"); //ユーザー名
if(isset($_POST["password"]) && isset($_POST["username"])) {
if($_POST["password"]===PW && $_POST["username"]===UN){
session_start();
$_SESSION["password"] = md5(PW);
$_SESSION["username"] = md5(UN);
print "<!DOCTYPE html>\n";
print "<html>\n";
print " <head>\n";
print " <meta charset=\"UTF-8\">\n";
print " <title>認証確認</title>\n";
print " </head>\n";
print " <body>\n";
print ' <a href="./down.php">ファイルのダウンロード</a>' . "\n";
print " </body>\n";
print "</html>";
}else{
http_response_code(401);
}
}else{
http_response_code(403);
}
?>
3. down.php
<?php
define("PW", "pass"); //パスワード
define("UN", "user"); //ユーザー名
session_start();
if(isset($_SESSION["password"]) && isset($_SESSION["username"])) {
if($_SESSION["password"]===md5(PW) && $_SESSION["username"]===md5(UN)){
$file="./files/sample.pdf";
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=sample.pdf");
header("Content-Length: " . filesize($file));
readfile($file);
}else{
http_response_code(401);
}
}else{
http_response_code(403);
}
session_destroy();
?>
4. .htaccess
<Files ~ "\.(dat|log|csv|pdf)$"> deny from all </Files>
上記テスト環境でファイルをダウンロードするためのVBAコードは下記のようになります。
Option Explicit
Public Sub Sample04()
Dim req As Object
Dim dat As Variant
Const UserName = "user" 'ユーザー名
Const PassWord = "pass" 'パスワード
Const AuthUrl = "https://localhost/auth/auth.php" '認証ページのURL
Const FileUrl = "https://localhost/auth/down.php" 'ダウンロード対象のURL
Const SaveFilePath = "C:\Test\MyFile.pdf"
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Set req = CreateObject("Msxml2.XMLHTTP")
'認証
req.Open "POST", AuthUrl, False
dat = "username=" & UserName & "&password=" & PassWord 'パラメーター設定
req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
req.Send dat
If req.Status <> 200 Then
MsgBox "認証に失敗しました。" & vbCrLf & _
"処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End If
'ファイルのダウンロード
req.Open "GET", FileUrl, False
'キャッシュ対策
req.setRequestHeader "Pragma", "no-cache"
req.setRequestHeader "Cache-Control", "no-cache"
req.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
req.Send
Select Case req.Status
Case 200
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.Write req.responseBody
.SaveToFile SaveFilePath, adSaveCreateOverWrite
.Close
End With
Case Else
MsgBox "エラーが発生しました。" & vbCrLf & _
"ステータスコード:" & req.Status, _
vbCritical + vbSystemModal
Exit Sub
End Select
MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub
ユーザー名やパスワードといったパラメータ(上記コードではdat)を送信し、認証を通過してからファイルのダウンロードを行うやり方です。
(認証のやり方は色々あるので、必ずしも上記コードの方法が使えるわけではありません。)
このとき送信するパラメーターについては、Internet Explorerの開発者ツール(下図はInternet Explorer 11)を使って、実際にログインしたときの挙動をキャプチャーすることで確認できます。
POSTした内容は「Fiddler」等のツールでも確認することができます。
通知バー/Internet Explorerダイアログを操作してファイルをダウンロードする方法
最後に紹介するのが、ファイルをダウンロードしようとしたときに表示されるInternet Explorerの通知バーやInternet Explorerダイアログ((ファイル名) で行う操作を選んでくださいダイアログ)を操作してファイルをダウンロードする方法です。
ただし、この方法はOSやInternet Explorerのバージョンによっては動作しなくなる場合があり、環境に大きく依存するため、私としては正直お薦めしません。
※ UIAutomationClient参照時にエラーが発生する場合は「UIAutomationClient参照時にDLL読み込みエラーが発生した時の対処法」参照
Option Explicit
Public Sub Sample05()
'通知バーを操作してファイルをダウンロード
Dim elmAnc As Object
Const READYSTATE_COMPLETE = 4
With CreateObject("InternetExplorer.Application")
.Visible = True
.Navigate "https://saigai.gsi.go.jp/jusho/download/pref/47.html"
While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
For Each elmAnc In .document.getElementsByTagName("a")
If InStr(LCase(elmAnc.href), ".zip") Then
elmAnc.Click '適当なリンクをクリック → ダウンロード通知バー表示
Exit For
End If
Next
DownloadFileNbOrDlg .Hwnd, "C:\Test\TestFile001.zip"
.Quit
End With
End Sub
Public Sub Sample06()
'Internet Explorerダイアログを操作してファイルをダウンロード
Dim elmAnc As Object
Const READYSTATE_COMPLETE = 4
With CreateObject("InternetExplorer.Application")
.Visible = True
.Navigate "http://www.gender.go.jp/policy/suishin_law/csv_dl/index.html"
While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
For Each elmAnc In .document.getElementsByTagName("a")
If InStr(LCase(elmAnc.href), ".csv") Then
elmAnc.Click '適当なリンクをクリック → Internet Explorerダイアログ表示
Exit For
End If
Next
DownloadFileNbOrDlg .Hwnd, "C:\Test\TestFile002.csv"
.Quit
End With
End Sub
Private Sub DownloadFileNbOrDlg(ByVal hIE As Long, ByVal SaveFilePath As String)
'通知バー/Internet Explorerダイアログを操作してファイルをダウンロード
'※ UIAutomationClient(%SYSTEMROOT%\system32\UIAutomationCore.dll)要参照
'
' - hIE:InternetExplorerのハンドル
' - SaveFilePath:ファイルのダウンロード先
'
'http://okwave.jp/qa/q8121989.html
'http://okwave.jp/qa/q8320348.html
'https://gist.github.com/kumatti1/7957796 参考
Dim uiAuto As CUIAutomation
Dim elmIE As IUIAutomationElement
Dim elmNotificationBar As IUIAutomationElement
Dim elmSaveSplitButton As IUIAutomationElement
Dim elmSaveDropDownButton As IUIAutomationElement
Dim elmSaveMenu As IUIAutomationElement
Dim elmSaveMenuItem As IUIAutomationElement
Dim elmIEDialog As IUIAutomationElement
Dim elmSaveAsButton As IUIAutomationElement
Dim elmSaveAsWindow As IUIAutomationElement
Dim elmFileNameEdit As IUIAutomationElement
Dim elmSaveButton As IUIAutomationElement
Dim elmNotificationText As IUIAutomationElement
Dim elmCloseButton As IUIAutomationElement
Dim iptn As IUIAutomationInvokePattern
Dim vptn As IUIAutomationValuePattern
Const ROLE_SYSTEM_BUTTONDROPDOWN = &H38&
Set uiAuto = New CUIAutomation
Set elmIE = uiAuto.ElementFromHandle(ByVal hIE)
'ファイルを事前に削除
With CreateObject("Scripting.FileSystemObject")
If .FileExists(SaveFilePath) Then .DeleteFile SaveFilePath, True
End With
Do
'[通知バー]取得
Set elmNotificationBar = _
GetElement(uiAuto, _
elmIE, _
UIA_AutomationIdPropertyId, _
"IENotificationBar", _
UIA_ToolBarControlTypeId)
'[Internet Explorer]ダイアログ((ファイル名) で行う操作を選んでください)取得
Set elmIEDialog = _
GetElement(uiAuto, _
elmIE, _
UIA_NamePropertyId, _
"Internet Explorer", _
UIA_WindowControlTypeId)
DoEvents
Loop Until (Not elmNotificationBar Is Nothing) Or _
(Not elmIEDialog Is Nothing)
'***** 通知バー操作ここから *****
If Not elmNotificationBar Is Nothing Then
'[保存]スプリットボタン取得
Set elmSaveSplitButton = _
GetElement(uiAuto, _
elmNotificationBar, _
UIA_NamePropertyId, _
"保存", _
UIA_SplitButtonControlTypeId)
If elmSaveSplitButton Is Nothing Then GoTo Fin
'[保存]ドロップダウン取得
Set elmSaveDropDownButton = _
GetElement(uiAuto, _
elmNotificationBar, _
UIA_LegacyIAccessibleRolePropertyId, _
ROLE_SYSTEM_BUTTONDROPDOWN, _
UIA_SplitButtonControlTypeId)
If elmSaveDropDownButton Is Nothing Then GoTo Fin
'[保存]ドロップダウン押下 -> [名前を付けて保存(A)]ボタン押下
Set iptn = elmSaveDropDownButton.GetCurrentPattern(UIA_InvokePatternId)
Do
iptn.Invoke
Set elmSaveMenu = _
GetElement(uiAuto, _
uiAuto.GetRootElement, _
UIA_ClassNamePropertyId, _
"#32768", _
UIA_MenuControlTypeId)
DoEvents
Loop While elmSaveMenu Is Nothing
Set elmSaveMenuItem = _
GetElement(uiAuto, _
elmSaveMenu, _
UIA_NamePropertyId, _
"名前を付けて保存(A)", _
UIA_MenuItemControlTypeId)
If elmSaveMenuItem Is Nothing Then GoTo Fin
Set iptn = elmSaveMenuItem.GetCurrentPattern(UIA_InvokePatternId)
iptn.Invoke
End If
'***** 通知バー操作ここまで *****
'***** Internet Explorerダイアログ操作ここから *****
If Not elmIEDialog Is Nothing Then
Set elmSaveAsButton = _
GetElement(uiAuto, _
elmIEDialog, _
UIA_NamePropertyId, _
"名前を付けて保存(A)", _
UIA_ButtonControlTypeId)
If elmSaveAsButton Is Nothing Then GoTo Fin
Set iptn = elmSaveAsButton.GetCurrentPattern(UIA_InvokePatternId)
iptn.Invoke
End If
'***** Internet Explorerダイアログ操作ここまで *****
If (elmNotificationBar Is Nothing) And (elmIEDialog Is Nothing) Then GoTo Fin
'***** 名前を付けて保存操作ここから *****
'[名前を付けて保存]ダイアログ取得
Do
Set elmSaveAsWindow = _
GetElement(uiAuto, _
uiAuto.GetRootElement, _
UIA_NamePropertyId, _
"名前を付けて保存", _
UIA_WindowControlTypeId)
DoEvents
Loop While elmSaveAsWindow Is Nothing
'[ファイル名]欄取得 -> ファイルパス入力
Set elmFileNameEdit = _
GetElement(uiAuto, _
elmSaveAsWindow, _
UIA_NamePropertyId, _
"ファイル名:", _
UIA_EditControlTypeId)
If elmFileNameEdit Is Nothing Then GoTo Fin
Set vptn = elmFileNameEdit.GetCurrentPattern(UIA_ValuePatternId)
vptn.SetValue SaveFilePath
'[保存(S)]ボタン押下
Set elmSaveButton = _
GetElement(uiAuto, _
elmSaveAsWindow, _
UIA_NamePropertyId, _
"保存(S)", _
UIA_ButtonControlTypeId)
If elmSaveButton Is Nothing Then GoTo Fin
Set iptn = elmSaveButton.GetCurrentPattern(UIA_InvokePatternId)
iptn.Invoke
'***** 名前を付けて保存操作ここまで *****
'***** ダウンロード完了待ちここから *****
If elmNotificationBar Is Nothing Then
'[通知バー]取得
Do
Set elmNotificationBar = _
GetElement(uiAuto, _
elmIE, _
UIA_AutomationIdPropertyId, _
"IENotificationBar", _
UIA_ToolBarControlTypeId)
DoEvents
Loop While elmNotificationBar Is Nothing
End If
'[通知バーのテキスト]取得
Set elmNotificationText = _
GetElement(uiAuto, _
elmNotificationBar, _
UIA_NamePropertyId, _
"通知バーのテキスト", _
UIA_TextControlTypeId)
If elmNotificationText Is Nothing Then GoTo Fin
'[閉じる]ボタン取得
Set elmCloseButton = _
GetElement(uiAuto, _
elmNotificationBar, _
UIA_NamePropertyId, _
"閉じる", _
UIA_ButtonControlTypeId)
If elmCloseButton Is Nothing Then GoTo Fin
Do
DoEvents
Loop Until InStr( _
elmNotificationText.GetCurrentPropertyValue(UIA_ValueValuePropertyId), _
"ダウンロードが完了しました") > 0
'[閉じる]ボタン押下
Set iptn = elmCloseButton.GetCurrentPattern(UIA_InvokePatternId)
iptn.Invoke
'***** ダウンロード完了待ちここまで *****
Exit Sub
Fin:
MsgBox "処理が失敗しました。", vbCritical + vbSystemModal
End Sub
Private Function GetElement(ByVal uiAuto As CUIAutomation, _
ByVal elmParent As IUIAutomationElement, _
ByVal propertyId As Long, _
ByVal propertyValue As Variant, _
Optional ByVal ctrlType As Long = 0) As IUIAutomationElement
Dim cndFirst As IUIAutomationCondition
Dim cndSecond As IUIAutomationCondition
Set cndFirst = uiAuto.CreatePropertyCondition( _
propertyId, _
propertyValue _
)
If ctrlType <> 0 Then
Set cndSecond = uiAuto.CreatePropertyCondition( _
UIA_ControlTypePropertyId, _
ctrlType _
)
Set cndFirst = uiAuto.CreateAndCondition( _
cndFirst, _
cndSecond _
)
End If
Set GetElement = elmParent.FindFirst(TreeScope_Subtree, cndFirst)
End Function
上記コードはループで止まったときのことも考慮していませんので、実際にコードを動かす際には、一定時間ループで引っ掛かったら処理を抜ける、というようなコードも追加しておいた方が良いでしょう。
一応通知バーやダイアログも操作できる!ということで、あくまでも最終手段として頭の隅にでも置いておいていただければ・・・、というようなコードです。
また、kumattiさんから下記情報提供がありましたので、64ビット環境でコードが上手く動作しない場合はお試しください。
@kinuasa ども。そう言えばダウンロード用のコードを纏めたページでUI Automationのサンプルは
64BitのVBAで確認しましたが、IsZoomed APIで判定してShowWindowでIE最大化しないと
通知バーのオブジェクトを取得出来ませんでした。#感想— kumattiザウルス (@kumatti1) 2014年9月26日
というわけで、今回はVBAでインターネット上のファイルをダウンロードする色々な方法をまとめてみました。
ファイルのダウンロードに限らずVBAからWebページを操作する場合、開発者ツールやFiddlerを使って通信内容を確認する、Webページのソースを確認する、といったことは基本中の基本とも言え、どうしても必要になってきます。
ファイルのダウンロード処理で躓いたときは、まずは対象となるサイトをよく見てみることをお薦めします。





















はじめまして。
VBAでCSVファイルをDLしたいと考えていますが、ページ上にプルダウンメニューが2個あり必須選択
期間入力ボックスがありここも必須入力
それらを選択したうえでCSVファイルがDLできるサイトで名前を付けて保存の動作をVBAでさせたいです。
【やりたいこと】
1.IEの名前を付けて保存を実行させたい。
2.DLするのはcsvファイルのみ。
3.デスクトップに「データ」というフォルダを自動で作成させそのフォルダー内に保存をしたい
※同じ名前があった場合は任意にフォルダ名に付け足す。
4.csvファイルの名前はsheet1のA3セルに記載された名前に書き換え保存を行う。
よろしくお願いします。