Извлеките все элементы из выпадающего списка на веб-сайте и вставьте их в таблицу Excel с помощью VBA. - PullRequest
0 голосов
/ 01 июля 2019

Мне нужно извлечь все элементы из выпадающего списка на веб-сайте и вставить его в таблицу Excel по столбцам.

Я предполагаю, что getElementById должен работать .. Есть идеи, как это сделать? Спасибо.

Ниже приведен HTML-код отладчика. Список постоянно обновляется, поэтому мне нужно извлекать этот обновленный список в столбец Excel каждый раз, когда мне нужно создавать отчеты по компаниям.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>
<HEAD>
    <title>BBP::Reports</title>
    <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    <meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
    <meta content="JavaScript" name="vs_defaultClientScript">
    <meta content="http://schemas.microsoft.com/intellisense/ie5" 
name="vs_targetSchema">
    <LINK href="Styles.css" type="text/css" rel="stylesheet">
</HEAD>
<body MS_POSITIONING="GridLayout">
    <form method="post" action="./advrep_n.aspx" id="Form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" 
 />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 



value="/wEPDwUJODc1NTQzNzM4DjB/b4C3EeltFSjXjpspkhpCg==" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['Form1'];
if (!theForm) {
theForm = document.Form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
    theForm.__EVENTTARGET.value = eventTarget;
    theForm.__EVENTARGUMENT.value = eventArgument;
    theForm.submit();
}
}
//]]>
</script>


<div class="aspNetHidden">

<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" 
value="3479CCB4" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" 


value="/wEdAMcCytJuOAwHIV9g5j76SLhgqMo8=" />
</div>
        <input type="submit" name="btnsearch" value="Search" 
id="btnsearch" 
title="Click here to search" 
onmouseover="this.style.backgroundColor=&#39;#D83D54&#39;" 
onmouseout="this.style.backgroundColor=&#39;#616161&#39;" 
style="color:White;background-color:#616161;font- 
family:Arial;height:25px;width:87px;Z-INDEX: 120; LEFT: 832px; POSITION: 
absolute; TOP: 78px" />



        <span id="Label5" style="display:inline- 
block;color:White;background-color:Transparent;font-family:Arial;font- 
size:Large;font-weight:bold;height:28px;width:288px;Z-INDEX: 147; LEFT: 
663px; POSITION: absolute; TOP: -1px"><p align="center"> Behavior Based 
Process</span>
        <select name="ddlCategory" id="ddlCategory" tabindex="1" 
style="font-family:Verdana;font-size:8pt;height:55px;width:231px;Z-INDEX: 
154; LEFT: 578px; POSITION: absolute; TOP: 73px">
<option value=""></option>
<option value="Project">Project</option>
<option value="Maintenance">Maintenance</option>
<option value="Operations">Operations</option>
<option value="Shutdown">Shutdown</option>



 </select><span id="Label7" style="display:inline-block;background- 
 color:Transparent;font-family:Verdana;font- 
 size:8pt;height:6px;width:34px;Z-INDEX: 112; LEFT: 190px; POSITION: 
absolute; TOP: 160px">Task:</span><select name="ddlCompany" 
id="ddlCompany" tabindex="1" style="font-family:Verdana;font- 
size:8pt;height:55px;width:230px;Z-INDEX: 115; LEFT: 578px; POSITION: 
absolute; TOP: 136px">
<option value=""></option>
<option value="Acuren">Acuren</option>
<option value="Ahmadiah">Ahmadiah</option>
<option value="Al Bahar">Al Bahar</option>
<option value="Al Mussairie">Al Mussairie</option>
<option value="Al Subol">Al Subol</option>
<option value="Al-Barrak">Al-Barrak</option>
<option value="Al-Eisa">Al-Eisa</option>
<option value="Al-Julaih">Al-Julaih</option>
<option value="Al-Khadda">Al-Khadda</option>
<option value="Al-Kulaib">Al-Kulaib</option>
<option value="Al-Saqabi">Al-Saqabi</option>
<option value="Al-Zahim">Al-Zahim</option>
<option value="ALESSA">ALESSA</option>
<option value="Alghanim">Alghanim</option>
<option value="Alliance">Alliance</option>
<option value="ALMEER">ALMEER</option>

Ответы [ 2 ]

4 голосов
/ 01 июля 2019

Вы можете использовать селектор идентификатора css , чтобы получить родительский элемент select, затем добавить комбинатор потомков и селектор типа option, чтобы получить дочерние теги option в родительском select. Селекторы CSS применяются через querySelector (Single match) или querySelectorAll, чтобы получить все совпадения. Затем вы можете зациклить возвращенный нодлист, сохранить атрибуты значения в массиве и записать этот массив один раз на лист

Option Explicit
Public Sub test()
    Dim ie As Object, options As Object, output(), i As Long, ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True
        .Navigate2 "url"
        While .busy Or .readystate <> 4: DoEvents: Wend

        Set options = .document.querySelectorAll("#ddlCompany option")
        ReDim output(1 To options.Length - 1)
        For i = 1 To options.Length - 1          'ignore first empty value
            output(i) = options.Item(i).Value
        Next
    End With
    ws.Cells(1, 1).Resize(UBound(output), 1) = Application.Transpose(output)
End Sub
0 голосов
/ 01 июля 2019

Не видя HTML-код с веб-сайта, сложно дать определенный ответ, но да, вы бы хотели начать с вызова getElementsById, если в раскрывающемся списке указан идентификатор.Я вставил в пример, который предлагает W3Schools, чтобы создавать выпадающие списки, но есть и другие способы.(Я добавил идентификатор.)

Если вы получили результат, то есть у вас есть узел, где находится идентификатор, вы можете перебрать объект ChildNodes, который является одним из его свойств, а затем проверить свойства каждого дочернего элемента.,Поэкспериментируйте с получением нужных и поместите их в ячейки Excel и настройте в зависимости от вашего дизайна.

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

<select id="CarMakes" name="cars">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="fiat">Fiat</option>
  <option value="audi">Audi</option>
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...