Как я могу ускорить запросы xmlhttp (VBA)? Должен ли я использовать массивы? - PullRequest
0 голосов
/ 05 февраля 2020

Для своей работы мне регулярно нужно сравнивать таблицу из ~ 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

К сожалению, у меня пока недостаточно репутации, чтобы проголосовать за ваши комментарии. Тем не менее, я попробую ваши идеи и предоставлю отзыв, если что-нибудь сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...