借助VBA,Internet Explorer将从列表中选择项目

时间:2018-10-10 09:39:37

标签: html excel vba internet-explorer web-scraping

早安,

我一直在寻找答案和解决方案,但在此网站上证明的解决方案似乎对包括selectedIndex和遍历数组没有帮助

我有以下HTML代码组成一个表格,我要从中选择第二个选项“ Vorige周”

<table cellspacing="0" cellpadding="0" title=""  class="mstrListBlock" 
id="id_mstr51" style="display: table; width: auto;">
<tbody>
<tr>
<td class="mstrListBlockCell">
<span class="">
<div class="mstrListBlockCaption" style="display: none;"/>
<div class="mstrListBlockHeader" style="display: none;">
<div style="" class="mstrListBlockContents" 
id="ListBlockContents_id_mstr51">
<div oncontextmenu="return 
mstr.behaviors.Generic.oncontextmenu(arguments[0], self, 'id_mstr51');" 
onmouseup="try{mstr.$obj('id_mstr51').focus();}catch(localerr){}; return 
mstr.behaviors.Generic.clearBrowserHighlights(self)" onmousedown="var retVal 
= mstr.behaviors.ListView.onmousedown(arguments[0], self, 'id_mstr51'); 
try{mstr.$obj('id_mstr51').focus();}catch(localerr){}; return retVal" 
ondblclick="return mstr.behaviors.ListView.ondblclick(arguments[0], self, 
'id_mstr51')" class="mstrListBlockListContainer" id="id_mstr51ListContainer" 
style="display: block;">
<div class="mstrListBlockItem" title="Huidige Week">
<div class="mstrListBlockItemSelected" title="Vorige Week">
<div class="mstrBGIcon_fi mstrListBlockItemName" style="background-position: 
2px 50%; padding-left: 23px;">Vorige Week</div>
</div>
<div class="mstrListBlockItem" title="Afgesloten 4 Weken">
<div class="mstrListBlockItem" title="Afgesloten 8 Weken">
<div class="mstrListBlockItem" title="Huidige Periode">
<div class="mstrListBlockItem" title="Vorige Periode">
<div class="mstrListBlockItem" title="Afgesloten 2 Perioden">
<div class="mstrListBlockItem" title="Selectie Datum Hiërarchie. Aangepast 
wegens IServer crash icm. Metric prompts.">
<div class="mstrListBlockItem" title="Gisteren">

我认为我的问题在于确定需要使用哪个元素才能获得理想的结果

Sub JDWReport()

Dim objIE As InternetExplorer

Set objIE = New InternetExplorerMedium
objIE.Visible = True

objIE.navigate "URL"

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

objIE.document.getElementById("Uid").Value = "username"
objIE.document.getElementById("Pwd").Value = "password"
objIE.document.getElementById("3054").Click

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
objIE.navigate "URL2"

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
objIE.document.getElementsClassName("mstrBGIcon_fi 
mstrListBlockItemName")(0).Click

objIE.Quit
End Sub

请参阅上面我正在使用的代码。 它卡在了objIE.document.getElementsClassName(“ mstrBGIcon_fi     mstrListBlockItemName“)(0)。点击 我尝试根据HTML代码将此行更改为其他元素,并使用.click .selectedindex = 2,但这些行不起作用。

<div class="mstrListBlockItemSelected" title="Vorige Week">

当前它说mstrListBlockItemSelected,但是,当第一次导航到站点时,该类被定义为其余的mstrListBlockItem。

仅当您单击有问题的项目(从项目列表中)时,它将更改为选定。我的最终目标是使标题为“ Vorige Week”的班级从mstrListBlockItem更改为mstrListBlockItemSelected。

2 个答案:

答案 0 :(得分:0)

我可以看到您正在使用HTML Table并在其中创建DIV。

我尝试搜索发现没有任何方法或属性可用于选择DIV中的文本。

我建议您使用任何HTML控件来选择其值。例如“选择选项”。

您可以尝试使用select创建下拉列表,然后使用下面的代码在其中选择任何值。

Sub Select_Item()
    Dim post As Object, elem As Object

    With CreateObject("InternetExplorer.Application")
        .Visible = True
        .navigate "C:\Users\WCS\Desktop\element.html"  
       
       While .Busy = True Or .ReadyState < 4: DoEvents: Wend

        Set post = .Document.getElementById("ctl00_ContentPlaceHolder1_ddlCycleID")
       
       For Each elem In post.getElementsByTagName("option")
            If InStr(elem.Value, "10") > 0 Then elem.Selected = True: Exit For
        Next elem
    End With

End Sub

答案 1 :(得分:0)

您可以尝试使用属性=值CSS选择器:

ie.document.querySelector("[title='Vorige Week']").Selected = True

ie.document.querySelector("[title='Vorige Week']").Click