Вот 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"
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>
Выход:
Кроме того, вы можете изменить свой пример в соответствии с вашими требованиями. вам просто нужно получить ваши значения из листа и сопоставить их в приведенном выше коде.
Дайте нам знать, если у вас возникнут трудности с применением этого предложения.
Новые вопросы
html
HTML (язык разметки гипертекста) - это язык разметки для создания веб-страниц и другой информации, отображаемой в веб-браузере. Вопросы, касающиеся HTML, должны включать минимальный воспроизводимый пример и некоторое представление о том, чего вы пытаетесь достичь. Этот тег редко используется отдельно и часто используется вместе с [CSS] и [javascript].