众所周知,在VBA中逐个用值填充单元格的效率远低于用值数组大容量填充单元格。出于同样的优化原因,我想用一系列公式来实现这一点。一个非常简单的例子是:
Sub Fill_Using_Arrays()
Dim i As Long
Dim formulae(1 To 10000) As String
For i = 1 To 10000
formulae(i) = "=$A$" & i
Next i
[A2].Resize(10000).Formula = formulae
End Sub
然而,如果我这样做,它将用"=$A$1"等填充10k个单元格,而不实际计算表达式。我也试着在这个范围内运行.Calculate
,但没有效果。有可能实现这种行为吗?
在写这个问题时,我找到了解决方案:
问题出在字符串数组上。由于开销较小,我通常远离Variant
。作为一个来自C++的人,将所有内容都声明为variant感觉非常肮脏,但无论如何,在这种情况下,这显然是必要的,因为传递String
会使其将值粘贴为文本字符串。
这对我来说有点违背直觉,因为将单个字符串(而不是数组(传递给.Formula
属性是可行的。如果有人知道为什么的话,我会非常感谢你提供的信息。
无论如何,工作代码应该是:
Sub Fill_Using_Arrays()
Dim i As Long
Dim formulae(1 To 10000) As Variant ' Only change here
For i = 1 To 10000
formulae(i) = "=$A$" & i
Next i
[A2].Resize(10000).Formula = formulae
End Sub
编辑:要明确的是,作为后续行动,我很好奇为什么这样做:
[A2].Formula = formulae(1)
并将其填充为实际公式,而不是字符串。