Я хочу создать подпрограмму, которая может получить перенаправленный URL-адрес и поместить его в ячейку. У меня есть ряд ячеек, содержащих числа, которые завершают URL-адрес. Эта ссылка открывается с помощью WinHTTP, после чего файл сохраняется в формате PDF. Возвращаемая страница является перенаправлением, и мне нужно извлекать URL-адрес, чтобы изолировать важную информацию каждый раз, когда она открывается. Я видел функции, которые, по-видимому, способны на это, но не смогли заставить их работать, и у меня мало опыта работы с WinHTTP. Я пытался разобраться в опубликованных функциях, но пока не смог. Я бы предпочел сохранить его как вспомогательную функцию, если это возможно. Любая помощь будет оценена. Ниже приведена самая близкая вещь, которую я смог найти, которая может соответствовать моим требованиям, но у меня возникли проблемы с ее запуском в качестве подпрограммы.
Public Function testRedirect(oCell As Range) As String
testRedirect = "not redirected"
strURL = oCell.Hyperlinks(1).Address
WinHttpRequestOption_EnableRedirects = 6
Set oWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
oWinHttp.Option(WinHttpRequestOption_EnableRedirects) = False
oWinHttp.Open "HEAD", strURL, False
oWinHttp.send ""
If oWinHttp.Status = 301 Then
strResponseHeaders = oWinHttp.getAllResponseHeaders()
For Each strResponseHeader In Split(strResponseHeaders, Chr(10))
If Left(strResponseHeader, 9) = "Location:" Then
testRedirect = "redirected to " & strResponseHeader
End If
Next
End If
End Function
Следующий код — это то, что я использую для запроса файлов и их сохранения, что работает хорошо, но требует, чтобы где-то было установлено вышеперечисленное. Пожалуйста, извините за форматирование. Я только добрался до стадии, когда он работает, и еще не успел его отполировать. Также могут быть ненужные переменные и т.д.
Sub Printdrawings()
Dim WB As Workbook
Dim WS As Worksheet
Dim ROWS As Long
Dim IE As Object
Dim LINKS As Variant
Dim LINK As Variant
Dim RNG As Range
Dim URL As String
Dim CLL As Range
Dim FileNum As Long
Dim FileData() As Byte
Dim MyFile As String
Dim WHTTP As Object
Dim FileName As String
Set WB = ThisWorkbook
Set WS = WB.Sheets("Sheet1")
'Calculates the amount of used rows in column A
ROWS = WS.Cells(WS.ROWS.Count, "A").End(xlUp).Row
Debug.Print ROWS
'Sets a range based on the variable counted occupied rows from above
Set RNG = WS.Range("A1:A" & ROWS)
For Each CLL In RNG
On Error Resume Next
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5")
If Err.Number <> 0 Then
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
End If
On Error GoTo 0
MyFile = "http://URLBODY" & CLL
WHTTP.Open "GET", MyFile, False
WHTTP.Send
FileData = WHTTP.ResponseBody
Set WHTTP = Nothing
If Dir("C:\MyDownloads", vbDirectory) = Empty Then MkDir "C:\MyDownloads"
FileName = Right(MyFile, 12)
Debug.Print FileName
FileNum = FreeFile
Open "C:\MyDownloads\" & FileName & ".pdf" For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
Next CLL
MsgBox "Open the folder [ C:\MyDownloads ] for the downloaded file..."
End Sub
CLL.Offset(0,1).Value = testRedirect(CLL)
проверит каждую ячейку и поместит результат в следующий столбец справа. - person Tim Williams   schedule 21.12.2020