Excel VSTO(VB.Net)中VSTACK公式无法自动计算的问题
问题:VSTO中写入VSTACK动态公式后无法自动计算
我用VB.Net开发Excel VSTO工作簿,代码已正确将包含VSTACK函数的动态公式写入单元格,但公式不会自动计算,必须双击单元格回车或在编辑栏回车才生效。同样的公式在VBA工作簿中可正常自动计算。
相关代码
Dim i As Integer Dim chkName As String Dim chkState As String Dim StackList As String = "Empty" Dim chkTbl As String Dim checkboxarray As String(,) i = Controls.OfType(Of CheckBox).Count ReDim checkboxarray(i, 1) i = 0 For Each chk In Me.Controls If TypeOf chk Is CheckBox Then chkName = chk.Name chkState = chk.Checked If chkName IsNot "Clear" And chkName IsNot "QCopy" And chkName IsNot "Project" And chkName IsNot "OrderbyCat" Then checkboxarray(i, 0) = chkName checkboxarray(i, 1) = chkState.ToUpper i += 1 If chkState = "True" Then chkTbl = "Tbl" & chkName If StackList = "Empty" Then StackList = chkTbl Else StackList = StackList & ", " & chkTbl End If End If End If End If Next Dim DestinationRange As Excel.Range DestinationRange = Globals.wsAdmin.Range("NamePaste").Resize(i, 2) DestinationRange.Value = checkboxarray Dim Rng As Excel.Range = Globals.wsAdmin.Range("CombinedRngPaste") Rng.Formula = {"=VSTACK(" & StackList & ")"}
已尝试的操作
- 确认单元格格式为常规
- 确认Excel计算模式设为自动
- 用
{}包裹公式避免Excel添加@符号,但无法关闭扩展区域格式功能 - 尝试使用
FormulaArray,公式能计算,但结果区域下方单元格会填充#N/A
解决方案
方法1:强制触发单元格重算
写完公式后,手动调用单元格的Calculate方法,强制Excel计算该单元格:
Dim Rng As Excel.Range = Globals.wsAdmin.Range("CombinedRngPaste") Rng.Formula = "=VSTACK(" & StackList & ")" ' 强制计算目标单元格 Rng.Calculate()
方法2:使用Formula2替代Formula(推荐)
Excel 365/2021及以后版本支持动态数组,Formula2是专门为动态数组设计的属性,原生支持动态公式,不会自动添加@符号,且能自动触发计算:
Dim Rng As Excel.Range = Globals.wsAdmin.Range("CombinedRngPaste") Rng.Formula2 = "=VSTACK(" & StackList & ")"
这个方法不需要手动用{}包裹公式,是处理动态数组公式的标准方式。
方法3:解决FormulaArray的#N/A问题
如果必须使用FormulaArray,可以先清空目标区域下方的单元格,避免多余的#N/A填充:
Dim Rng As Excel.Range = Globals.wsAdmin.Range("CombinedRngPaste") ' 清空下方1000行的内容(可根据实际调整行数) Rng.Offset(1).Resize(1000, Rng.Columns.Count).ClearContents() Rng.FormulaArray = "=VSTACK(" & StackList & ")"
内容的提问来源于stack exchange,提问作者jfr
相关产品推荐
相关产品推荐

