Извлечение данных в iframes с помощью проблемы зацикливания кода VBA - PullRequest
0 голосов
/ 30 сентября 2018

Ниже код хорошо работает с результатом, и я получил значение, которое мне нужно.Но в конце рабочего процесса на строке «With .document.getElementById (« bm_ann_detail_iframe »). ContentDocument». ContentDocument »отображается« Ошибка времени выполнения »424« Требуется объект ».

Пример URL-ссылки, используемой дляизвлечь данные из: http://www.bursamalaysia.com/market/listed-companies/company-announcements/5927925

http://www.bursamalaysia.com/market/listed-companies/company-announcements/5927809

http://www.bursamalaysia.com/market/listed-companies/company-announcements/5927509

Public Sub GetInfo()
Dim IE As New InternetExplorer, clipboard As Object
With IE
    .Visible = False

    For u = 2 To 100

    .navigate Cells(u, 1).Value

    While .Busy Or .readyState < 4: DoEvents: Wend


    With .document.getElementById("bm_ann_detail_iframe").contentDocument
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 3) = .getElementsByClassName("formContentDataH")(3).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 4) = .getElementsByClassName("company_name")(0).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 5) = .getElementsByClassName("formContentDataH")(1).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 6) = .getElementsByClassName("formContentData")(3).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 7) = .getElementsByClassName("formContentData")(4).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 8) = .getElementsByClassName("formContentData")(5).innerText
        ThisWorkbook.Worksheets("Sheet1").Cells(u, 9) = .getElementsByClassName("formContentData")(9).innerText

   End With
   Next u
End With
End Sub

1 Ответ

0 голосов
/ 30 сентября 2018

Я собираюсь предложить простой тест, что в ячейке есть строка "http" (используйте ее как основу для работы с URL).Я предпочитаю это тесту IsEmpty.Это должно смягчить попытки доступа к несуществующей странице во время вашего цикла.Кажется, ваша ошибка указывает на то, что кадр не находится во время цикла.Таким образом, возможности включают отсутствие URL-адреса в ячейке (из комментариев видно, что это возможно) или недопустимый URL-адрес / URL, не соответствующий ожидаемому шаблону.

Я имею дело с последними возможностями, используя OnОшибка Возобновить Следующее утверждение.Возможно, вы захотите выполнить отладку по конкретным ошибочным URL-адресам, если они присутствуют, чтобы проверить, не присутствует ли iframe, когда ожидается, и выявить какие-либо дополнительные уточнения.

В случае различного количества URL-адресов вы можете иметь фиксированный конеццикл, как вы в настоящее время, или динамически определить последнюю строку, например

Dim lastRow As Long
With ThisWorkbook.Worksheets("Sheet1")
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

Затем цикл из

For u = 2 To lastRow

Я все еще предпочитаю, чтобы тест Instr "http" былнастоящее время.

VBA:

Option Explicit
Public Sub GetInfo()
    Dim IE As New InternetExplorer, u As Long
    With IE
        .Visible = True

        For u = 2 To 100
            If InStr(Cells(u, 1).Value, "http") > 0 Then

                .navigate Cells(u, 1).Value

                While .Busy Or .readyState < 4: DoEvents: Wend
                On Error Resume Next
                With .document.getElementById("bm_ann_detail_iframe").contentDocument
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 3) = .getElementsByClassName("formContentDataH")(3).innerText
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 4) = .getElementsByClassName("company_name")(0).innerText
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 5) = .getElementsByClassName("formContentDataH")(1).innerText
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 6) = .getElementsByClassName("formContentData")(3).innerText
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 7) = .getElementsByClassName("formContentData")(4).innerText
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 8) = .getElementsByClassName("formContentData")(5).innerText
                    ThisWorkbook.Worksheets("Sheet1").Cells(u, 9) = .getElementsByClassName("formContentData")(9).innerText
                End With
                On Error GoTo 0
            End If
        Next u
    End With
End Sub
...