将字符串数组传递给Excel VBA中的Range().Formula



众所周知,在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)

并将其填充为实际公式,而不是字符串。

最新更新