Извлечение информации из всех URL-адресов в столбце

#excel #vba

#excel #vba

Вопрос:

У меня есть приведенный ниже код, который использует xml. Он посещает все URL-адреса в столбце J, получает информацию, а затем вставляет ее в столбец K.

Похоже, код не работает.

 Sub GetInfo()
    Dim Http As New XMLHTTP60, Html As New HTMLDocument
    Dim lastrow As Long, i As Long
    Dim sdd As String
    Dim add As Variant
    Dim url As Range

    For Each url In Range("J2:J" amp; Range("J" amp; Rows.Count).End(xlUp).Row)
        lastrow = Sheet1.Cells(Rows.Count, "J").End(xlUp).Row
        For i = 2 To lastrow

            With Http
                .Open "GET", url, False
                .send
                Html.body.innerHTML = .responseText
            End With
            sdd = Html.querySelector("span[itemprop='price']").getAttribute("content")
            Sheet1.Cells(i, "K") = sdd
        Next i
    Next
    End
End Sub
  

Теперь макрос может выполняться. Я не понимаю, почему он внезапно запускается.
Но он по-прежнему не выполняет то, что должен.
Если в столбце J имеется 10 URL-адресов, макрос получит информацию из первого URL-адреса, а затем поместит ее во все строки в столбце K вместо того, чтобы просто помещать ее в соответствующую строку. Если значение из первого URL-адреса равно 80000, оно поместит 80000 во все 10 строк. Мало того, он перейдет к следующему URL-адресу, а затем поместит новую информацию во все строки в столбце K, заменив то, что он только что туда поместил. Он будет делать это до тех пор, пока не пройдет весь путь до 10-го URL-адреса.

Комментарии:

1. Я не могу воспроизвести вашу проблему с информацией, которую вы указали в своем вопросе. Было бы полезно, если бы вы включили документы (или, предпочтительно, URL-адреса), которые вы используете, из столбца J.

2. Привет, Рон, его www.realtor.com

3. Хорошо, объясните, что, похоже, не работает ? Ошибка? Сбой? что-то еще?

4. На самом деле он ведет себя по-другому. Сначала он вообще не работает, либо говорит, что .send является источником ошибки. Тогда иногда Next это выдает ошибку. Затем, совсем недавно, после перезагрузки моего компьютера, он смог запустить макрос, но вставил результат первого URL-адреса во все строки с записями в столбце K, затем заменил его результатом второго URL-адреса во всех строках с записями в столбце K, затем заменил его нарезультат третьего URL-адреса и так далее, пока он не пройдет через все URL-адреса в столбце J.

5. В чем ошибка?

Ответ №1:

Ваша проблема в том, что вы неправильно индексируете K столбец. У вас есть For I цикл, который повторяется для каждого URL-адреса. Таким образом, последний URL-адрес заполнит все записи K столбца. Возможно, что-то вроде:

 …
    i = 1
    Columns("K").Clear
    For Each URL In Range(Cells(2, "J"), Cells(Rows.Count, "J").End(xlUp))
        With Http
            .Open "GET", URL, False
            .send
            HTML.body.innerHTML = .responseText
        End With

        sdd = HTML.querySelector("span[itemprop='price']").getAttribute("content")
        i = i   1
        Sheet1.Cells(i, "K") = sdd

    Next URL
End Sub
  

О, и убедитесь, что ваши URL-адреса полностью сформированы: например, они начинаются с http:// или https://

Комментарии:

1. Вау, потрясающе! Это действительно делает свою работу. Я не понимал, что мне просто не хватает нескольких строк. Спасибо, Рон, я действительно ценю это. Аккуратно сделано! Реквизит для вас. Теперь я просто выясню, должен ли я сделать это как частный подраздел, в котором после того, как новый набор адресов будет помещен в столбец J, он автоматически запустит эту функцию или сохранит ее как есть. Нормально ли, что, пока он извлекает информацию с разных веб-сайтов, я не могу вводить или делать что-либо, пока он не завершится? Меня беспокоит то, что, если у меня тысячи URL-адресов.

2. @SoaringRioren обновляет только новые URL-адреса. Чтобы иметь возможность type or do что-то делать во время выполнения, установите async значение True . Конечно, вам нужно будет постоянно проверять, завершился ли вызов, прежде чем вы сможете сделать что-либо, зависящее от этого вызова, если вы это сделали.

3. Я вижу. Я полагаю, я должен поставить async = true перед For Each url In Range("J2:J" amp; Range("J" amp; Rows.Count).End(xlUp).Row) then async = false after Next URL , я прав?

4. @SoaringRioren async является аргументом .Open метода. И нет, ваш пример неверен. Вам также необходимо проверить, завершен ли вызов, прежде чем продолжить выполнение макроса. Я думаю, вам нужно изучить СПРАВОЧНУЮ документацию для методов XML и HTTP , которые вы используете, чтобы полностью понять это.

5. ОК. Спасибо за помощь, Рон, ты устранил проблему. async это не должно быть так сложно для такого новичка, как я. Еще раз спасибо, Рон, за исправление кода. Я действительно ценю вашу помощь.