如何阻止工作簿打开时UDF自动重新计算?
解决UDF仅在F9刷新时运行而非工作簿加载时执行的问题
问题核心
尽管你已设置Application.Volatile(False),但Excel自动计算模式下,工作簿打开时仍会触发所有公式(包括非易失性UDF)的计算。要实现仅按F9时才执行爬虫UDF,需结合工作簿事件与UDF条件判断来限制计算时机。
方案一:通过计算模式控制UDF执行
1. 配置工作簿事件(限制计算模式)
打开VBA编辑器(Alt+F11),双击左侧的ThisWorkbook对象,添加以下代码:
Private Sub Workbook_Open() ' 工作簿打开时切换为手动计算 Application.Calculation = xlCalculationManual End Sub Private Sub Workbook_Activate() ' 工作簿激活时保持手动计算 Application.Calculation = xlCalculationManual End Sub Private Sub Workbook_Deactivate() ' 切换到其他工作簿时恢复自动计算(可选,避免影响其他文件) Application.Calculation = xlCalculationAutomatic End Sub
2. 修改UDF,仅在手动计算时执行爬虫逻辑
给你的UDF添加计算模式判断,同时补充错误处理与资源清理:
Function GetLSEPrice(ticker As String) As Double Application.Volatile (False) ' 仅当处于手动计算模式时执行爬虫 If Application.Calculation <> xlCalculationManual Then GetLSEPrice = CVErr(xlErrNA) ' 返回#N/A,避免加载时执行 Exit Function End If Dim driver As New ChromeDriver Dim url As String Dim y As Selenium.WebElement ' 错误捕获,防止爬虫失败导致Excel卡顿 On Error GoTo Cleanup url = "https://www.londonstockexchange.com/stock/" & ticker & "/united-kingdom/company-page" driver.AddArgument "--headless" driver.Get url Set y = driver.FindElementByClass("price-tag") GetLSEPrice = CDbl(y.Text) Cleanup: ' 强制关闭浏览器驱动,释放资源 If Not driver Is Nothing Then driver.Quit Set driver = Nothing End If End Function
方案二:用辅助单元格做开关控制
若不想修改全局计算模式,可设置一个开关单元格(如Sheet1!Z1),仅当该单元格值为RUN时,UDF才执行爬虫:
修改后的UDF代码
Function GetLSEPrice(ticker As String) As Double Application.Volatile (False) ' 检查开关状态 If ThisWorkbook.Sheets("Sheet1").Range("Z1").Value <> "RUN" Then GetLSEPrice = CVErr(xlErrNA) Exit Function End If Dim driver As New ChromeDriver Dim url As String Dim y As Selenium.WebElement On Error GoTo Cleanup url = "https://www.londonstockexchange.com/stock/" & ticker & "/united-kingdom/company-page" driver.AddArgument "--headless" driver.Get url Set y = driver.FindElementByClass("price-tag") GetLSEPrice = CDbl(y.Text) ' 计算完成后重置开关 ThisWorkbook.Sheets("Sheet1").Range("Z1").Value = "READY" Cleanup: If Not driver Is Nothing Then driver.Quit Set driver = Nothing End If End Function
你可添加一个表单按钮,点击时设置Z1为RUN并触发Application.Calculate,替代手动按F9的操作。
内容的提问来源于stack exchange,提问作者Blitzer
相关产品推荐
相关产品推荐

