5

这很奇怪......有人有一些知识或可以弄清楚为什么会发生这种情况?

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

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

结果错误(左)和正确(右)示例


注意:单元格被正确格式化为数字,而不是文本!

4

3 回答 3

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 上尝试它,但它应该可以工作。
希望确实如此。

于 2013-10-08T04:59:58.380 回答
3

有趣的问题。我以前从未使用过此功能。

您的第一个在 2010 年和 2013 年对我来说具有相同的结果 - 包含字符串的列"=1+2"。我FORML_ARRAY从字符串更改为 aVariant并且它按预期工作。为了更好地衡量,我将公式更改为包含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
于 2013-10-08T05:00:12.950 回答
2

只是要添加另一个选项,因为正如您所说,您宁愿正确调暗阵列,这样您就可以,它只会为OVERALL Sub(而不是每个循环)增加 1/250 秒,但可以让您调暗阵列作为一个字符串。

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 将字符串读取为常量,但是如果您运行原始公式并转到评估公式,它会给出单元格包含常量的错误,这似乎只是一个错误,但如果我想出别的东西我也会编辑我的答案。

注意:这个答案并不是作为公认答案的更好答案,它是一个较慢的答案,更像是一种替代方案;回答您想要使数组变暗的请求。

更新:此方法将分割接受的答案和上述方法之间的差异。这只会增加子运行时间的 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
于 2013-10-08T13:39:25.773 回答