求实现双击指定单元格并按回车的等效VBA代码
问题描述
单元格A1包含插件的特殊公式,循环在A1中填入不同Symbol的公式后,无法通过VBA的.Calculate方法触发公式更新,必须手动双击单元格并按回车才能提取对应Symbol的信息,需要实现该操作的自动化。
解决方案
这类插件公式通常依赖单元格进入编辑模式并确认的操作触发计算,而非普通的工作表计算。以下是两种可靠的替代方案:
方法1:模拟编辑模式(SendKeys)
通过模拟按下F2进入编辑模式、ENTER确认的操作,触发插件公式更新:
Sub TriggerPluginFormula() Dim targetCell As Range Set targetCell = ThisWorkbook.Worksheets("InstrTIC").Range("A1") targetCell.Activate Application.SendKeys "{F2}", True ' 进入编辑模式 Application.SendKeys "{ENTER}", True ' 确认更新 End Sub
方法2:重新写入公式(更稳定)
通过重新赋值单元格公式,强制插件识别并执行计算,避免SendKeys的焦点不稳定问题:
Sub RefreshPluginFormula() Dim targetCell As Range Dim origFormula As String Set targetCell = ThisWorkbook.Worksheets("InstrTIC").Range("A1") origFormula = targetCell.Formula ' 保存原公式模板 ' 重新写入公式触发插件更新 targetCell.Formula = origFormula ThisWorkbook.Worksheets("InstrTIC").Calculate End Sub
修改后的完整代码
将上述方案整合到原代码中,替换失效的.Calculate语句:
Sub getTIC() Application.ScreenUpdating = False Dim i As Integer Dim j As Integer Dim p As Integer Dim Row_max As Integer Dim Row_maxTIC As Integer Dim CreationDate_Col As Integer Dim TIC_Col As Integer Dim Symbol As String Dim CreationDate As String Dim TIC As String Dim origFormula As String Dim instrSheet As Worksheet Set instrSheet = ThisWorkbook.Worksheets("InstrTIC") origFormula = instrSheet.Range("A1").Formula ' 提前保存A1的公式模板 With Worksheets("General") Row_max = .Range("B63655").End(xlUp).Row For i = 3 To Row_max ' 循环读取Symbol .Range("C1") = .Range("B" & i) Symbol = .Range("C1").Value ' 刷新插件公式(替换原Calculate语句) ' 假设原公式用[Symbol]作为占位符,替换为当前Symbol instrSheet.Range("A1").Formula = Replace(origFormula, "[Symbol]", Symbol) ' 触发插件更新 instrSheet.Range("A1").Activate Application.SendKeys "{F2}", True Application.SendKeys "{ENTER}", True ' 定位tradableInfoID列 p = 1 Do Until instrSheet.Cells(1, p) = "tradableInfoID" p = p + 1 Loop TIC_Col = p ' 定位creationDate列 p = 1 Do Until instrSheet.Cells(1, p) = "creationDate" p = p + 1 Loop CreationDate_Col = p ' 筛选当日TIC到General表 Row_maxTIC = instrSheet.Range("A63655").End(xlUp).Row For j = 2 To Row_maxTIC CreationDate = instrSheet.Cells(j, CreationDate_Col).Value TIC = instrSheet.Cells(j, TIC_Col).Value ' 匹配当日日期(根据实际日期格式调整Left(CreationDate,5)的截取长度) If CDate(Val(Left(CreationDate, 5))) = Date Then .Range("A" & i) = TIC End If Next j Next i End With Application.ScreenUpdating = True End Sub
注意事项
- 若公式通过
C1的Symbol动态生成,需确保Replace方法中的占位符与实际公式变量一致,或直接拼接公式字符串。 SendKeys可能受系统焦点影响,优先选择方法2重新写入公式保证稳定性。- 原代码的日期截取逻辑
Left(CreationDate,5)请根据实际日期格式调整,避免转换错误。
内容的提问来源于stack exchange,提问作者qiao
相关产品推荐
相关产品推荐

