天天看点

Web Browser控件与网页互动 - EXCEL VBA(21)

作者:银河统计工作室

WebBrowser控件是Internet Explorer的主窗口,它是作为一个ActiveX控件来包装的。用户可以使用WebBrowser控件打开任何IE能够显示的Web页面,并提取页面数据。如有自己的网站,可运用WebBrowser控件实现EXCEL文档和服务器间数据交换

WebBrowser控件是作为一个ActiveX控件来包装的,通常运用在VBA标准控件可满足大多数应用程序的需求,为了进一步扩展VBA功能,可在应用程序中使用ActiveX控件。ActiveX控件是为用户进行程序设计所定制的可重用对象,可以极大地扩展VBA的使用范围。

1、添加WebBrowser控件到工具箱

ActiveX控件是可选控件,它可以被添加到【工具箱】中并在窗体中使用。在默认情况下,【工具箱】将只显示标准控件,向【工具箱】添加WebBrowser控件的步骤如下:

  • 第一步、鼠标右击【工具箱】空白处,弹出下面的菜单如图:
Web Browser控件与网页互动 - EXCEL VBA(21)
  • 第二步、单击【附加控件】菜单,打开【附加控件】对话框如图:
Web Browser控件与网页互动 - EXCEL VBA(21)
  • 第三步、下拉滚动条,在【可用控件】列表中单击所需的ActiveX控件,如Microsoft Web Browser浏览器控件,【工具箱】中显示该控件如图:
Web Browser控件与网页互动 - EXCEL VBA(21)

2、WebBrowser控件常用属性、事件和方法

I、WebBrowser控件常用属性

  • Application:返回WebBrowser控件的自动化对象;
  • MaxLength:设置文字框中能够输入字符的最大数量。默认为0,表示输入字符没有数量限制;
  • MultiLine:设置文字框能否接受和显示多行文本。属性值为True显示多行文本,False只容纳单行文本;
  • PasswordChar:导航发生前激发,刷新时不激发;
  • ScrollBars:设置文字框是否有垂直或水平滚动条;
  • Text:设置或返回文字框中内容,与Value属性相同。

II、WebBrowser控件常用事件

  • DocumentComplete:当整个文档完成时激发,刷新页面不激发;
  • DownloadBegin:当某项下载操作已经开始后激发,刷新也可激发此事件;
  • DownloadComplete:当某项下载操作已经完成后激发,刷新也可激发此事件;
  • BeforeNavigate2:导航发生前激发,刷新时不激发;
  • NavigateComplete2:导航完成后激发,刷新时不激发。

III、WebBrowser控件常用方法

  • GoBack:相当于IE的【后退】按钮,使你在当前历史列表中后退一项;
  • GoForward:相当于IE的【前进】按钮,使你在当前历史列表中前进一项;
  • GoHome:相当于IE的“ 主页 ”按钮,连接用户默认的主页;
  • Navigate:连接到指定的URL;
  • Refresh:刷新当前页面。

3、WebBrowser控件动态建立网页

如前所述,工具箱中添加WebBrowser控件后,将其拖入窗体并设置适当尺寸,如图:

Web Browser控件与网页互动 - EXCEL VBA(21)

在窗体Initialize事件编写代码如下:

Private Sub UserForm_Initialize()
WebBrowser1.Navigate ("about:blank")
WebBrowser1.Document.Clear
WebBrowser1.Document.Open
WebBrowser1.Document.write ("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>")
WebBrowser1.Document.write ("<html>")
WebBrowser1.Document.write ("<head>")
WebBrowser1.Document.write ("<title>WebBrowser控件建立动态网页</title>")
WebBrowser1.Document.write ("<meta charset='utf-8'/>")
WebBrowser1.Document.write ("<style>")
WebBrowser1.Document.write ("</style>")
WebBrowser1.Document.write ("<script type='text/javascript'>")
WebBrowser1.Document.write ("</script>")
WebBrowser1.Document.write ("</head>")
WebBrowser1.Document.write ("<body scroll='no' bgcolor='#E3F3F9' style='border:none;'>")
WebBrowser1.Document.write ("<form name='myFc'>")
WebBrowser1.Document.write ("<table>")
WebBrowser1.Document.write ("<tr><th colspan=2 style='text-align:left; font-size:10pt; color:#a51020;'>1、文本框</th></tr>")
WebBrowser1.Document.write ("<tr><td>  姓名:</td><td>")
WebBrowser1.Document.write ("<input id='myName' style='width:100px; color:#ff0000;' value='张三'/></td></tr>")
WebBrowser1.Document.write ("<tr><th colspan=2 style='text-align:left; font-size:10pt; color:#e51020;'>2、单选按钮</th></tr>")
WebBrowser1.Document.write ("<tr><td>  性别:</td><td>")
WebBrowser1.Document.write ("<input type='radio' name='myGender' value='1' checked/>男 ")
WebBrowser1.Document.write ("<input type='radio' name='myGender' value='0'/>女</td></tr>")
WebBrowser1.Document.write ("<tr><td>  简介:</td><td>")
WebBrowser1.Document.write ("<textarea id='myIntroduction' style='width:360px; height:160px; color:#555555;'>")
WebBrowser1.Document.write ("WebBrowser控件是Internet Explorer的主窗口,它是作为一个ActiveX控件来包装的。")
WebBrowser1.Document.write ("用户可以使用WebBrowser控件打开任何IE能够显示的Web页面,")
WebBrowser1.Document.write ("并提取页面数据?如有自己的网站,可运用WebBrowser控件实现EXCEL文档和服务器间数据交换")
WebBrowser1.Document.write ("</textarea></td></tr>")
WebBrowser1.Document.write ("</table>")
WebBrowser1.Document.write ("</form>")
WebBrowser1.Document.write ("</body>")
WebBrowser1.Document.write ("</html>")
WebBrowser1.Document.Close
End Sub           

注:窗体中添加WebBrowser控件,在窗体初始化事件Initialize中编写代码,主要通过WebBrowser控件write方法将HTML文档写入空白文档

窗体运行效果如图:

Web Browser控件与网页互动 - EXCEL VBA(21)

4、WebBrowser控件获取网页信息

WebBrowser控件和网页交互使用需要一定程度的网页编程技术,网页基本框架由超文本标记语言(Hyper Text Markup Language,HTML)搭建,网页外观由层叠样式表(Cascading Style Sheets,CSS)和一些HTML标签属性来修饰完成,网页动态效果通常使用JavaScript脚本语言来实现。HTML、CSS和JavaScript(JS)技术构成客户端(前端)网页编程三大基础,运用WebBrowser控件和网页交换需要掌握HTML、CSS和JS基本知识。

如果有自己的网站,具备服务器端(后端)编程技能,还可以通过WebBrowser控件专门制作和EXCEL对接的网页,从而将强的的网页功能导入EXCEL中。

运用WebBrowser控件和网页交换需要了解网页文档结构和内容,如网页excelVBA.html文档如下:

【HTML文档(http://www.galaxystatistics.com/excel/excelVBA.html)】

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Excel Train
<meta charset="utf-8"/>
<style></style>
 <script type="text/javascript">
function oSum(x,y) {return x+y;}
//无参数调用  
function alertNull(){alert("WebBrowser call!");  }
//有参数调用  
function callWithPar(name, address) {  
alert("Name is " + name + "; address is " + address);  
}  
</script>
</head>
<body scroll="yes" bgcolor="#E3F3F9" style="border:none">
<form name="myFc">
<table>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#a51020;">1、文本框</th></tr>
<tr><td>  姓名:</td>
<td><input id="myName" style="width:100px; color:#ff0000;" value="张三"/></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">2、单选按钮</th></tr>
<tr><td>  性别:</td><td>
<input type="radio" name="myGender" value="1" checked/>男 
<input type="radio" name="myGender" value="0"/>女</td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">3、复选框</th></tr>
<tr><td>  爱好:</td><td>
<input type="checkbox" name="myLike" value="1"/>篮球 
<input type="checkbox" name="myLike" value="2"/>游泳 
<input type="checkbox" name="myLike" value="3"/>跑步</td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">4、下拉列表</th></tr>
<tr><td>  专业:</td><td><select id="myMajor">
    <option value="1">数学</option>
    <option value="2">统计学</option>
    <ption value="3">寿险精算</option>
    <option value="4">R语言</option>
</select></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">5、多行文本</th></tr>
<tr><td>  简介:</td><td>
<textarea id="myIntroduction" style="width:300px; height:100px; color:#555555;">
WebBrowser控件是Internet Explorer的主窗口,它是作为一个ActiveX控件来包装的。
用户可以使用WebBrowser控件打开任何IE能够显示的Web页面,并提取页面数据。
如有自己的网站,可运用WebBrowser控件实现EXCEL文档和服务器间数据交换
</textarea></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">6、DIV区块</th></tr>
<tr><td>  效果:</td><td>
<div id="myEffect" style="width:300px; height:50px; border:#aaaaaa 1px solid; dsiplay:inline;">
<b style="text-align:center; width:100%; padding-top:15px;">这是黑体效果</b>
</div></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">7、图片</th></tr>
<tr><td>  头像:</td><td>
<img src="http://studio.galaxystatistics.com/shiny/rSHIndex/pic/vba1.jpg" id="myImg" style="width:200px; height:260px; color:#ff0000;"/>
</td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">8、内崁iFrame框架</th></tr>
<tr><td>  框架:</td>
<td><iframe src="http://www.galaxystatistics.com/excel/excelVBA1.html" id="myIframe" style="width:380px; height:260px; color:#ff0000;"/></td></tr>
</table>
</form>
</body>
</html>           

网页excelVBA.html涉及HTML文档的常用标签,通过WebBrowser控件和指定网页互动包括获取或设置网页标签的值(文本)或属性值,调用网页JS函数等"。

通常在EXCEL VBA中通过WebBrowser控件打开网页时,窗体中的WebBrowser控件显示网页时会有立体边框出现。为了去除这一边框,可在网页复制开始第1行定义文档类型代码,同时复制在25行的BODY标签属性style="border:none"。

根据网页excelVBA.html内容,在窗体【获取网页信息】命令按钮的Click事件中输入如下代码:

Private Sub CommandButton1_Click()
Dim doc As Object
Dim id As Integer
'打开指定网页
WebBrowser1.Navigate "http://www.galaxystatistics.com/excel/excelVBA.html"
Set doc = WebBrowser1.Document
MsgBox "文本框信息:" & doc.getElementById("myName").Value
MsgBox "单选按钮数量:" & doc.getElementById("myFc").myGender.Length
MsgBox "单选按钮选项value属性:" & doc.getElementById("myFc").myGender(0).Value
MsgBox "单选按钮选项checked属性:" & doc.getElementById("myFc").myGender(0).Checked
MsgBox "复选框数量:" & doc.getElementById("myFc").myLike.Length
MsgBox "复选框选项value属性:" & doc.getElementById("myFc").myLike(0).Value
MsgBox "复选框选项checked属性:" & doc.getElementById("myFc").myLike(0).Checked
MsgBox "下拉列表数量:" & doc.getElementById("myMajor").Options.Length
MsgBox "下拉列表索引:" & doc.getElementById("myMajor").selectedIndex
id = doc.getElementById("myMajor").selectedIndex
MsgBox "下拉列表选中文本:" & doc.getElementById("myMajor").Options(id).Text
MsgBox "下拉列表选中值:" & doc.getElementById("myMajor").Options(id).Value
MsgBox "多行文本内容:" & doc.getElementById("myIntroduction").Value
MsgBox "DIV区块文本:" & doc.getElementById("myEffect").innerText
MsgBox "DIV区块HTML:" & doc.getElementById("myEffect").innerHTML
MsgBox "图片路径:" & doc.getElementById("myImg").getAttribute("SRC")
MsgBox "图片宽度:" & doc.getElementById("myImg").Style.Width
Dim doc1 As Object
Set doc1 = WebBrowser1.Document.getElementById("myIframe").Document    '设置框架文档对象
MsgBox "框架文本框信息:" & doc1.getElementById("myName").Value
End Sub           

注:代码中设置网页文本对象为doc,对于网页标签内容的提取基本按DOM文档结构解析。

运行窗体,点击【获取网页信息】命令按钮,结果如下图:

Web Browser控件与网页互动 - EXCEL VBA(21)

在VBA环境中通过WebBrowser控件提取网页信息,通常将代码编写在WebBrowser控件的DocumentComplete事件中,即当整个文档完成时触发该事件,这时网页文档加载完毕,可保证提取到完整信息。样例代码如下:

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Application.StatusBar = "网页文档下载完毕!"      '在状态栏中输入提示信息
Dim doc As Object
Set doc = WebBrowser1.Document
End Sub           

注:DocumentComplete确保WebBrowser下载完成网页文档后,通过文档Document对象可提取网页标签信息

6、WebBrowser控件调用网页JS函数

根据网页excelVBA.html内容,在窗体【调用网页JS函数】命令按钮的Click事件中输入如下代码:

Private Sub CommandButton2_Click()
'调用网页中无参JavaScript函数alertNull
WebBrowser1.Document.parentwindow.execScript "alertNull()", "JavaScript"
'调用网页中有参JavaScript函数callWithPar
WebBrowser1.Document.parentwindow.execScript "callWithPar('银河统计工作室','哈尔滨')", "JavaScript"
MsgBox WebBrowser1.Document.Script.oSum(25, 75)    '调用JS函数返回值
End Sub           

注:代码中调用的JS函数在网页文本script标签之间。注意,打开对应网页后再运行【调用网页JS函数】命令按钮

运行窗体,点击【调用网页JS函数】命令按钮,结果如下图:

Web Browser控件与网页互动 - EXCEL VBA(21)

本文我们创建了一个InternetExplorer对象并设置了一些属性。然后,使用.navigate方法打开网页,并使用.document.parentWindow.execScript方法执行了一个简单的JavaScript代码。

请注意,使用InternetExplorer对象加载和执行JavaScript代码需要将"Microsoft Internet Controls"引用添加到你的VBA项目中。你可以在VBA编辑器的"工具"菜单中的"引用"对话框中勾选该引用。

在VBA中,除了InternetExplorer对象,还可以使用其他浏览器对象来加载和操作Web页面中的JavaScript代码。

  • Chrome浏览器对象:可以使用Chrome浏览器的COM接口(Chrome COM Interface)来在VBA中加载和操作Chrome浏览器中的JavaScript代码。这需要先安装Chrome浏览器COM接口,然后通过创建Chrome浏览器对象来实现。示例代码:
Sub RunJavaScriptInChrome()
    Dim Chrome As Object
    ' 创建 Chrome 浏览器对象
    Set Chrome = CreateObject("ChromeTab.ChromeBrowser")
    ' 打开指定网址
    Chrome.navigate "http://www.example.com"
    ' 等待加载完毕
    Do While Chrome.Busy Or Chrome.readyState <> 4
        DoEvents
    Loop
    ' 执行 JavaScript 代码
    Chrome.ExecuteScript "alert('Hello, JavaScript in Chrome!');"
    ' 关闭 Chrome 浏览器对象
    Chrome.Quit
    ' 释放对象引用
    Set Chrome = Nothing
End Sub           

Firefox浏览器对象:类似地,也可以使用Firefox浏览器的COM接口来在VBA中加载和操作Firefox浏览器中的JavaScript代码。这同样需要先安装Firefox浏览器COM接口,并通过创建Firefox浏览器对象来实现。以下是一个示例代码:

Sub RunJavaScriptInFirefox()
    Dim Firefox As Object
    ' 创建 Firefox 浏览器对象
    Set Firefox = CreateObject("Mozilla.Browser")
    ' 打开指定网址
    Firefox.navigate "http://www.example.com"
    ' 等待加载完毕
    Do While Firefox.Busy Or Firefox.readyState <> 4
        DoEvents
    Loop
    ' 执行 JavaScript 代码
    Firefox.ExecuteScript "alert('Hello, JavaScript in Firefox!');"
    ' 关闭 Firefox 浏览器对象
    Firefox.Quit
    ' 释放对象引用
    Set Firefox = Nothing
End Sub           

使用WebBrowser控件按网址打开服务器端网页后,即建立起EXCEL和网页HTML文档的数据交换通道,实现在VBA中操控网页、自动抓取信息等功能。

继续阅读