使用VBA

时间:2018-01-12 20:33:58

标签: html excel excel-vba html-table vba

我正在尝试使用VBA在Excel中创建自动化工具,该工具从网站门户运行并下载数据库查询。该工具几乎完全正常运行,但我无法弄清楚的一步是查询选择。

用户在门户网站中搜索了查询后,适用的查询将放入HTML表格中的行中。用户可以通过两种方式运行查询:双击一行或单击一行,然后单击门户中的另一个按钮。我的困难在于,即使经过数小时的研究,我也无法预先形成这两种策略。

表格第一行的HTML代码(这是所需的查询)如下所示。我包含了td标签,因此您还可以看到该行中的单元格。

<TABLE class="x-grid-table x-grid-table-resizer" style="WIDTH: 1867px" cellSpacing=0 cellPadding=0 border=0>
    <TBODY>
        <TR class="x-grid-row " _nodup="30806" viewIndex="0" viewRecordId="ext-record-17" boundView="objectgridview">
            <TD class=" x-grid-cell x-grid-cell-gridcolumn-1085   x-grid-cell-first" rowSpan="1" colSpan="1">
                <DIV class="x-grid-cell-inner " style="TEXT-ALIGN: left">
                    <SPAN class="grid-icon view-16"></SPAN>
                    <SPAN>QUERYNAME</SPAN> 
                </DIV>
            </TD>
            <TD class=" x-grid-cell x-grid-cell-gridcolumn-1086   " rowSpan="1" colSpan="1">
                <DIV class="x-grid-cell-inner " style="TEXT-ALIGN: left">QUERYTYPE</DIV></TD>
            <TD class=" x-grid-cell x-grid-cell-gridcolumn-1087   " rowSpan="1" colSpan="1">
                <DIV class="x-grid-cell-inner " style="TEXT-ALIGN: left">QUERYDESCRIPTION</DIV>
            </TD>
            <TD class=" x-grid-cell x-grid-cell-gridcolumn-1088   " rowSpan="1" colSpan="1">
                <DIV class="x-grid-cell-inner " style="TEXT-ALIGN: left">QUERYLIBRARY</DIV>
            </TD>
            <TD class=" x-grid-cell x-grid-cell-gridcolumn-1089   " rowSpan="1" colSpan="1">
                <DIV class="x-grid-cell-inner " style="TEXT-ALIGN: left">QUERYOWNER</DIV>
            </TD>
            <TD class=" x-grid-cell x-grid-cell-datecolumn-1090    x-grid-cell-last" rowSpan="1" colSpan="1">
                <DIV class="x-grid-cell-inner " style="TEXT-ALIGN: left">QUERYDATE</DIV>
            </TD>     
        </TR>
    </TBODY>
</TABLE>

我还查看了Chrome中的HTML,唯一的另一个区别是,当鼠标光标在该行上时,tr类名切换到“x-grid-row x-grid-row-over”并且“x-单击行时,网格行x-grid-row-selected x-grid-row-over-focused。

如上所述,我尝试了多种方法来点击这一行。我能够使用getElementsByTagName来识别行/表/其他元素,但即使找到这个后我仍然找不到成功。

我使用的一些代码行如下所示。

IE.document.getElementsByTagName("tr")(42).Classname = "x-grid-row x-grid-row-selected x-grid-row-focused"
IE.document.getElementsByTagName("table")(20).Rows(0).Click
IE.document.getElementsByTagName("tr")(42).getElementsByTagName("td")(3).getElementsByTagName("div")(0).Click
IE.document.getElementsByTagName("tr")(42).getElementsByTagName("td")(3).Selected = True
Call IE.document.getElementsByTagName("tr")(42).execScript("mouseup()", "Javascript")

Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys ("-{F10}")
WshShell.SendKeys "{DOWN}"
WshShell.SendKeys "{ENTER}"

我希望有人能够提供一些我缺少的知识。谢谢!

3 个答案:

答案 0 :(得分:0)

我从未尝试过双击,因此如果这不起作用,我们可能需要更换第二个.click以点击您网页上的其他元素。

此代码应遍历表中的所有行。您可以根据需要进行修改。

<强>代码:

Option Explicit

Sub GrabRows()

    Dim ie As InternetExplorer, doc As HTMLDocument

    'Ensure you have code in place to navigate and
    'ensure the page is fully loaded here.

    Dim myTbl As HTMLTable, tRows As HTMLTableRow, tRow As HTMLTableRow

    Set doc = ie.document
    Set myTbl = doc.getElementsByClassName("x-grid-table x-grid-table-resizer")(2)
    Set tRows = myTbl.getElementsByTagName("TR")(2)

    '____Save as a backup____
    'For Each tRow In tRows
    '    tRow.Click
    '    tRow.Click
    'Next tRow
    '------------------------

    'Try each of these together and see if you get desired result
    tRow.Click
    tRow.setActive
    tRow.Focus


End Sub
  

需要做的两件事之一。您需要引用Microsoft Internet Controls Microsoft HTML Object Library,或声明所有特定于库的对象(例如InternetExplorer&amp; HTMLDocument)作为类型Object

答案 1 :(得分:0)

我不确定这是否适用于您的情况,但我一直在处理kendo-ui中的相同问题。我使用以下代码选择kendoGrid中的第一行。

       ie.Document.parentWindow.execScript "$('#drgdLease').data('kendoGrid').select('tr:eq(6)');"

在服务器代码中进一步查看&#34;表&#34;标签,对于&#34; ID&#34;,可能远远超过&#34; div&#34;元素,并尝试类似:

       ie.Document.parentWindow.execScript "$('#yourId').data('x-grid').select('tr:eq(42)');"

我认为你最好的办法是找出制作&#34; execScript&#34;工作。我花了很长时间才得到这一行,我得到了帮助! 祝你好运

答案 2 :(得分:0)

您尝试将属性选择器与FireEvent结合使用吗?

ie.document.querySelector("[_nodup='30806'][viewindex='0']").FireEvent "ondblclick"

这将定位第一行并双击。这些属性也会改变吗?