2013-11-04 153 views
3

我試圖用工作表中的數據填充動態數組。我得到「錯誤9下標超出範圍」。爲什麼?錯誤9下標超出範圍

Sub correct() 

Dim row As Integer, i As Long 
Dim constants() As Double 'this declares the dynamic array 
row = 1 
i = 0 

ReDim constans(0) 'this resizes the array(rediminsion's the array) 

Do Until ThisWorkbook.Sheets("Deg 4").Cells(row, 1).Value = "" 
    constants(i) = ThisWorkbook.Sheets("Deg 4").Cells(row, 1).Value 
    i = i + 1 'increments array index 
    ReDim Preserve constants(i) 'resize the array 1 larger and preserves previous data 
    row = row + 1 'increments the worksheet row 
Loop 

End Sub 

回答

3

你拼錯您的數組的名字:

ReDim constans(0) 

應該是:

ReDim constants(0) 

因此,錯誤,您正在使用ReDim宣佈一個新的數組稱爲constans,並且constants仍未分配。當你到達你的程序中的constants(i) = ...行時,你會得到該錯誤,因爲constants未被分配。

我從來沒有遇到過這種特殊的錯誤;我真的很震驚,VBA語言設置允許這個! Microsoft does warn against this強調礦):

注意:本ReDim聲明充當聲明聲明如果聲明在模塊級或過程 水平不存在變量。如果以後創建具有相同名稱的另一個變量,甚至 在更大範圍,ReDim將指後來變量,不會 必然導致編譯錯誤,即使Option Explicit生效 。爲避免這種衝突,ReDim不應作爲 聲明性語句使用,而僅用於重新定義數組。

好的,謝謝你的隱藏警告,但他們應該沒有給出ReDim聲明性功能的第一位。

+0

感謝您對陳述式ReDim的建議。它之前並沒有引起我的注意,但是預先警告過的是前臂式的。我將來不會被它愚弄! –

+0

感謝這真的有所幫助,也感謝關於ReDim的警告。我只使用ReDim,因爲它是我知道如何創建動態數組的唯一方法。使用ReDim是否是更好的方法? –

+0

不,這是使用它的方式 - 只要你拼寫正確的數組名稱! –

0

的問題是在你的聲明

Dim constants() As Double 'this declares the dynamic array 

但你ReDim不同的未申報陣列

ReDim constans(0) 'this resizes the array(rediminsion's the array) 

添加缺少的 「T」 到 「的constans」 將解決這個問題。如果要避免無意中使用未聲明的變量,請轉到工具..>選項..>編輯器選項卡,並確保「要求變量聲明已選中 - 這將在您創建的每個模塊的頂部插入Option Explicit您現有的)。

隨着Option Explicit和駝峯變量聲明,只要在輸入小寫的變量名(即camelcase)這時再按下輸入的時候,他們會宣佈確認名字輸入更改爲CamelCase已經被聲明,如果它沒有改變,那麼它是未聲明的,當你嘗試運行這個程序時它會導致編譯錯誤

之前運行你的程序,編譯它轉到調試..>編譯VBA項目或按Alt> d> l。如果你沒有看到一個消息框,那麼它可能會運行

PS:您可能會得到意想不到的結果與當前的循環,因爲我的測試表明常數(0)= 1,依此類推,直至常數(最後我)= 0。可能不是你想要的,但如果是的話,那麼......一切都好!

+0

'Option Explicit'在這種情況下不起作用。錯誤不會在編譯時顯示,因爲'constans'是* not * undeclared;它由'ReDim'聲明。請參閱[我的回答](http://stackoverflow.com/a/19764824/119775),您可能在發佈自己的帖子之前閱讀這些內容。不過,關於駱駝套裝的好處是,我還建議使用自動完成(Ctrl-space)來防止輸入錯誤。 –

+0

@ Jean-FrançoisCorbett我正在慢慢打字,而你打敗了我的答案。在發佈之前,我注意到已經發布了另一個答案,但有點害怕看到它可能已經抹去了我所有的工作。 –

相關問題