将VBA数组分配给excel范围的公式时的奇怪行为

时间:2013-10-08 03:57:48

标签: arrays performance excel vba excel-vba

这很奇怪......有人知道或知道为什么会发生这种情况?

过去,我能够将一组公式分配给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

包含以上所有代码输出的图片:

Example of result wrong (left) and correct (right)


注意:单元格格式正确,不是文本!

3 个答案:

答案 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