VBA中SeleniumBasic跨模块调用ChromeDriver出现对象未定义报错求助
解决VBA SeleniumBasic跨模块调用ChromeDriver的"对象变量未设置"错误
问题根源
你在Module1中声明的ChromoLink使用了Private修饰符,这个变量仅能在Module1内部访问,Module2无法直接引用该对象,因此调用时会触发"对象变量或With块变量未设置"的错误。
解决方案
方案1:将驱动变量改为全局可访问
修改Module1中的变量声明,把Private替换为Public,让所有模块都能访问这个ChromeDriver实例:
' Module1中修改声明 Public ChromoLink As New Selenium.ChromeDriver Sub Login() ' LOGIN With ChromoLink .Start "Chrome" .Window.Maximize ' 简化With块内的调用 .get "https://......" While .ExecuteScript("return document.readyState") <> "complete" .Wait 5000 ' 去掉不必要的括号 Wend .FindElementById("i0116").SendKeys User .FindElementById("i0118").SendKeys Password .FindElementByXPath("//*[@id=""idSIButton9""]").Click End With End Sub
之后Module2的代码可以正常调用ChromoLink:
' Module2代码 Sub OpenNewTab() ChromoLink.ExecuteScript "window.open(arguments[0])", "https://..." ChromoLink.SwitchToNextWindow While ChromoLink.ExecuteScript("return document.readyState") <> "complete" ChromoLink.Wait 5000 Wend End Sub
方案2:通过函数返回驱动对象(更安全,避免全局变量)
如果不想使用全局变量,可以修改Module1的Login过程为函数,返回已初始化并登录的ChromeDriver对象:
' Module1中的代码 Function GetLoggedInDriver() As Selenium.ChromeDriver Dim driver As New Selenium.ChromeDriver With driver .Start "Chrome" .Window.Maximize .get "https://......" While .ExecuteScript("return document.readyState") <> "complete" .Wait 5000 Wend .FindElementById("i0116").SendKeys User .FindElementById("i0118").SendKeys Password .FindElementByXPath("//*[@id=""idSIButton9""]").Click End With Set GetLoggedInDriver = driver End Function
然后在Module2中先获取驱动对象再操作:
' Module2中的代码 Sub OpenNewTab() Dim driver As Selenium.ChromeDriver ' 先获取已登录的驱动实例 Set driver = GetLoggedInDriver driver.ExecuteScript "window.open(arguments[0])", "https://..." driver.SwitchToNextWindow While driver.ExecuteScript("return document.readyState") <> "complete" driver.Wait 5000 Wend End Sub
注意事项
- 无论使用哪种方案,都要确保在执行Module2的代码前,已经完成Login流程(即驱动对象已被正确初始化)。
- With块内的调用可以直接用
.代替变量名,让代码更简洁。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

