Excel эффективность VBA XMLHTTP60

Я долгое время скрывался на этом сайте, и я ценю все, что я узнал из каждого из ваших ответов, которые я видел. Теперь я хочу эффективно запустить код, который я написал с вашей помощью.

Проблема 1. Страница отображается как «не отвечающая» во время выполнения кода. Это происходит примерно 4 раза при каждом запуске. Кроме того, я получаю данные примерно через 1 минуту и ​​40 секунд. У моей компании не самый лучший интернет, поэтому, возможно, это занимает так много времени.

Проблема 2. Есть ли лучшая методология прохождения цикла, где код находится в одном макросе, а не в 10 отдельных макросах. Мой сайт изменяет только часть из четырех букв в URL-адресе (показанном как DYNAMICPORTION во втором коде ниже. Я попытался зациклить его с URL-адресом, который относится к диапазону, но не могу понять, как разместить эту информацию на новом рабочий лист внутри цикла.

Любая помощь будет оценена по достоинству! Еще раз спасибо!

Основной макрос

Sub GetAllData()

Dim t As Date
t = Now()

Application.Calculation = xlManual

    Application.StatusBar = "Gathering Data 10%"
GetSiteData
    Application.StatusBar = "Gathering Data 20%"
GetSite2Data
    Application.StatusBar = "Gathering Data 30%"
GetSite3Data
    Application.StatusBar = "Gathering Data 40%"
GetSite4Data
    Application.StatusBar = "Gathering Data 50%"
GetSite5Data
    Application.StatusBar = "Gathering Data 60%"
GetSite6Data
    Application.StatusBar = "Gathering Data 70%"
GetSite7Data
    Application.StatusBar = "Gathering Data 80%"
GetSite8Data
    Application.StatusBar = "Gathering Data 90%"
GetSite9Data
    Application.StatusBar = "Gathering Data 100%"
GetSite10Data

    Application.Calculation = xlAutomatic
    Application.StatusBar = Ready
    
MsgBox "It took " & Format(Now() - t, "hh:mm:ss") & " to gather the site's data!" & vbNewLine & "Please allow a minute to calculate!"

End Sub

Макрос под главной

Sub GetSiteData()
Dim XMLRequest As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim HTMLTable As MSHTML.IHTMLElement
Dim HTMLTable2 As MSHTML.IHTMLElement
Dim TableRow As MSHTML.IHTMLElement
Dim TableCell As MSHTML.IHTMLElement
Dim RowNum As Long, ColNum As Long
Dim url As String: url = "https://thewebsite/theproduct/isextracted/index.cfm?site=DYNAMICPORTION&type=data"
Dim OutputSheet As Worksheet

Set OutputSheet = ThisWorkbook.Worksheets("Site")
OutputSheet.Cells.ClearContents

XMLRequest.Open "GET", url, False
XMLRequest.send
Do While XMLRequest.readyState <> 4
    DoEvents
Loop
HTMLDoc.body.innerHTML = XMLRequest.responseText

Set HTMLTable = HTMLDoc.getElementById("TAB7")
Set HTMLTable2 = HTMLDoc.getElementById("TAB5")

RowNum = 0
ColNum = 0

    For Each TableRow In HTMLTable.getElementsByTagName("tr")
        RowNum = RowNum + 1
        For Each TableCell In TableRow.Children
            ColNum = ColNum + 1
            OutputSheet.Cells(RowNum, ColNum).Value = TableCell.innerText
        Next TableCell
        ColNum = 0
    Next TableRow

    For Each TableRow In HTMLTable2.getElementsByTagName("tr")
        RowNum = RowNum + 1
        For Each TableCell In TableRow.Children
            ColNum = ColNum + 1
            OutputSheet.Cells(RowNum, ColNum).Value = TableCell.innerText
        Next TableCell
        ColNum = 0
    Next TableRow

End Sub

person Zoopatrol16    schedule 04.10.2020    source источник
comment
Не уверен, что с настройкой False это состояние готовности что-то делает. Ваш код будет работать быстрее, если вы опустошите массив и запишете этот массив за один проход на лист. У вас нет контроля над сервером, вероятно, ограниченный контроль над Интернетом, поэтому ваш код является самой легкой целью. При определении времени, где вы нашли медленную точку? В самом запросе?   -  person QHarr    schedule 04.10.2020
comment
@QHarr Я понимаю, что ты говоришь. Я добавил в состояние готовности, чтобы увидеть, пытается ли он двигаться дальше, прежде чем разрешить загрузку страницы. Я действительно не думаю, что это что-то сделало. У нас очень ограниченный доступ в Интернет, и для доступа к этому сайту требуется сертификат безопасности. Этот код также зацикливается, если я не открываю гиперссылку на страницу из Excel. Он кажется «не отвечающим» при циклическом просмотре подпрограммы «GetAllData». Он замерзнет, ​​а затем возобновится, снова и снова. Однако он все еще работает, пока находится в состоянии «не отвечает»!   -  person Zoopatrol16    schedule 04.10.2020
comment
Итак, вам нужно открыть соединение браузера с сертификатом, чтобы ваш xhr прошел?   -  person QHarr    schedule 04.10.2020
comment
@QHarr в этом скрипте да. Я тоже не совсем понимаю. У меня есть еще один саб, который собирает изображения с того же сайта, с тем же макетом кодирования XHR, и мне не нужно открывать браузер из Excel перед его запуском. Страница, которую я загружаю в приведенном выше макросе, переходит на внутреннюю страницу, на которую ссылаются на страницах над ней примерно 4 раза. Как только я перехожу на страницу с фактическими данными TR/TD, которые мне нужны, она содержит около 200 000+ строк HTML и загружается немного дольше по сравнению с первыми страницами самого сайта.   -  person Zoopatrol16    schedule 04.10.2020
comment
Вы пробовали serverxmlhttp с сертификатом, например. stackoverflow.com/questions/9212985/ ?   -  person QHarr    schedule 04.10.2020
comment
@QHarr Я столкнулся с информацией о ServerXMLHTTP неделю назад или около того. Я не слишком знаком с этим. У нас практически нет прав администратора на наших компьютерах. Однако я использую карту общего доступа для своих сертификатов. Я только что прочитал то, на что вы ссылались, и не могу получить доступ к своим учетным данным описанным способом. Я использую CAC для доступа к сайтам .mil, к которым я обращаюсь с помощью вышеуказанного макроса. Мне непонятно, почему у этого кода могут быть проблемы, а у кода, который захватывает изображения с того же сайта, их нет. Я думаю, что код зацепился за что-то.   -  person Zoopatrol16    schedule 04.10.2020
comment
@QHarr знаете ли вы, как я могу зациклить второй макрос выше? URL-адрес является динамическим в части «= site», и я помещаю каждый сайт на отдельный скрытый лист, чтобы в дальнейшем ссылаться на то, что мне нужно. Есть ли способ иметь 1 макрос, который зацикливает и публикует информацию, которую я хочу, для каждого URL-адреса и каждого листа? В настоящее время у меня есть 15 модулей в этой книге, и я пытаюсь вырезать ненужные разделы, так как я чувствую, что это поможет книге в целом, когда дело доходит до производительности.   -  person Zoopatrol16    schedule 04.10.2020
comment
Да, используйте цикл от 0 до 14 и внутри цикла соедините необходимое окончание URL. Динамические части могут быть сохранены в массиве строк Dim (14), и вы просто индексируете его с текущей позицией цикла, чтобы получить требуемое окончание URL. Затем вызовите подпрограмму внутри цикла. Создайте объект xmlhttp вне цикла и передайте его в качестве аргумента вызываемой подпрограмме, а не продолжайте его создавать. Внутри цикла создайте новый лист, на который вы хотите записать, и сохраните его в переменной, чтобы вы могли присваивать значения этому листу,   -  person QHarr    schedule 04.10.2020
comment
Не могли бы вы прислать мне пример этого с кодом, который я написал выше? Я все еще новичок в VBA, поэтому я не имел дело с аргументами или вызовами. Если нет, то хорошо! Я ценю вашу помощь до сих пор! Я понимаю, что на этом сайте мы должны проводить исследования, а не искать легких путей!   -  person Zoopatrol16    schedule 04.10.2020
comment
Примерно так: pastebin.com/URBmqrih   -  person QHarr    schedule 04.10.2020
comment
Я проверю это, когда вернусь домой! Должен любить ограничения в Интернете!   -  person Zoopatrol16    schedule 04.10.2020
comment
Не беспокойся. Любые вопросы, пожалуйста, дайте мне знать. Полезно добавить к вашему вопросу, что вы пробовали и что получилось, а также ограничиться одной проблемой на сообщение.   -  person QHarr    schedule 04.10.2020