众所周知,在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
,但是什么也没做。可以实现这种行为吗?
答案 0 :(得分:3)
在撰写此问题时,我找到了解决方案:
问题是字符串数组。由于开销很小,我通常不去Variant
。来自C ++的人将所有内容都声明为变体感觉很脏,但是无论如何,在这种情况下,显然必须这样做,因为传递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)
并将其填充为实际公式,而不是字符串。