【发布时间】:2013-10-08 03:57:48
【问题描述】:
这很奇怪......有人有一些知识或可以弄清楚为什么会发生这种情况?
过去,我能够将一组公式分配给 Excel 范围(快速分配示例: Range("A1:A1000") = ArrayOfFormulas)。与逐个单元格(示例单元格按单元格:Range("A" & i).Formula=ArrayOfFormula(i) 在循环内。很慢!)。
我现在正在使用 Excel 2013,当尝试将存储在字符串数组中的公式分配给 Excel 范围时,它不起作用(Excel 显示公式,但不显示左侧部分的计算下图)不幸的是我无法检索旧代码进行比较。例如,以下代码在 A1 到 A1000 范围内显示“=1+2”而不是“3”。
Sub AssignFormulas_1()
Dim i as Long
Dim FORML_ARRAY(1 To 1000, 1 To 1) As String
For i = 1 To 1000
FORML_ARRAY(i, 1) = "=1+2"
Next i
Range("A1:A1000").Formula = FORML_ARRAY '<- Don't work as formula
' It put the value!
End Sub
但是,当我不使用公式数组时,它可以正常工作(根据下图右侧,所有单元格显示“3”而不是“=1+2”)。代码如下:
Sub AssignFormulas_2()
Dim i as Long
Dim FORML_SINGLE As String
FORML_SINGLE = "=1+2"
Range("A1:A1000").Formula = FORML_SINGLE '<- works ok, not practical for my
' real life case as I need
' different formula for each cell.
End Sub
下面的代码也可以很好地工作(在这种情况下,我逐个单元格地分配公式,因此更灵活,但对于大型公式来说却很慢)。
Sub AssignFormulas_3()
Dim i as Long
Dim FORML_ARRAY(1 To 1000, 1 To 1) As String
For i = 1 To 1000
FORML_ARRAY(i, 1) = "=1+2"
Range("A1:A" & i).Formula = FORML_ARRAY(i, 1) '<- works ok, but slowly
Next i
End Sub
以上所有代码输出的图片:
注意:单元格的格式正确为数字,而不是文本!
【问题讨论】:
-
没有 2013 年要检查,但我发现 this MSDN document 可能会有所帮助。
-
@Passerby,谢谢,但 FormulaArray() 用于其他用途。它适用于矩阵或 Excel 公式数组,但不适用于 VBA 数组。使用 FormulaArray() 您将在单元格中获得公式
{=Sum(A1:A3)}而不是=Sum(A1:A3)。 -
出于好奇,这什么时候会实用?您花时间用公式填充数组,将公式写入必须计算的范围?!?!为什么不简单地用公式填充一个范围?或者在数组中进行计算并用计算填充范围?你有什么理由为你的方法,而不是说它错了只是试图理解为什么。似乎在您填充数组的时间里您可以执行计算(比让公式计算更快),或者您可以完全跳过数组并直接添加公式。
-
@user2140261,谢谢。是的,我确实将其用于现实生活中的建议:用户体验,在不允许 VBA 时绕过某些安全限制,或用于审计帮助。 首先,关于你的观点是有值而不是公式,我通常更喜欢公式来查看结果的含义。如果您审核一个名为“没有商业成本的平均净利润率”的列,您更喜欢什么:只有结果值还是公式? (不会轻易看出“财盘”是不是“商业成本”的一部分,什么是“净值”,用什么来加权平均等等?)。
-
第二,有时我只是使用“SUM”公式对特定单元格进行多个非常复杂的 vlookup 或嵌套 sumif(或者有时是不可能的 vlookup)(之前使用 VBA 搜索过)。如果您想要更改几个参数(但当然不是用于使用 VBA 搜索单元格的标准)进行敏感性分析,这会加快以后的计算。想象一下具有复杂 sumif 的 20.000 个单元格,仅从其他 20.000 个单元格中挑选 1 到 10 个单元格。好吧,也许不是做这个的软件,但是没有时间和预算来评估其他软件一次,一周后就忘记了。
标签: arrays performance vba excel