Вот HTML-код, который я вижу, и часть макроса и цели:

<a class="Ligne0 OrderNo" style="width: 100%; height: 100%; display: block;">20190180963865</a>

    MsgBox IE.document.Url
    Dim element As IHTMLElement
    Dim elements As IHTMLElementCollection
    Dim HTML As HTMLDocument

    Set HTML = IE.document

    Set elements = HTML.getElementsbyclassname("Ligne0 OrderNo")

    Dim Count As Long
    Dim erow As Long
    Dim BOO

    Count = 0

    For Each element In elements

        If element.classname = "Ligne0 OrderNo" Then

            erow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

            Cells(erow, 1) = HTML.getelementsbytagname("a")(Count).innertext

            BOO = HTML.getelementsbytagname("a")(Count).innertext

            Count = Count + 1

        End If

    Next element

    Range("A2:B11").Select
    Columns("A:A").EntireColumn.AutoFit
    Columns("B:B").ColumnWidth = 36

    MsgBox BOO

End Sub

Класс Ligne0 OrderNO уникален по своему корпусу. Мне нужно перепроверить «20190180963865» с созданным мною массивом, и при обнаружении я могу щелкнуть элемент, который перенесет меня на другую страницу.

Что я попробовал: ** MSGBOX.ie.document.url дает мне правильный URL. Я обрезал верхнюю часть макроса здесь, чтобы сэкономить место.

MSGBOX BOO должен дать мне «20190180963865», но вместо этого ничего не дает. Я добавил .innertext и .value, но тогда msgbox просто не появляется.

затем с BOO я хочу, чтобы иметь возможность щелкнуть текст на IE

** Я уже проверил "ссылки на интернет-контроль Microsoft" и "библиотека объектов Microsoft HTML"

0
Bayron Jaramillo

2 ответа

Вам не нужен цикл, и класс уже предназначен для интересующего тега a , поэтому вы не хотите затем пытаться выбирать по tagName, когда он уже на нужном уровне. querySelector возвращает один узел; первый узел, соответствующий указанному селектору, который в данном случае является составным className для интересующего элемента (составные классы объединяются знаком «.», а «.» представляет селектор класса css).

Dim BOO As String, element As Object

Set element = HTML.querySelector(".Ligne0.OrderNo")

If Not element Is Nothing Then
    BOO = element.innerText
    'do whatever else when element is found
End If

Вы сказали, что msgbox Boo ничего не возвращает. Возможная причина в том, что вы устанавливаете эту переменную в цикле и извлекаете значение вне цикла. Поэтому возможно, что при попытке получить значение в это время оно будет заменено пустым значением.

На основе приведенного выше кода я разрабатываю этот пример, который перебирает все ссылки на веб-странице, сопоставляет его внутренний текст и имя класса и щелкает ссылку.

Код VBA:

Sub demo()

    Dim i As Long
    Dim URL As String
    Dim IE As Object

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = True

    URL = "D:\Backup20190913\tests\295.html"

    IE.Navigate URL


    Do While IE.readyState = 4: DoEvents: Loop   'Do While
    Do Until IE.readyState = 4: DoEvents: Loop   'Do Until

    Set Alllinks = IE.document.getElementsByTagName("A")

    For Each Hyperlink In Alllinks
        If Hyperlink.innerText = "20190180963865" And Hyperlink.className = "Ligne0 OrderNo" Then
            Hyperlink.Click


        End If
    Next Hyperlink

    'Unload IE
    'Set IE = Nothing


End Sub

Пример HTML-кода:

<!doctype html>
<html>
<head>
<script>
function abc()
{
alert("clicked...");
}
</script>
</head>
<body>
<a class="Ligne0 OrderNo" style="width: 100%; height: 100%; display: block;" onclick="abc()">20190180963865</a>

</body>
</html>

Выход:

enter image description here

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

Дайте нам знать, если у вас возникнут трудности с применением этого предложения.

58541927