You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium在VBA用户窗体中嵌入网页?

解决VBA用户窗体嵌入Edge浏览器的可行方案

方案一:使用Microsoft Edge WebView2控件(官方推荐)

这是微软针对IE WebBrowser控件弃用推出的原生替代方案,支持Edge Chromium内核,可直接嵌入VBA用户窗体,稳定性更强。

步骤1:安装WebView2 Runtime

前往微软官网下载对应版本的WebView2 Runtime并完成安装,这是控件运行的必要环境。

步骤2:在用户窗体中添加WebView2控件

  1. 打开VBA编辑器,进入目标用户窗体的设计模式
  2. 右键点击工具箱 → 选择「附加控件」
  3. 在弹出的列表中找到Microsoft Edge WebView2 Control,勾选后确认,控件会添加到工具箱
  4. 将WebView2控件拖到用户窗体上,调整至合适大小,可在属性窗口重命名为wvEdge

步骤3:编写窗体初始化代码

Private Sub UserForm_Initialize()
    ' 绑定控件初始化完成事件,确保加载网页前控件准备就绪
    wvEdge.CoreWebView2InitializationCompleted = AddressOf WebView2_InitCompleted
End Sub

Private Sub WebView2_InitCompleted(sender As Object, args As CoreWebView2InitializationCompletedEventArgs)
    If args.IsSuccess Then
        ' 加载目标网页
        wvEdge.CoreWebView2.Navigate "https://google.com"
    Else
        MsgBox "WebView2初始化失败: " & args.InitializationException.Message
    End If
End Sub

调用宏保持不变

原工作表命令按钮的调用代码无需修改:

Sub ShowBrowser()
    WebBrowser.Show vbModeless
End Sub

方案二:通过Selenium+Windows API嵌入独立Edge窗口

若已依赖Selenium Basic环境,可通过Windows API将独立启动的Edge窗口嵌入用户窗体,步骤如下:

步骤1:添加Windows API声明

在窗体模块顶部添加32/64位兼容的API声明:

#If VBA7 Then
    Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Declare PtrSafe Function SetParent Lib "user32.dll" (ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr
    Declare PtrSafe Function MoveWindow Lib "user32.dll" (ByVal hWnd As LongPtr, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Boolean) As Boolean
#Else
    Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Declare Function MoveWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Boolean) As Boolean
#End If

步骤2:修改窗体代码

Private selenium_Obj As Selenium.EdgeDriver
Private edgeHwnd As Variant

Private Sub UserForm_Initialize()
    ' 初始化Selenium EdgeDriver,启动可见窗口
    Set selenium_Obj = New Selenium.EdgeDriver
    selenium_Obj.AddArgument "--headless=False"
    selenium_Obj.Start "edge"
    selenium_Obj.Get "https://google.com"
    
    ' 获取Edge窗口句柄(通过窗口标题匹配,可根据实际网页调整)
    edgeHwnd = FindWindow(vbNullString, "Google - Microsoft Edge")
    
    ' 将Edge窗口嵌入用户窗体的Frame容器(需先在窗体添加名为frameBrowser的Frame控件)
    If edgeHwnd <> 0 Then
        SetParent edgeHwnd, Me.hWnd
        MoveWindow edgeHwnd, frameBrowser.Left, frameBrowser.Top, frameBrowser.Width, frameBrowser.Height, True
    Else
        MsgBox "未找到Edge窗口句柄"
    End If
End Sub

Private Sub UserForm_Terminate()
    ' 释放Selenium资源
    If Not selenium_Obj Is Nothing Then
        selenium_Obj.Quit
        Set selenium_Obj = Nothing
    End If
End Sub

注意事项

  • 若窗口标题匹配失败,可使用Spy++工具获取Edge窗口的类名(通常为Chrome_WidgetWin_1),替换FindWindow的第一个参数
  • 需确保Selenium Basic版本与本地Edge浏览器版本匹配,webdriver.exe需放置在系统路径或VBA项目路径下

内容的提问来源于stack exchange,提问作者dlowrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:23