从网站的组合框中提取所有项目,然后使用VBA粘贴到Excel工作表中

时间:2019-07-01 03:21:18

标签: excel vba

我需要从网站上的下拉列表中提取所有项目,并将其逐列粘贴到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 个答案:

答案 0 :(得分:4)

您可以使用css id选择器获取父select元素,然后添加后代组合器和option类型选择器以获取父项中的子option标签select。 CSS选择器通过querySelector(单次匹配)或querySelectorAll来获取所有匹配项。然后,您可以循环返回的nodeList并将value属性存储到数组中,并将该数组一次写到工作表中

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

答案 1 :(得分:0)

在没有看到网站的HTML代码的情况下,很难给出明确的答案,但是是的,如果下拉列表被赋予了ID,则您希望从getElementsById调用开始。我在示例中粘贴了W3Schools建议创建下拉列表的示例,但还有其他方法。 (我添加了一个ID。)

如果得到结果,则拥有id所在的节点,则可以遍历作为其属性之一的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>