2015-06-30 73 views
0

目前,我有一系列我希望能夠輸入到數組中的字符串。但是,我不確定它是否正常工作,並且每次我嘗試對該數組執行任何操作時,都會得到下標超出範圍錯誤。我試着做一個Debug.Print來查看值是否進入數組,但是導致相同的錯誤。這是我到目前爲止..當設置一個等於一個範圍的數組時,下標超出範圍VBA錯誤

UsedRow = ActiveWorkbook.Sheets(3).UsedRange.Rows.Count 
Dim ProjectCounter As Long 
Dim ArrRange As Range 

'This determines the number of entries in the array (I know this part works) 
i = UsedRow 
ProjectCounter = 0 
Do While Cells(i, 1).FormulaR1C1 <> vbNullString 
    ProjectCounter = ProjectCounter + 1 
    i = i - 1 
Loop 

'Array should have dimensions that match the number of projects 
Dim ProjectArray() As Variant 
ReDim ProjectArray(ProjectCounter - 1) 

'Set range for array to cover 
Set ArrRange = ActiveWorkbook.Sheets(3).Range("A" & UsedRow - ProjectCounter & ":A" & UsedRow) 

'Populate array with projects 
ProjectArray = ArrRange 

For i = LBound(ProjectArray) To UBound(ProjectArray) 
Debug.Print ProjectArray(i) 
Next 

這是正確的方式來設置數組?如果不是,我做錯了什麼?謝謝。

+0

也許嘗試'ReDim ProjectArray(ProjectCounter - 1,1)'?範圍映射回二維VBA數組。您也可以嘗試完全刪除'ReDim'語句 – Ioannis

+0

我已嘗試刪除ReDim,並導致錯誤。我認爲,因爲你不能有Dim ProjectArray(someVariable),它必須是一個常量。不幸ReDim ProjectArray(ProjectCounter - 1,1)也沒有工作。 –

+0

奇怪的是,它不工作[沒有'ReDim'](http://www.cpearson.com/excel/ArraysAndRanges.aspx)..我認爲數組的長度是ProjectCounter(不是ProjectCounter - 1),所以確實如此也不會工作。順便說一句,刪除'ReDim'會讓它變暗'Dim ProjectArray()作爲Variant',不需要一個常量 – Ioannis

回答

0

您可以將數組讀入預設範圍而無需重新設定。聲明不帶圓括號的變體。

Dim ProjectArray as Variant 
ProjectArray = ArrRange 

由於數組有2個維度,所以出現錯誤。你需要

for I = 1 to ubound(ProjectArray) 
    debug.print ProjectArray(I,1) 
next I 

而LBound將永遠是1,當你這樣做。

+0

不應該我的數組只有一個維度?是什麼讓你說它有兩個? –

+0

@AlexCavanaugh我試圖告訴你如何用範圍填充數組。如果按照我演示的方式進行操作,它將具有兩個維度 - 行數爲1,列數爲2。我沒有按照你想要的方式填充數組,因爲它看起來很麻煩而且效率低下。但要按照自己的方式檢查數組的維數,請在本地窗口中檢查數組。 –

1

我一直認爲1維範圍被複製爲2維數組是VBA中最令人討厭的事情之一。解決產生的下標超出範圍錯誤的一種方法是,而不是記住包含無意義的下標,首先修復數組本身,以便如果數組在概念上是一維的,那麼您的代碼可以將其視爲一維。下面的子修改了當你給變量賦值的範圍時你得到的數組類型。它不採取任何行動,如果它是真正的2維:

Sub FixArray(valArray As Variant) 'As Variant 
'This sub takes a pseudo 2-dimenional 1-based variant array 
'And makes it 1-dimensional 

    Dim fixedArray As Variant 
    Dim columnVector As Boolean 
    Dim i As Long, m As Long, n As Long 
    On Error GoTo err_handler 

    m = UBound(valArray, 1) 
    n = UBound(valArray, 2) 'will throw an error if already 1-dimensional 
    If m > 1 And n > 1 Then Exit Sub 'can't be fixed without losing data 
    If m > 1 Then 
     columnVector = True 
    Else 
     columnVector = False 
     m = n 
    End If 
    ReDim fixedArray(1 To m) 
    For i = 1 To m 
     If columnVector Then 
      fixedArray(i) = valArray(i, 1) 
     Else 
      fixedArray(i) = valArray(1, i) 
     End If 
    Next i 
    valArray = fixedArray 
err_handler: 
    'no action - nothing to fix 
End Sub 

測試子網(與當地人窗口打開調試模式下運行,看看如何從二維到一維v變化):

Sub test() 
    Dim v As Variant 
    v = Range("A1:A3").Value 
    FixArray v 
    Debug.Print "here" 'convenient breakpoint 
End Sub 
+1

[This](http://stackoverflow.com/a/7651439/2280567)也可能是有趣的。 – Ioannis

+1

@loannis - 奇怪。但 - 很高興知道。感謝您指出! –

+0

確實可能很適合用於自己的消費,但由於它與大型數組失敗,我不會分發這樣的代碼 - 會像上面顯示的那樣。 – Ioannis