Excel VBA - ошибка 91, когда значение HTML равно нулю - PullRequest
0 голосов
/ 30 марта 2020

Привет! Недавно я обнаружил Excel VBA и использую его для изучения немецкого языка.

У меня есть список немецких слов, но нет значения / части речи, примеры предложений и т. Д. c.

Я написал макрос для go на веб-сайте (https://dictionary.cambridge.org/dictionary/german-english/) и получил html данные.

Однако для некоторых слов примеры предложений не являются предоставлено (отсюда html, не возвращающее значения и ошибка 91).

Я сослался на другие посты по этому поводу и добавил If Not HTMLDo c .getElementsByClassName () Is Nothing Then заявления, но не повезло пока что.

Не могли бы вы сказать мне, как написать код, так что если нет значения html, макрос переходит и go к следующему слову? (слово задается целым числом, соответствующим номеру ячейки в листе Excel)


    Dim XMLReq As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim i As Integer
    Dim strURL As String


    For i = 2 To 3493

        strURL = "https://dictionary.cambridge.org/dictionary/german-english/" & Range("A" & i)
        XMLReq.Open "Get", strURL, False
        XMLReq.send

        If XMLReq.Status <> 200 Then
            MsgBox "Error."
            Exit Sub
        End If

        HTMLDoc.body.innerHTML = XMLReq.responseText

        Set XMLReq = Nothing

        'Part
        If IsObject(HTMLDoc.getElementsByClassName("pos dpos")) Then
            Range("B" & i) = HTMLDoc.getElementsByClassName("pos dpos")(0).innerText
        End If

        'Meaning
        If IsObject(HTMLDoc.getElementsByClassName("ddef_h")) Then
            Range("C" & i) = HTMLDoc.getElementsByClassName("ddef_h")(0).innerText
        End If

        'ExampleGer

        If Not HTMLDoc.getElementsByClassName("eg deg") Is Nothing Then
            i = i + 1
        Else
            Range("D" & i) = HTMLDoc.getElementsByClassName("eg deg")(0).innerText
        End If

        'ExampleEng
        If Not HTMLDoc.getElementsByClassName("trans dtrans hdb") Is Nothing Then
            i = i + 1
        Else
            Range("E" & i) = HTMLDoc.getElementsByClassName("trans dtrans hdb")(0).innerText
        End If

    Next i


End Sub


1 Ответ

0 голосов
/ 31 марта 2020

Хорошо, я немец, и поэтому мне не нужны были примеры слов.
Слово, которое дает все 4 значения: Haus (дом)
Слово, которое дает только 2 значения: Gummibaum (каучуковый завод)

Попробуйте следующий код и, пожалуйста, ...

НИКОГДА! НИКОГДА! НИКОГДА! манипулировать счетной переменной для l oop в блоке кода l oop. Никогда не используйте это i = i + 1, если i является переменной подсчета для l oop. Если вы сделаете это, вы столкнетесь с проблемами в 99,9%

Sub Dictionary()

    Dim XMLReq As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim i As Integer
    Dim strURL As String

    'Use object variables for each node you want to read from the DOM tree
    'In the code below, these variables are then used to check whether an object exists or not
    Dim nodePart As Object
    Dim nodeMeaning As Object
    Dim nodeExampleGer As Object
    Dim nodeExampleEng As Object

    For i = 2 To 3493

        strURL = "https://dictionary.cambridge.org/dictionary/german-english/" & Range("A" & i)
        'strURL = "https://dictionary.cambridge.org/dictionary/german-english/haus"
        XMLReq.Open "Get", strURL, False
        XMLReq.send

        If XMLReq.Status <> 200 Then
            MsgBox "Error."
            Exit Sub
        End If

        HTMLDoc.body.innerHTML = XMLReq.responseText

        Set XMLReq = Nothing

        'Part
        Set nodePart = HTMLDoc.getElementsByClassName("pos dpos")(0)
        If Not nodePart Is Nothing Then
            Range("B" & i) = nodePart.innerText
        End If

        'Meaning
        Set nodeMeaning = HTMLDoc.getElementsByClassName("ddef_h")(0)
        If Not nodeMeaning Is Nothing Then
            Range("C" & i) = nodeMeaning.innerText
        End If

        'ExampleGer
        Set nodeExampleGer = HTMLDoc.getElementsByClassName("eg deg")(0)
        If Not nodeExampleGer Is Nothing Then
            Range("D" & i) = nodeExampleGer.innerText
        End If

        'ExampleEng
        Set nodeExampleEng = HTMLDoc.getElementsByClassName("trans dtrans hdb")(0)
        If Not nodeExampleEng Is Nothing Then
            Range("E" & i) = nodeExampleEng.innerText
        End If
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...