这很奇怪......有人知道或知道为什么会发生这种情况?
过去,我能够将一组公式分配给Excel范围(快速分配示例: Range("A1:A1000") = ArrayOfFormulas
)。与按单元格分配(示例单元格)相比,它工作正常并且快速( 非常 FAST )通过单元格: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
包含以上所有代码输出的图片:
注意:单元格格式正确,不是文本!
答案 0 :(得分:6)
你的第一个代码应该有用 而不是将其声明为字符串,将其声明为变体。
所以改变你的声明:
Dim FORML_ARRAY(1 To 1000, 1 To 1) As String
到此:
Dim FORML_ARRAY(1 To 1000, 1 To 1) As Variant
我无法在Excel 2013上尝试它,但它应该可以工作 希望如此。
答案 1 :(得分:3)
有趣的问题。我以前从未使用过这个功能。
2010年和2013年,您的第一个结果与我的结果相同 - 包含字符串"=1+2"
的列。我将FORML_ARRAY
从字符串更改为Variant
,它按预期工作。为了更好的衡量,我将公式更改为包含i
,并且仍然使用公式填充范围:
Sub AssignFormulas_1()
Dim i As Long
Dim FORML_ARRAY(1 To 1000, 1 To 1) As Variant 'changed to Variant
For i = 1 To 1000
FORML_ARRAY(i, 1) = "=" & i & "+2" 'changed 1 to i - still works
Next i
Range("A1:A1000").Formula = FORML_ARRAY
End Sub
答案 2 :(得分:2)
只是为了添加另一个选项,因为你说你宁愿正确地调暗你的数组,你可以这样做,它只会增加1/255秒 OVERALL Sub (不是每个循环),但允许您将数组调暗为字符串。
Sub AssignFormulas_2()
Dim i As Long
Dim FORML_ARRAY(1 To 1000, 1 To 1) As String
For i = 1 To 1000
FORML_ARRAY(i, 1) = "= " & i & " + 2"
Next i
Range("A1:A1000").Formula = FORML_ARRAY '<- Don't work as formula
' It put the value!
Range("A1:A1000").Value = Range("A1:A1000").Value
End Sub
现在,我不确定为什么excel会将字符串作为常量读取,但是如果运行原始公式并转到Evaluate Formula,它会给出单元格包含常量的错误,这实际上似乎只是一个bug,但如果我想出别的东西,我也会编辑我的答案。
注意: 这个答案不是一个更好的答案,因为接受的答案,它是一个较慢的答案,更多的是另一种选择;回答你想要将数组调暗为字符串的请求。
更新: 此方法将拆分接受的答案与上述方法之间的差异。这只会增加子运行时间的1/500秒。
Sub AssignFormulas_Transpose()
Dim i As Long
Dim FORML_ARRAY(1 To 1000) As String
For i = 1 To 1000
FORML_ARRAY(i) = "= " & i & " + 2"
Next i
Range("A1:A1000").Formula = Application.Transpose(FORML_ARRAY) '<- Don't work as formula
' It put the value!
End Sub