Вот немного более эффективная перезапись.Я перемещаю создание объектов winhttp.winhttprequest.5.1
и dom
из цикла, чтобы избежать постоянного создания и уничтожения.Перемещено Screenupdating
, поэтому обрабатывается только в начале и в конце.Установите возвращаемую запись и диапазон цикла в переменные, чтобы вы могли обращаться к ним.
Обычно, я бы работал с загрузкой значений для зацикливания в массив и циклической обработкой массива.Я бы хранил результаты в массиве и выписывал один раз в конце, так как постоянное касание листа обходится дорого.Поскольку я не знаю, что происходит в других столбцах, и кажется, что в вашем диапазоне данных могут быть пробелы, я не внес эти поправки.
Option Explicit
Public Sub ScrambleNavySearch()
Dim cel As Range, ms As Worksheet, dom As HTMLDocument, loopRange As Range
Const SEARCH_URL As String = "https://www.scramble.nl/index.php?option=com_mildb&view=search"
Set ms = ThisWorkbook.Worksheets("Scramble")
Set dom = New HTMLDocument
Set loopRange = ms.Range("B2:B" & ms.Range("B" & rows.Count).End(xlUp).Row).SpecialCells(2)
Application.ScreenUpdating = False
With CreateObject("winhttp.winhttprequest.5.1")
For Each cel In loopRange
.Open "POST", SEARCH_URL, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send "Itemid=60&af=usn&serial=" & cel & "&sbm=Search&code=&searchtype=&unit=&cn="
dom.body.innerHTML = .responseText
Dim recordFields As Object
Set recordFields = dom.querySelectorAll(".rowBord td")
If recordFields.Length > 0 Then
With cel
.Offset(, -1) = recordFields.item(2).innerText 'Type
.Offset(, 2) = recordFields.item(1).innerText 'Code
.Offset(, 3) = recordFields.item(4).innerText 'Unit
.Offset(, 10) = recordFields.item(3).innerText 'C/N
.Offset(, 11) = recordFields.item(5).innerText 'Status
End With
End If
Next
End With
Application.ScreenUpdating = True
End Sub