Excel VBA 创建嵌入式 WebBrowser 并使用它
Posted
技术标签:
【中文标题】Excel VBA 创建嵌入式 WebBrowser 并使用它【英文标题】:Excel VBA create an embedded WebBrowser and use it 【发布时间】:2013-11-05 04:56:36 【问题描述】:您好,我正在尝试在电子表格中动态创建 Web 浏览器,然后使用它,但 WebBrowser 功能似乎不起作用
这是我创建 WebBrowser 的方法
Set myWebBrowser = Sheets("test").OLEObjects.Add(ClassType:="Shell.Explorer.2", Link:=False, DisplayAsIcon:=False, left:=147, top:=60.75, width:=141, height:=96)
这会起作用
myWebBrowser.top = 10
但这会给我一个错误
myWebBrowser.Navigate ("about:blank")
关于我应该怎么做的任何想法谢谢你
更新:
这也不起作用并给出错误:
myWebBrowser.Object.Document.body.Scroll = "no"
myWebBrowser.Object.Silent = True
myWebBrowser.Object.Navigate ("about:blank")
While myWebBrowser.Object.ReadyState <> READYSTATE_COMPLETE
Application.Wait (Now + TimeValue("0:00:01"))
Wend
myWebBrowser.Object.Refresh
更新 2(几乎就在那里):
现在我需要一种方法来删除 Sheet2.Activate Sheet1.Activate
Sheet2.Activate
Sheet1.Activate
Set wb = myWebBrowser.Object
With wb
.Silent = True
.Navigate "about:blank"
Do While .ReadyState <> READYSTATE_COMPLETE
Application.Wait (Now + TimeValue("0:00:01"))
Loop
.Document.Open "text/html"
Do While .ReadyState <> READYSTATE_COMPLETE
Application.Wait (Now + TimeValue("0:00:01"))
Loop
.Document.write html
.Document.Close
.Document.body.Scroll = "no"
.Refresh
Debug.Print .Document.body.innerHTML
End With
【问题讨论】:
错误是什么?在您在控件中加载一些内容之前,没有“body”元素,因此您无法设置滚动属性... 运行时错误“91”:对象变量或未设置块变量 好的,我最后移动了它,但现在它挂在循环中:-( 【参考方案1】:您需要在 WebBrowser.ReadyState <> READYSTATE_COMPLETE
循环中注入 Windows 消息才能使其正常工作。在循环内调用 DoEvents
/Sleep
可以做到这一点,但有其自身的含义。查看这些答案以获取更多详细信息和示例代码:
https://***.com/a/19019200/1768303
https://***.com/a/19308865/1768303
【讨论】:
您好,谢谢您的回答,但我不认为这是问题所在。我发现,由于某种原因,当创建 Web 浏览器时,它会停留在某种设计模式中。如果我把这个 Sheet2.Activate Sheet1.Activate 放在代码之前,它将起作用。所以知道我正在尝试找到一种方法来退出设计模式,而无需两张纸并在它们之间进行更改。有没有人有线索>就像我在软糖里,我不能喝水:-P @oMG,尝试Workbook.ToggleFormsDesign
方法禁用设计模式。不管怎样,你仍然需要一个消息循环让WebBrowser
加载内容。
再次感谢您,但这没有用。我不想进入设计模式,而是从该模式中获取该对象。【参考方案2】:
myWebBrowser.Object.Navigate "http://www.google.com"
更完整的例子:
Sub AddWebBroswerToWorksheet()
Dim myWebBrowser
Dim wb, doc, x As Long
Sheet2.Activate
Sheet1.OLEObjects(1).Delete
Set myWebBrowser = Sheet1.OLEObjects.Add(ClassType:="Shell.Explorer.2", _
Left:=147, Top:=60.75, Width:=400, Height:=400)
Set wb = myWebBrowser.Object
With wb
.Navigate "about:blank"
.Document.Open "text/html"
For x = 1 To 100
.Document.write "hello world<br>"
Next x
.Document.Close
.Document.body.Scroll = "no"
Debug.Print .Document.body.innerHTML
End With
Sheet1.Activate 'switching back to the sheet seems to
' ' trigger the display of the object
End Sub
【讨论】:
感谢您的回复,但这不起作用我在尝试上述代码时也遇到错误myWebBrowser.Object.Document.body.Scroll = "no" myWebBrowser.Object.Silent = True myWebBrowser.Object.Navigate ("about:blank") While myWebBrowser.Object.ReadyState <> READYSTATE_COMPLETE Application.Wait (Now + TimeValue("0:00:01")) Wend myWebBrowser.Object.Refresh
@oMG - 请不要在 cmets 中添加代码:您可以使用新代码更新您的问题。
感谢您的帮助,但我对上面的代码有很多问题。首先,您至少需要两张工作表并在它们之间进行更改以刷新网络浏览器,即使这可以通过 hack 实现(创建激活的工作表,转到激活网络浏览器的工作表,删除工作表 - 不漂亮:-P)如果里面的html需要下载javascripts之类的代码是不行的,所以需要刷新。以上是关于Excel VBA 创建嵌入式 WebBrowser 并使用它的主要内容,如果未能解决你的问题,请参考以下文章
使用 VBA 将 Excel 中的图表嵌入到 Powerpoint 中的指定占位符中