2011-04-17 82 views
21

我需要添加VAR在陣列如何在VBA中聲明一個數組變量?

Public Sub Testprog() 

Dim test As Variant 
Dim iCounter As Integer 

If test = Empty Then 
    iCounter = 0 
    test(iCounter) = "test" 
Else 
    iCounter = UBound(test) 
End If 
End Sub 

得到錯誤的test(iCounter) = "test"

請提出了一些解決方案

回答

2

你必須數組變量聲明爲數組:

Dim test(10) As Variant 
30

通常,您應該聲明特定類型的變量,ra比Variant。在這個例子中,test變量的類型應該是String

而且,因爲它是一個數組,所以在聲明變量時需要明確指出。有聲明數組變量的方法有兩種:

  1. 如果你知道數組(它應該包含的元素數)的大小,當你寫的程序,你可以在聲明中指定括號中的那號:

    Dim test(1) As String 'declares an array with 2 elements that holds strings 
    

    這種類型的陣列被稱爲靜態陣列,其大小是固定的,或靜態的。

  2. 如果在編寫應用程序時不知道數組的大小,可以使用動態數組。動態數組的大小未在聲明中指定(Dim語句),而是在使用ReDim語句執行程序期間稍後確定。例如:

    Dim test() As String 
    Dim arraySize As Integer 
    
    ' Code to do other things, like calculate the size required for the array 
    ' ... 
    arraySize = 5 
    
    ReDim test(arraySize) 'size the array to the value of the arraySize variable 
    
+7

括號中的數字是數組的上限'UBound()'而不是大小。如果選項基本0(這是默認值),那麼這些值是1。 – Caltor 2015-04-01 12:20:17

10

繼科迪格雷的答案,還有第三種方式(那裏的一切適用她也一樣):

你也可以使用一個動態陣列對即時調整:

Dim test() as String 
Dim arraySize as Integer 

Do While someCondition 
    '...whatever 
    arraySize = arraySize + 1 
    ReDim Preserve test(arraySize) 
    test(arraySize) = newStringValue 
Loop 

請注意Preserve關鍵字。沒有它,重新調整數組也會初始化所有元素。

-3

數組索引只接受一個長整型值。

您將iCounter聲明爲整數。你應該宣佈它很長。

+7

這是完全不是真的 – 2014-02-03 08:56:25

6

正如其他人所指出的,你的問題是,你還沒有宣佈一個數組

下面我試圖重新您的程序,以便它可以作爲您的預期。 我試圖離開儘可能多的,因爲它是(如離開你的陣列作爲一個變體)

Public Sub Testprog() 
    '"test()" is an array, "test" is not 
    Dim test() As Variant 
    'I am assuming that iCounter is the array size 
    Dim iCounter As Integer 

    '"On Error Resume Next" just makes us skip over a section that throws the error 
    On Error Resume Next 

    'if test() has not been assigned a UBound or LBound yet, calling either will throw an error 
    ' without an LBound and UBound an array won't hold anything (we will assign them later) 

    'Array size can be determined by (UBound(test) - LBound(test)) + 1 
    If (UBound(test) - LBound(test)) + 1 > 0 Then 
     iCounter = (UBound(test) - LBound(test)) + 1 

     'So that we don't run the code that deals with UBound(test) throwing an error 
     Exit Sub 
    End If 

    'All the code below here will run if UBound(test)/LBound(test) threw an error 
    iCounter = 0 

    'This makes LBound(test) = 0 
    ' and UBound(test) = iCounter where iCounter is 0 
    ' Which gives us one element at test(0) 
    ReDim Preserve test(0 To iCounter) 

    test(iCounter) = "test" 
End Sub 
-1

大衛,錯誤來自Microsoft Office Excel中已停止工作。兩個選項在線檢查解決方案並關閉程序和其他選項關閉程序 我確信錯誤在我的數組中,但我正在讀取所有內容,似乎這是定義數組的方式。

4

除了RolandTumble對Cody Gray的答案的回答,這兩個答案都很好,這裏有另一種非常簡單而靈活的方法,當您在編碼時知道所有的數組內容 - 例如,你只想構建一個包含1,10,20和50的數組。這也使用變體聲明,但不使用ReDim。就像在Roland的回答中一樣,數組元素的枚舉數不需要具體知道,但可以通過使用uBound來獲得。

sub Demo_array() 
    Dim MyArray as Variant, MyArray2 as Variant, i as Long 

    MyArray = Array(1, 10, 20, 50) 'The key - the powerful Array() statement 
    MyArray2 = Array("Apple", "Pear", "Orange") 'strings work too 

    For i = 0 to UBound(MyArray) 
     Debug.Print i, MyArray(i) 
    Next i 
    For i = 0 to UBound(MyArray2) 
     Debug.Print i, MyArray2(i) 
    Next i 
End Sub 

我比任何創建數組的其他方法都更喜歡這個。最棒的是你可以在Array語句中添加或減去數組的成員,並且不需要做任何事情來編寫代碼。雞蛋添加到您的3元食品陣列,你只需要輸入

,「蛋」

在適當的地方,你就大功告成了。你的食物數組現在有4個元素,Dim中沒有什麼必須修改,並且ReDim完全被省略。

如果不需要基於0的數組 - 即使用MyArray(0) - 一種解決方案就是阻塞第一個元素的0或「」。

請注意,這可能會被一些編碼純粹主義者嚴重忽視;一個公正的反對意見是「硬數據」應該在Const語句中,而不是在例程中的代碼語句。另一種牛肉可能是,如果你將36個元素粘貼到一個數組中,你應該設置一個常量爲36,而不是無知的代碼。後一個反對意見是有爭議的,因爲它強制要求維護康斯坦丁,而不是依靠uBound。如果添加第37個元素,但將常量保持在36,則可能出現問題。

+0

我對上面的代碼標籤的問題感到茫然 - 如果有人能解決它,謝謝。進一步感謝您是否可以解釋問題。 – MicrosoftShouldBeKickedInNuts 2016-08-08 23:22:05

+0

Stack Overflow上的代碼塊通過用4個空格縮進行來格式化。您也可以單擊編輯器中的大括號圖標。關於Stack Overflow的[格式化幫助頁面](http://stackoverflow.com/help/formatting)有更多信息。 – 2016-08-09 01:37:48

+1

謝謝布蘭登,你的解釋是對的,這是一個非常好的鏈接。並在編輯之後,現在該帖子看起來是正確的。我希望你也能從我的文章中受益 - 自從發現這種方法以來,我從來不必用其他方法來製作VBA中的數組。 - MSBKIN – MicrosoftShouldBeKickedInNuts 2016-08-11 04:26:03