Просмотрите список, затем вставьте результат в следующую ячейку

#excel #vba

#excel #vba

Вопрос:

Я смог создать макрос, в котором он будет просматривать весь список веб-сайтов в столбце J, начиная со строки 2 (заголовок в строке 1). Получите нужную мне информацию с каждого веб-сайта, затем отобразите их в столбце K, который находится рядом с веб-сайтами, с которых была взята информация. Единственная проблема в том, что я не могу заставить макрос перейти на каждый из веб-сайтов. Я не знаю, что не так с кодом.

 Sub CommandButton1_Click()
    Dim ie As Object
    Dim lastrow As Integer
    Dim i As Integer
    Dim myURL As String
    Dim sdd As String
    Dim add As Variant
    Dim html As Object
    Dim mylinks As Object
    Dim mylink As Object
    Dim result As String

    ' Create InternetExplorer Object
    Set ie = CreateObject("InternetExplorer.Application")

    lastrow = Sheet1.Cells(Rows.Count, "J").End(xlUp).Row
    For i = 2 To lastrow
    myURL = Sheet1.Cells(i, "J").Value

    ' Hide InternetExplorer
    ie.Visible = False

    ' URL to get data from
    ie.navigate myURL

    ' Loop until page fully loads
    Do While ie.readystate <> READYSTATE_COMPLETE
    Loop

    ' Information i want to get from the URLs
    sdd = ie.document.getelementsbyclassname("timeline-text")(0).innerText

    ' Format the result
    add = Split(sdd, "$")
    Range("K3") = add(1)

    ' Close InternetExplorer
    ie.Quit

    'Return to Normal?
    ie.Visible = True
    End
    Next
    ' Clean up
    Set ie = Nothing

    Application.StatusBar = ""

End Sub
  

85 100 долларов — это информация, которую я хочу получить с одного из URL-адресов.

 <span class="font-size-base font-normal">Est.</span>
<span itemprop="price" content="85100">$85,100</span>
  

Ответ №1:

Не выходите из IE, пока не завершите цикл. Просто перейдите к следующему URL-адресу и запишите информацию о новой странице в той же строке, из которой был получен URL.

 Sub CommandButton1_Click()

    Dim lastrow As Long, i As Long
    Dim sdd As String, myURL As String, result As String
    Dim add As Variant
    Dim ie As Object, html As Object, mylinks As Object, mylink As Object

    ' Create InternetExplorer Object
    Set ie = CreateObject("InternetExplorer.Application")
    ' Hide InternetExplorer
    ie.Visible = False

    lastrow = Sheet1.Cells(Rows.Count, "J").End(xlUp).Row
    For i = 2 To lastrow

        'collect next web page url
        myURL = Sheet1.Cells(i, "J").Value

        ' URL to get data from
        ie.navigate myURL

        ' Loop until page fully loads
        Do While ie.readystate <> READYSTATE_COMPLETE
            'allow other process through the message queue
            DoEvents
        Loop

        ' Information i want to get from the URLs
        sdd = ie.document.getelementsbyclassname("timeline-text")(0).innerText

        ' Format the result
        add = Split(sdd, "$")
        Sheet1.Cells(i, "K") = add(1)

    Next i

    'Return to Normal?
    ie.Visible = True
    ' Close InternetExplorer
    ie.Quit
    ' Clean up
    Set ie = Nothing

    Application.StatusBar = ""

End Sub
  

Я также добавил DoEvents в цикл ожидания загрузки страницы. Это позволяет выполнять другие процессы вместо привязки ресурсов в однопоточном процессе VBA.

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

1. Спасибо, что изучили это. Должно быть, я что-то пропустил в своем объяснении. В столбце J есть список веб-сайтов, начинающийся с J2. Допустим, он будет идти вплоть до J10. С каждого веб-сайта есть определенная информация, которую я хочу получить, поэтому макрос посетит веб-сайт в J2, получит эту информацию и вставит ее в K2, затем посетит веб-сайт в J3, вставит эту информацию в K3 и так далее. У меня уже есть существующий список веб-сайтов в столбце J, который также является динамическим.

2. Ваш код помещал add(1) значение в столбец I, поэтому я использовал это. Измените Sheet1.Cells(i, "I") на Sheet1.Cells(i, "K") .

3. Хотя он помещает нужную мне информацию в правый столбец, но он делает это только для 1 строки. Остальная часть списка не указана.

4. Мой плохой. Я только что снова просмотрел ваш код и понял, что у вас была неправильная End команда, которая завершила цикл на первой итерации. Я удалил его выше.

5.Вау! Это действительно делает работу! Удивительно! Большое вам спасибо. Хотя только один последующий вопрос. timeline-text Не возвращает никакой информации для некоторой ссылки, поэтому я думаю, что она используется не всеми ссылками. Может быть, я могу использовать что-то из указанного ниже, поскольку я обнаружил, что оно существует во всех ссылках? <span class="font-size-base font-normal">Est.</span> <span itemprop="price" content="85100">

Ответ №2:

есть кое-что, на что вы должны обратить внимание при программировании. Всегда старайтесь отображать видимый результат.

Сделайте это перед циклом после lastrow msgbox lastrow Например, между циклом for, сделайте что-то вроде msgbox sdd Вы должны быть в состоянии определить, где лежат ошибки.

Я надеюсь, что это поможет.

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

1. Спасибо. Я всегда использую F8 для проверки результатов в строке, мне не нравится, когда msgbox показывает мне результат. Может быть, это только я, поскольку я каким-то образом рассматриваю это как ограничение того, как я хочу, чтобы результаты были в этом случае.