Internet explorer 如何使用VBA访问网页(IHTMLDocument?)
使用以下代码,我可以打开Internet Explorer窗口并导航到该网站。我想更进一步,通过一个链接(比如“Boxing/UFC”)进行代码点击Internet explorer 如何使用VBA访问网页(IHTMLDocument?),internet-explorer,vba,excel,automation,Internet Explorer,Vba,Excel,Automation,使用以下代码,我可以打开Internet Explorer窗口并导航到该网站。我想更进一步,通过一个链接(比如“Boxing/UFC”)进行代码点击 由于该链接会导致Javascriptonclick事件(onclick=“gS(1020,9);return false;”“),因此您能否建议我使用代码,使VBA能够在VBA宏运行后在不受用户干扰的情况下单击该链接?在Internet Explorer中,您只需通过DOM API单击链接即可 检索您感兴趣的DOM节点(A),并在其上调用click
由于该链接会导致Javascript
onclick
事件(onclick=“gS(1020,9);return false;”“
),因此您能否建议我使用代码,使VBA能够在VBA宏运行后在不受用户干扰的情况下单击该链接?在Internet Explorer中,您只需通过DOM API单击链接即可
检索您感兴趣的DOM节点(A
),并在其上调用click()
。这还将触发所有关联的事件处理程序
编辑:在您的情况下,使用VBA,执行类似的操作(未测试,我这里没有VBA)
您需要查询html文档并检索集合。一旦检索到集合,就需要遍历元素并单击它 我在这里粘贴一段代码()。这是在C++中,但我假设它必须是同样的VB。
IHTMLElementCollection *spCollectEmbed;
spDocument->get_links(&spCollectEmbed);
if(spCollectEmbed)
{
// get all the links
long lLen;
spCollectEmbed->get_length(&lLen);
for (long i = 0; i < lLen; i++)
{
IDispatch *ppvdispOption;
IHTMLElement *interfaceHTMLElement;
VARIANT index;
index.vt = VT_I4;
index.lVal = i;
// get the item from the document
HRESULT hResult = spCollectEmbed->item(index, index, &ppvdispOption);
if(SUCCEEDED(hResult))
{
// query for the element
hResult = ppvdispOption->QueryInterface( IID_IHTMLElement,
(void **) &interfaceHTMLElement);
if(SUCCEEDED(hResult))
{
BSTR innerhtml;
interfaceHTMLElement->get_innerHTML(&innerhtml);
// click the links
interfaceHTMLElement->click();
Sleep(2000);
}
IHTMLElementCollection*spcollectionembed;
spDocument->get_链接(&spCollectEmbed);
如果(SPD)
{
//获取所有链接
朗伦;
spcollected->get_length(&lLen);
for(长i=0;iitem(索引、索引和ppvdispOption);
如果(成功(hResult))
{
//查询元素
hResult=ppvdispOption->QueryInterface(IID_IHTMlement,
(无效**)和接口限制);
如果(成功(hResult))
{
BSTR-innerhtml;
interfaceHTMLElement->get_innerHTML(&innerHTML);
//点击链接
interfaceHTMLElement->单击();
睡眠(2000年);
}
Hi Tomalak,请原谅,在使用VBA和DOM节点时,我是一个noob(尽管我已经对此进行了研究,并且已经提到过)你能详细说明一下吗?我会使用什么代码?@Jason请看编辑。我现在没有办法测试它。它仍然会让你知道该怎么做。无论是广泛使用VBA调试器还是参考都强烈建议DHI Tomalak,感谢示例代码。我设置了一个手表,SideNav代码似乎没有检索到值,因此NavLinks没有任何标记。我正在尝试参考MSDN文档,因此我将继续进行此操作,但如果您有任何其他建议,那将非常好。谢谢
Dim sideNav As IHTMLElement
Dim navLinks As IHTMLElementCollection
Dim currLink As IHTMLElement
Set sideNav = IE.document.getElementByID("sln")
Set navLinks = sideNav.all.tags("A")
For Each currLink In navLinks
If Trim(currLink.innerText) = "Boxing/UFC" Then
currLink.Click
End If
Next currLink
IHTMLElementCollection *spCollectEmbed;
spDocument->get_links(&spCollectEmbed);
if(spCollectEmbed)
{
// get all the links
long lLen;
spCollectEmbed->get_length(&lLen);
for (long i = 0; i < lLen; i++)
{
IDispatch *ppvdispOption;
IHTMLElement *interfaceHTMLElement;
VARIANT index;
index.vt = VT_I4;
index.lVal = i;
// get the item from the document
HRESULT hResult = spCollectEmbed->item(index, index, &ppvdispOption);
if(SUCCEEDED(hResult))
{
// query for the element
hResult = ppvdispOption->QueryInterface( IID_IHTMLElement,
(void **) &interfaceHTMLElement);
if(SUCCEEDED(hResult))
{
BSTR innerhtml;
interfaceHTMLElement->get_innerHTML(&innerhtml);
// click the links
interfaceHTMLElement->click();
Sleep(2000);
}