我在Excel 2007中使用VBA。 在excel userform上有四个控件:
我正在尝试使用onchange事件将加载的webbrowers文档innerhtml传递给文本框控件但是仍然收到错误91对象变量或未设置块变量。 我做错了什么?
以下是代码:
Private Sub MultiPage1_Change()
Dim strhtml As String
Dim strSelectItem As String
strhtml = ""
If IsNull(Me.ListBox1.value) Then
MsgBox "No Source View selection made. Have gone with 'Doc innerHTML'"
Me.ListBox1.Selected(0) = True
strSelectItem = "Doc innerHTML"
Else
strSelectItem = Me.ListBox1.value
End If
Select Case strSelectItem
Case "Doc innerHTML"
strhtml = WebBrowser1.Document.documentElement.innerhtml
Case "Doc innerText"
strhtml = WebBrowser1.Document.documentElement.innerText
Case "Body innerHTML"
strhtml = WebBrowser1.Document.body.innerhtml
Case "Body innerText"
strhtml = WebBrowser1.Document.body.innerText
End Select
' strhtml = WebBrowser1.Document.documentElement.outerhtml
MultiPage1.value = 1
MultiPage1.Pages(1).TextBox2.value = ""
MultiPage1.Pages(1).TextBox2.value = strhtml
End Sub
Private Sub UserForm_Initialize()
'Disable the Back button
CommandButton2.Enabled = False
'Disable the Forward button
CommandButton3.Enabled = False
With Me.ListBox1
.AddItem "Doc innerHTML"
.AddItem "Doc innerText"
.AddItem "Body innerHTML"
.AddItem "Body innerText"
End With
End Sub
答案 0 :(得分:0)
在这里走出困境但我在使用IE /浏览器自动化时经常看到这种91型错误。通常伴随着"如果我手动单步操作,我的代码就可以工作!"
常见问题是您未允许网络浏览器完成加载,如果仍在加载,则.Document
为Nothing
,这将产生91错误
通常有效的解决方案是准备好的等待循环。假设它的实际名称为WebBrowser1
,其余代码看起来还不错。
基本上你需要将线程放在一个循环中,直到浏览器加载了页面。在伪代码中,您正在执行:
Do Until Browser Is Loaded
DoEvents 'etc.
Loop
使用WinAPI睡眠功能
您需要使用WinAPI Sleep
功能(很多人使用DoEvents
或Application.Wait
,但我在此处发现Sleep
更可取。
因为它是Declare
,您必须将其放在普通模块中,它不能进入类或用户表单模块。
'## This needs to go in an ordinary code module
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
调用WinAPI睡眠功能
Sleep 250 'sleep for 1/4 of a second, or Sleep 1000 to sleep for a full second, etc.
全部放在一起
您需要在Do ... Loop
方法之后立即调用.Navigate
来调用此函数。
'## This goes in where you do Navigate method:
WebBrowser1.Navigate "http://google.com"
Do
Sleep 250
Loop While Not WebBrowser1.ReadyState <> READYSTATE_COMPLETE
Debug.Print WebBrowser1.Document.DocumentElement.InnerHtml
如果它仍然不起作用......
是的,总是例外。我做的网络自动化很少,而我所做的大部分工作就是在这里修补一些东西来帮助人们。我注意到,越来越多的网站是动态提供的(AJAX可能是?),在这些情况下,浏览器可能是.ReadyState = READYSTATE_COMPLETE
甚至是.Busy = False
,但.Document
仍然是{{} 1}}。
如果发生这种情况,您可以设置二级循环,例如:
Nothing
您可能希望在那里添加迭代器/计数器并模拟超时,否则可能会进入无限循环。
注意我的协助能力非常有限,上面已经过测试,但我确实never been able to get the WebBrowser control to "work"超过了大约5分钟。我可以对任何方法进行一次调用,但后续调用任何方法会导致失败,大约50%的时间会导致应用程序崩溃。
答案 1 :(得分:0)
当嵌入到多页控件中时,问题是ActiveX Web浏览器控件的错误。如果在多页面控件的页面之间进行更改,则Web浏览器控件将消失。我认为它可能发生在非本机表单控件的其他控件上。