Я не могу извлечь внутренний текст из атрибута «span title» (значение «17L2002131/Тип устройства для электрических интеллектуальных счетчиков/Управляемые веб-службы DCCI/ Ожидание») ссылки IE. Взяв статус, например, ОЖИДАНИЕ для извлеченного внутреннего текста, я затем хочу, чтобы он был вставлен во входную ячейку листа Excel, где остальные данные для выполнения теста заносятся в таблицу.
В настоящее время код не может найти атрибут "Title" = "Перейти к устройству" и пропускает строку: Worksheets("Sheet2").Range("D5") = " Активность не найдена2" вместо перехода к первому блоку If Else.
Ниже мой код VBA. Не могли бы вы помочь мне найти, где я ошибаюсь.
Set objSubCollec = objCollection(0).contentWindow.document.getElementById("tabPage")
Set objElement = objSubCollec.contentWindow.document
Set elm = objElement.querySelectorAll("a.pseudoLink")
Set elm = objElement.getElementsByTagName("span")
For Each e In elm
If e.getAttribute("title") = "Go To Device" Then
If e.innerText Like "*Commissioned*" Then
Worksheets("Sheet2").Range("D5") = "Commissioned"
ElseIf e.innerText Like "*Pending*" Then
Worksheets("Sheet2").Range("D5") = "Pending"
Else
Worksheets("Sheet2").Range("D5") = "Active"
End If
Else
Worksheets("Sheet2").Range("D5") = "No Activity found2"
Exit For
End If
Next
Фрагмент HTML страницы:
<tbody class="dataExplorerTableBody" id="dataExplorerTableBody1" style="width: 1022px; overflow: auto; display: block; position: relative; max-height: 125px;" currentsortcolumn="0" currentsortdirection="None">
<tr><td class="grid paddedCell explorerGrid gridFirstColumn nowrap cursorDefault" style="width: 45px; min-width: 45px;" scope="row" nbr="1" listProcess="N"><table role="presentation" style="padding: 0px; width: 100%; border-spacing: 0px;" summary=""><tbody><tr ignoremouse="true">
<td style="text-align: left;"></td><td class="firstCol" style="text-align: right;"><input tabindex="5" id="deOption0_zone_1" type="checkbox" value=""></td></tr></tbody></table></td><td class="grid paddedCell explorerGrid nowrap reg cursorDefault" style="width: 153px; min-width: 153px;" nbr="1" listProcess="N">
<span>00‑00-93</span>
</td><td class="grid paddedCell explorerGrid nowrap reg cursorDefault clickable" style="width: 533px; min-width: 533px;" nbr="1" listProcess="B"><img tabindex="5" title="Show Context Menu" class="imageTypeElement uiMargin oraContextMenuImg " role="button" alt="Show Context Menu" src="./images/alta/popMenuButton.png?ltr" contextmenu="D1_CONTEXT_DEVICE" decontrol="contextMenu"><a tabindex="5" class="pseudoLink" role="link" navigable="" navoptcd="d1dvcTabMenu">
<span title="Go To Device">17L2002131 / Device Type for Electric Smart Meters / DCCI Managed Web Services / Pending</span></a></td>
<td class="grid paddedCell explorerGrid nowrap reg cursorDefault" style="width: 167px; min-width: 167px;" nbr="1" listProcess="N"><span>DCCI Managed Web Services</span></td></tr></tbody>
1 ответ
Если вы сделаете Set elm = objElement.getElementsByTagName("span")
, тогда elm
будет содержать все теги span
, существующие в вашем коде.
Таким образом, For Each e In elm
будет проходить через них, и если он найдет один span
без title="Go To Device"
, ваша ячейка D5 покажет No Activity found2
и немедленно выйдет из подпрограммы. Таким образом, даже если где-то раньше или позже в HTML-коде будет <span title="Go To Device">
, если существует хотя бы один span
без title="Go To Device"
, ваша ячейка всегда будет возвращать No Activity found2
.
Таким образом, вы должны написать "No Activity found2"
в ячейку до начала поиска title="Go To Device"
(по умолчанию), если он не был найден, он останется по умолчанию "No Activity found2"
иначе он будет перезаписан Commissioned
, Pending
или Active
:
Set objSubCollec = objCollection(0).contentWindow.document.getElementById("tabPage")
Set objElement = objSubCollec.contentWindow.document
Set elm = objElement.querySelectorAll("a.pseudoLink") 'remove this it does nothing because elm gets set in the next line.
Set elm = objElement.getElementsByTagName("span") 'now elm contains ALL span tags
'set "No Activity found2" as default …
Worksheets("Sheet2").Range("D5") = "No Activity found2"
'… and overwrite it with Commissioned/Pending/Active only if that is found.
For Each e In elm
If e.getAttribute("title") = "Go To Device" Then
If e.innerText Like "*Commissioned*" Then
Worksheets("Sheet2").Range("D5") = "Commissioned"
ElseIf e.innerText Like "*Pending*" Then
Worksheets("Sheet2").Range("D5") = "Pending"
Else
Worksheets("Sheet2").Range("D5") = "Active"
End If
End If
Next e
Обратите внимание, что если имеется более одного <span title="Go To Device">
, то только последний в коде будет результатом в D5, все остальные до этого будут перезаписаны этим последним результатом.
Похожие вопросы
Новые вопросы
excel
Только для вопросов по программированию объектов или файлов Excel или по разработке формул. Вы можете комбинировать тег Excel с тегами и вопросами VBA, VSTO, C#, VB.NET, PowerShell, OLE и другими тегами и вопросами, связанными с программированием, если это применимо. НЕ используйте с другим программным обеспечением для работы с электронными таблицами, например [google-sheets].
For Each e1 In elm1
, ноelm1
– этоNothing
, он не определен. Убедитесь, что вы всегда используетеOption Explicit
, чтобы избежать опечаток в переменных. И правильно объявите все свои переменные. Изменить и включить свои объявления в свой код в вопросе. • Я настоятельно рекомендую не использовать пронумерованные имена переменных, их легко перепутать, и вы быстро столкнетесь с ошибками. Вместо этого используйте осмысленные имена.