![](/img/trans.png)
[英]Excel VBA Subscript out of range error in array when assigning values to array
[英]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.