Я думаю, что вы пытаетесь сделать это ввести адрес детали и получить найденный почтовый индекс.Этот метод использует CSS-селекторы для настройки стиля страницы, и я сразу же начинаю с URL-адреса поиска адреса.По возможности я использую селекторы идентификаторов (то же самое, что сказать .document.getElementById("yourID")
, обозначается #
, поскольку это самые быстрые методы поиска. Когда дело доходит до выбора состояния, которое является раскрывающимся списком, я выбираю соответствующую опцию. Вы можетедобавить в строку опции двухбуквенное сокращение состояния поиска, например,
Dim state As String
state = "NY"
.querySelector("option[value=" & state & "]").Selected = True
Существует цикл, обеспечивающий присутствие целевого элемента на новой странице результатов поиска. Я использую другой селектор CSS из #zipByAddressDiv strong
для нацеливания толькопочтовый индекс, который выделен жирным шрифтом, в результатах. Жирный шрифт задается тегом strong
.
strong
тег содержит почтовый индекс в результате:
CSS-запрос:
Приведенный выше селектор CSS является целевым по идентификатору, используя #zipByAddressDiv
и затем вместо разбиения на массив для получения нужного значения он использует селектор потомков для нацеливания на элемент тега strong
, содержащий требуемое значение.
VBA:
Option Explicit
Public Sub AddressSearch()
Dim IE As New InternetExplorer, t As Date, ele As Object
Const MAX_WAIT_SEC As Long = 5
With IE
.Visible = True
.navigate "https://tools.usps.com/zip-code-lookup.htm?byaddress"
While .Busy Or .readyState < 4: DoEvents: Wend
With .document
.querySelector("#tAddress").Value = "1 Main Street"
.querySelector("#tCity").Value = "New York"
.querySelector("option[value=NY]").Selected = True
' .querySelector("#tZip-byaddress").Value = 10045
.querySelector("#zip-by-address").Click
End With
While .Busy Or .readyState < 4: DoEvents: Wend
t = Timer
Do
DoEvents
On Error Resume Next
Set ele = .document.querySelector("#zipByAddressDiv strong")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While ele Is Nothing
Debug.Print ele.innerText
.Quit
End With
End Sub
Вот как это выглядит в цикле:
Option Explicit
Public Sub AddressSearch()
Dim IE As New InternetExplorer, t As Date, ele As Object, i As Long
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Address")
Const MAX_WAIT_SEC As Long = 5
With IE
.Visible = True
For i = 4 To 8
.navigate "https://tools.usps.com/zip-code-lookup.htm?byaddress"
While .Busy Or .readyState < 4: DoEvents: Wend
With .document
.querySelector("#tAddress").Value = ws.Cells(i, 5).Value
.querySelector("#tCity").Value = ws.Cells(i, 7).Value
.querySelector("option[value=" & ws.Cells(i, 8).Value & "]").Selected = True
' .querySelector("#tZip-byaddress").Value = 10045
.querySelector("#zip-by-address").Click
End With
While .Busy Or .readyState < 4: DoEvents: Wend
t = Timer
Do
DoEvents
On Error Resume Next
Set ele = .document.querySelector("#zipByAddressDiv strong")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While ele Is Nothing
ws.Cells(i, 11) = ele.innerText
Set ele = Nothing
Next
.Quit
End With
End Sub