我知道我們可以在 VBA 中宣告一個固定長度的串列,例如,Dim result as Variant后跟ReDim result(1 to 10). 但是我很難在 VBA 中宣告一個可變長度的串列。
例如,給定一個 list arr,我想創建另一個result洗掉所有空和 0 的串列。我撰寫了如下代碼:
Dim result As Variant
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) <> "" And arr(i) <> 0 Then
ReDim Preserve result(1 To UBound(result, 1) 1)
result(UBound(result, 1)) = arr(i)
End If
Next i
這段代碼沒有運行,因為 的長度result沒有很好地初始化;并ReDim Preserve result(1 To UBound(result, 1) 1)在一開始就引發錯誤。
有誰知道如何修復此代碼?
PS:如果ReDim在回圈內部導致性能不佳,有人可以提出更好的方法來重構代碼嗎?
uj5u.com熱心網友回復:
你如何找到第一個值然后做 result = Array(arr(I)) ?
我剛剛檢查了即時面板?UBound(Array())給出了 -1,所以
Dim result As Variant
result = Array()
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) <> "" And arr(i) <> 0 Then
ReDim Preserve result(0 To UBound(result, 1) 1)
result(UBound(result, 1)) = arr(i)
End If
Next i
應該使用基于 0 的“結果”陣列或
Dim result As Variant
ReDim result(1 To 1)
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) <> "" And arr(i) <> 0 Then
ReDim Preserve result(1 To UBound(result, 1) 1)
result(UBound(result, 1)) = arr(i)
End If
Next i
uj5u.com熱心網友回復:
您可以首先在回圈外宣告陣列的最大可能大小(在這種情況下,UBound(arr, 1)假設LBound(arr, 1)為 1),然后在回圈結束時再次調整它的大小:
Dim result As Variant
ReDim result(1 to Ubound(arr, 1)) As Variant
Dim resultCount As Long
Dim i As Long
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) <> "" And arr(i) <> 0 Then
resultCount = resultCount 1
result(resultCount) = arr(i)
End if
Next i
ReDim Preserve result(1 to resultCount) As Variant
注意:以上代碼未經測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/372742.html
標籤:vba
