Я получил код для загрузки файла CSV с веб-сайта, который требует учетные данные. Благодаря этому сайту я получил код и смог приспособиться к своим потребностям. Моя соответствующая часть кода:
Option Explicit
Private Declare Function URLDownloadToFileA Lib "urlmon" _
(ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long
Private Function DownloadUrlFile(URL As String, LocalFilename As String) As Boolean
Dim RetVal As Long
RetVal = URLDownloadToFileA(0, URL, LocalFilename, 0, 0)
If RetVal = 0 Then DownloadUrlFile = True
End Function
Sub DESCARGAR_CSV_DATOS()
Dim EstaURL As String
Dim EsteCSV As String
EstaURL = "https://user:token@www.privatewebsite.com/export/targetfile.csv"
EsteCSV = "MyCSV " & Format(Date, "dd-mm-yyyy") & ".csv"
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
DownloadUrlFile EstaURL, _
ThisWorkbook.Path & "\" & EsteCSV
DoEvents
Workbooks.Open ThisWorkbook.Path & "\" & EsteCSV, , True, , , , , , , , , , , True
'rest is just doing operations and calculations inside workbook
End Sub
Извините, но я не могу предоставить реальный URL. В любом случае, этот код отлично работает с сентября 2019 года. И он по-прежнему отлично работает каждый день.
Все компьютеры, которые выполняют этот код, Windows 7 и Excel 2007 и 64-разрядные. Ни один из них не сработает.
Но теперь эта задача будет передана в другой офис. Там компьютеры Excel 2019, Windows 10 и 64 бита.
И код там не работает. Никаких ошибок не возникает, но функция DownloadUrlFile
не загружает никаких файлов в Excel 2019 + W10
Итак, для возобновления Excel 2007 + Windows 7 работает отлично (проверено сегодня). Excel 2019 + Windows 10 не работает (без ошибок на экране).
Вещи, которые я пытался исправить:
- Я проверил этот файл
urlmon.dll
существует в system32
и - Я пытался объявить функцию
URLDownloadToFileA
, используя PtrSafe
- Если я вручную наберу URL в Chrome в P C в Excel 2019 + W10, файл загружен правильно, поэтому URL-адрес в порядке.
Ничто из этого не решило мою проблему. Я уверен, что решение действительно простое, потому что код отлично работает в Excel 2007, но я не могу найти то, что мне здесь не хватает.
Я хотел бы получить код, который работает в любом случай, но я бы также принял решение, которое работает только в Excel 2019 и Windows 10, если это единственный способ.
Надеюсь, кто-нибудь может пролить свет на это. Заранее спасибо.
ОБНОВЛЕНИЕ : Пробовал также решение в этом сообщении , но все еще ничего.
ОБНОВЛЕНИЕ 2: Кроме того, протестировал код, размещенный здесь (Excel 2007) в Excel 2010, и он отлично работает.
ОБНОВЛЕНИЕ 3: В переменной RetVal
хранится результат загрузки. Я знаю некоторые значения:
' Returns 0 if success, error code if not.
' Error codes:
' -2146697210 "file not found".
' -2146697211 "domain not found".
' -2147467260 "transfer aborted".
Но в моем случае возвращается -2147221020
. Что бы это могло быть?
ОБНОВЛЕНИЕ 4: Ну, это просто странно. Я попробовал тот же код, чтобы загрузить другой файл с веб-сайта publi c, и он работает в Excel 2019 + W10. Я сделал новый простой код, подобный этому:
#If VBA7 And Win64 Then
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" ( _
ByVal pCaller As LongPtr, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As LongPtr, _
ByVal lpfnCB As LongPtr _
) As Long
#Else
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
#End If
Sub Descarga()
Dim EstaURL As String
Dim EsteCSV As String
EstaURL = privateone 'can't be shared, sorry
EsteCSV = "CSV Datos " & Format(Date, "dd-mm-yyyy") & ".csv"
On Error GoTo Errores
URLDownloadToFile 0, "https://tutorialesexcel.com/wp-content/uploads/2018/10/funciones.xlsm", ThisWorkbook.Path & "\" & EsteCSV, 0, 0
URLDownloadToFile 0, EstaURL, ThisWorkbook.Path & "\" & EsteCSV, 0, 0
Exit Sub
Errores:
'Si es un bucle lo mejor sería no mostrar ningún mensaje
MsgBox "Not downloaded", vbCritical, "Errores"
End Sub
Строка с надписью URLDownloadToFile 0, "https://tutorialesexcel.com/wp-content/uploads/2018/10/funciones.xlsm", ThisWorkbook.Path & "\" & EsteCSV, 0,
отлично работает и загружает файл.
Строка URLDownloadToFile 0, EstaURL, ThisWorkbook.Path & "\" & EsteCSV, 0, 0
не работает.
Итак, снова протестирован точно такой же код, но в Excel 2007 и оба они работают
Почему первая загрузка работает, а вторая - не в Excel 2019 + W10, но оба они работа в Excel 2007 + W7?
ОБНОВЛЕНИЕ 5: URL-адрес является закрытым, поскольку содержит имя пользователя и пароль, но выглядит так:
https://user:token@www.privatewebsite.com/export/target%20file.csv
Благодаря @Stachu, URL не работает вручную на Inte rnet Explorer на любом P C (я имею в виду копирование / вставка в панели навигации проводника). URL отлично работает в Google Chrome во всех P C.
. Любопытно, что вручную, URL в Inte rnet Explorer не работает, но тот же URL, закодированный с VBA и Executed on Excel2007 / 2010 работает отлично. Может мне стоит что-то изменить в кодировке?
ОБНОВЛЕНИЕ 6: Все еще изучаю все ваши сообщения. Проблема здесь в том, что я просто специалист по обработке данных, аналитик, поэтому большое количество информации, размещенной здесь, звучит для меня по-настоящему хардкорно.
Я отправил всю информацию по электронной почте парням ИТ 1 день в go и все еще жду ответа.
Между тем, основываясь на приведенной здесь информации, наконец-то закодировано нечто совершенно другое, которое работает на всех машинах. Он работает на Windows 7 и 10 и работает на Excel 2007 и 2010 (установлен как 32-разрядные) и Excel 2019 (установлен как 64-разрядные).
Я добавляю код здесь, так что, возможно, кто-то может объяснить, почему он работает должным образом, но похоже, что проблема заключалась в кодировке base64.
Код, который я получил сейчас, выглядит следующим образом (добавлена ссылка на Microsoft Winhttp Setvices 5.1)
Application.ScreenUpdating = False
Dim whr As WinHttp.WinHttpRequest
Dim oStream As Object
Dim EsteCSV As String
Dim EstaURL As String
EstaURL = "https://user:pass@www.privatewebsite.com/export/target%20file.csv"
EsteCSV = "CSV Datos" & Format(Date, "dd-mm-yyyy") & ".csv"
'Set whr = CreateObject("WinHttp.WinHttpRequest.5.1")
Set whr = New WinHttp.WinHttpRequest
whr.Open "GET", EstaURL, True
whr.setRequestHeader "Authorization", "Basic " & EncodeBase64("user" & ":" & "password")
whr.send
' Using 'true' above and the call below allows the script to remain responsive.
whr.waitForResponse
DoEvents
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write whr.responseBody
oStream.SaveToFile ThisWorkbook.Path & "\" & EsteCSV
oStream.Close
DoEvents
Set oStream = Nothing
whr.abort
Set whr = Nothing
'rest of code for operations
Kill ThisWorkbook.Path & "\" & EsteCSV
Application.ScreenUpdating = True
End Sub
Private Function EncodeBase64(text As String) As String
Dim arrData() As Byte
arrData = StrConv(text, vbFromUnicode)
Dim objXML As Object
Dim objNode As Object
Set objXML = CreateObject("MSXML2.DOMDocument")
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeBase64 = objNode.text
Set objNode = Nothing
Set objXML = Nothing
End Function