WebView2 VBA 示例 - Access 与 Excel 中使用 cWebView2Host
概述
演示如何在 VBA 宿主环境(Microsoft Access 和 Microsoft Excel)中使用 cWebView2Host。cWebView2Host 是 COM 可创建类,天然支持从任何 VBA 宿主调用,无需 VB6 运行时。
项目结构
下载源码 [ 注意:重新到bin目录注册 DLL 文件 ]
代码请到 VBMAN2 项目 demos/webview2/_vbaSamples 目录获取。
_vbaSamples/
├── BaseAccess.mdb # Access 数据库文件(含窗体和 VBA 代码)
└── BaseExcel.xlsm # Excel 启用宏的工作簿(含 UserForm 和 VBA 代码)核心代码解析
1. Access 窗体(BaseAccess.mdb)
在 Access 中创建一个空白窗体,进入 VBA 编辑器,粘贴以下代码:
Option Compare Database
Dim wv As New cWebView2Host
Private Sub Form_Load()
wv.Initialize Me.Hwnd, "https://vb6.pro"
End Sub操作步骤:
- 打开 BaseAccess.mdb
- 创建一个空白窗体,切换到设计视图
- 按 Alt+F11 打开 VBA 编辑器
- 在窗体模块中粘贴上述代码
- 切换到窗体视图运行
2. Excel UserForm(BaseExcel.xlsm)
在 Excel 中创建一个 UserForm,添加一个 Frame 控件(名称 Frame1),进入代码模块粘贴:
Dim wv As New cWebView2Host
Private Sub UserForm_Initialize()
wv.Initialize Me.Frame1, "https://vb6.pro"
End Sub操作步骤:
- 打开 BaseExcel.xlsm
- 按 Alt+F11 打开 VBA 编辑器
- 插入一个 UserForm,添加 Frame 控件(命名为 Frame1)
- 在 UserForm 代码模块中粘贴上述代码
- 运行 UserForm
功能说明
Access 窗体嵌入
- 使用
Me.Hwnd获取 Access 窗口句柄 - cWebView2Host 自动检测到 OForm 类名,切换为 MessageWindowAdapter
- 无需任何额外配置即可工作
- 使用
Excel UserForm 嵌入
- 使用
Me.Frame1传入 Frame 控件对象 - Initialize 接受 VBA 对象,自动获取 hWnd
- WebView2 显示在 Frame 控件区域内
- 使用
VBA 中的简化声明
- 使用
Dim wv As New cWebView2Host自动实例化 - VBA 的
New关键字在首次访问时自动创建对象 - 与 VB6 用法完全一致
- 使用
技术要点
COM 互操作:cWebView2Host 是 COM 可创建类,注册 vbman2_win32.dll 后,任何支持 COM 的宿主都能使用
Access 自动适配:cWebView2Host 检测到 Access 的 OForm 窗口类名后,自动使用 MessageWindowAdapter(消息窗口 + 定时器轮询),避免对 Access 窗口子类化导致的崩溃
Excel UserForm 使用 Frame:UserForm 本身也可以直接传 hWnd(
Me.hWnd),传入 Frame 控件可以让 WebView2 限制在 Frame 区域内,与其他控件共存DLL 注册:使用前必须在目标机器上注册 vbman2_win32.dll:
regsvr32 vbman2_win32.dllAccess 的限制:MessageWindowAdapter 不支持宿主鼠标/键盘事件(HostMouse*、HostKeyDown* 等),但 WebView2 内容区域的事件和 BindUI/BindData 完全可用
应用场景
- Access:在数据库窗体中嵌入网页报表、在线文档、数据可视化图表
- Excel:在电子表格中嵌入实时数据面板、Web 仪表盘、交互式图表
- Word / PowerPoint:同样的 COM 注册方式,可在任何 Office VBA 中使用
扩展建议
- 在 Access 中可以使用 BindUI/BindData 将网页表单与数据库字段关联
- 在 Excel 中可以使用 JsRun 将工作表数据推送至 WebView2 渲染图表
- 使用
EnvironmentOptions.UserDataFolder保存登录状态,避免重复登录 - 如果需要处理事件,改用
Dim WithEvents wv As cWebView2Host+Set wv = New cWebView2Host声明方式