Для своей работы мне регулярно нужно сравнивать таблицу из ~ 2000 медикаментов с веб-сайтом, чтобы увидеть, существуют ли их идентификаторы веществ (число 8-ди git), которые все еще существуют / изменились. Я попытался автоматизировать процесс с помощью VBA (разрешено на работе, потому что он поставляется с Excel) и xmlhttprequests. Я заставил его работать, но процесс очень медленный (иногда Excel останавливается на 10 минут), и я хочу ускорить процесс. Имейте в виду, я всего лишь любитель, а не программист.
Это мой код:
Sub PZN_Check_XHR()
Dim xmlhttp As Object
Dim url As String
Dim pzn As String
Dim ZelleA As Range
Dim ZelleB As Range
Dim a As Range
Set a = Worksheets("Treatments").Range("H2:H" & Cells(Rows.Count, "H").End(xlUp).Row)
Set xmlhttp = CreateObject("MSXML2.serverXMLHTTP")
'Begin Loop, define PZN (substance IDs), define cells
For Each ZelleA In a
pzn = ZelleA.Value
Set ZelleB = Cells(ZelleA.Row, 10)
Set ZelleC = Cells(ZelleA.Row, 8)
'Add a link to our intranet database for all the substance IDs in Column H)
If ZelleC.Value <> 0 Then
ZelleC.Hyperlinks.Add Anchor:=ZelleC, Address:="http://ukb648/list.php?st=" & pzn & "&aufruf=1"
End If
'URL of the website I want to check
url = "https://www.arzneimittel-datenbank.de/search/" & pzn
xmlhttp.Open "GET", url, True
xmlhttp.Send
Do While xmlhttp.readyState <> 4
DoEvents
Loop
If InStr(1, xmlhttp.responseText, "<title>Arzneimittel-Datenbank") <> 0 Then
ZelleB.Interior.ColorIndex = 3
ZelleB.Value = "PZN not found"
ZelleB.Hyperlinks.Add Anchor:=ZelleB, Address:="http://ukb648/list.php?st=" & Left$(Worksheets("Treatments").Cells(ZelleA.Row, 2), InStr(1, Worksheets("Treatments").Cells(ZelleA.Row, 2), " "))
Else
'Print result to ZelleB
ZelleB = Mid(xmlhttp.responseText, InStr(1, xmlhttp.responseText, "<title>") + 7, (InStr(1, xmlhttp.responseText, "</title>") - InStr(1, xmlhttp.responseText, "<title>") - 32))
ZelleB.Interior.ColorIndex = 4
Worksheets("Treatments").Cells(ZelleA.Row, 11) = Worksheets("TradeNames").Cells(ZelleA.Row, 3)
Worksheets("Treatments").Cells(ZelleA.Row, 12) = Worksheets("TradeNames").Cells(ZelleA.Row, 5)
End If
Next ZelleA
End Sub
Этот код занимает около 1-2 секунд для выполнения строки, и моя таблица имеет около 2000 строк (и вырастет до> 10.000 строк в обозримом будущем). Есть ли способ ускорить это? Может быть, сначала чтение данных в массив и оттуда работать? Если да, то как? Или я как-то испортил l oop? Огромное спасибо за ваше время!
Редактировать: Некоторые образцы PZN (в соответствии с просьбой "Foxfire And Burns And Burns", спасибо за ваше время): 04516999, 03300613, 02358177, 02197219, 02530357, 00886110, 03355873, 04920298
К сожалению, у меня пока недостаточно репутации, чтобы проголосовать за ваши комментарии. Тем не менее, я попробую ваши идеи и предоставлю отзыв, если что-нибудь сработает.