奇怪的行为时分配一个Excel范围的公式的VBA数组

这是奇怪的…有人有一些知识或可以找出为什么发生这种情况?

在过去,我能够给Excel范围分配一组公式数组( 范例 Range("A1:A1000") = ArrayOfFormulas )。 这是工作正常和快速非常 )相比,分配逐个单元格( 例如单元格: Range("A" & i).Formula=ArrayOfFormula(i)在一个循环内,慢! )。

现在我正在使用Excel 2013,当试图将存储在string数组中的公式存储到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 

以上代码输出的图片:

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


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

你的第一个代码应该工作。
将其声明为string,而不是将其声明为变体。

所以改变你的声明:

 Dim FORML_ARRAY(1 To 1000, 1 To 1) As String 

对此:

 Dim FORML_ARRAY(1 To 1000, 1 To 1) As Variant 

我无法在Excel 2013上尝试,但它应该工作。
希望它。

有趣的问题。 我从来没有使用过这个function。

在2010年和2013年,你的第一个结果对我来说都是一样的 – 一个包含string"=1+2" 。 我将FORML_ARRAY从一个string更改为一个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 

只是添加另一个选项,因为你说你宁愿暗淡你的arrays正确的,这个你可以,它只增加了1/2秒的OVERALL小组( 不是每个循环),但将允许你调暗你的arrays作为一个string。

 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读取string作为常量,但如果你运行你原来的公式,并去评估公式,它给出的错误,单元格包含一个常量,这真的只是似乎是一个错误,但如果我找出别的东西我也会编辑我的答案。

注:这个答案并不是一个更好的答案作为接受的答案,这是一个较慢的答案,更多的是一种select; 回答你想让数组变暗的请求。

更新:这种方法将拆分接受的答案和上述方法之间的区别。 这只会在子的运行时间中增加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