在同一多页控件中的另一页的多页控件中,在一页上获取控件

时间:2014-07-22 21:50:41

标签: vba multipage

我在Excel 2007中使用VBA。 在excel userform上有四个控件:

  1. 单一多页控件
  2. 多页面控件第1页的有效x webbrowser控件
  3. 多页面控件第2页上的文本框控件
  4. 用户表单上的列表框控件
  5. 我正在尝试使用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
    

2 个答案:

答案 0 :(得分:0)

在这里走出困境但我在使用IE /浏览器自动化时经常看到这种91型错误。通常伴随着"如果我手动单步操作,我的代码就可以工作!"

常见问题是您未允许网络浏览器完成加载,如果仍在加载,则.DocumentNothing,这将产生91错误

通常有效的解决方案是准备好的等待循环。假设它的实际名称为WebBrowser1,其余代码看起来还不错。

如何为浏览器控制创建一个准备等待循环

基本上你需要将线程放在一个循环中,直到浏览器加载了页面。在伪代码中,您正在执行:

Do Until Browser Is Loaded
   DoEvents 'etc.
Loop

使用WinAPI睡眠功能

您需要使用WinAPI Sleep功能(很多人使用DoEventsApplication.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浏览器控件将消失。我认为它可能发生在非本机表单控件的其他控件上。