簡體   English   中英

將VBA數組分配給excel范圍的公式時的奇怪行為

[英]Strange behavior when assigning a VBA array to formulas of an excel range

這很奇怪......有人知道或者可以弄清楚為什么會這樣?

在過去,我能夠將一組公式分配給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

上面所有代碼輸出的圖片:

結果示例錯誤(左)和正確(右)


注意:單元格格式正確,不是文本格式!

你的第一個代碼應該工作。
而不是將其聲明為字符串,將其聲明為變體。

所以改變你的聲明:

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

對此:

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

我無法在Excel 2013上嘗試它,但它應該工作。
希望它能做到。

有趣的問題。 我以前從未使用過這個功能。

在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

只是為了添加另一個選項,因為你說你寧願正確地調暗你的數組,你可以這樣做,它只會給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將字符串作為常量讀取,但是如果你運行原始公式並轉到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM