2015-07-02 69 views
1

我想解析一个网页,但在获取信息时遇到困难。excel VBA - 解析数据的函数

我有一个简单的按钮,浏览到一个网站,在工作表中

Private Sub Sellit_Click() 
Dim IE As Object 
Dim HTMLDoc As HTMLDocument 
Dim oHTML_Element As IHTMLElement 

Set IE = CreateObject("Internetexplorer.Application") 
IE.Visible = True 
apiShowWindow IE.hwnd, SW_MAXIMIZE 
IE.navigate "https://www.yahoo.com/" 
Do 
Loop Until IE.ReadyState = READYSTATE_COMPLETE 
DoEvents 

Scrape 

End Sub 

虽然功能刮模块

Function Scrape() 

Dim IE As Object 
Dim HTMLDoc As HTMLDocument 
Dim oHTML_Element As IHTMLElement 

MsgBox IE.document.Title 

End Function 

在我还挺想我知道这里的问题是IE没有按不从工作表去模块,反之亦然,但我不太清楚如何解决它。

您的帮助将非常apperciated

+0

这种方法在哪里失败? “IE.ReadyState”不等于“READYSTATE_COMPLETE”吗? Scrape()被调用了吗?在Scrape中,你永远不会将“IE”,“HTMLDoc”或“oHTML_Element”绑定到任何东西。 – Evan

+0

抱歉,我对vba很陌生,在IE.readyState = Readystate_complete之后我调用了Scrape,并且我想要现有的IE的document.title,然后用msgbox测试它,看看我是否得到回报,显然不是。我如何拥有现有的IE标题? – Crays

+1

我看到你试图调用'Scrape'的地方,但是我的问题是宏执行得太远,或者它在循环中挂起。我之前评论的第二部分仍然是真实的,“IE”从来没有设置为“Scrape”中的任何内容。 “Scrape”中的“IE”与“Sellit_Click”中的“IE”不同。 Dim关键字将它记录在不同位置的内存中。你可以通过'IE',rebind'IE'或者使用全局可变的'IE' [Varriable Scope](http://www.cpearson.com/excel/scope.aspx)在这里很重要。 – Evan

回答

2

你不得不公开宣布该IE对象变量,然后用它的全名是指它。要做到这一点:

  1. Worksheet代码模块类型Public IE as Object
  2. SellIt Click事件和Scrape函数中删除变量声明IE的顶部。由于这是公开声明的,因此不应在代码中私下声明。
  3. 在标准模块中,还删除了IE声明。 (与步骤2相同的原因)
  4. 更改MsgBox IE.document.Title以包含工作表的代号。例如,如果表单代号为Sheet1,则应该显示为MsgBox Sheet1.IE.document.Title

让我知道是否有帮助。

+0

完美运作!感谢您的知识! – Crays