2017-09-19 3 views
1

Ich versuche, die Werte in einem Array zu speichern. Ich stehe vor einem Problem, das besagt, dass der Index außerhalb des Bereichs liegt.Array - Index außerhalb des Bereichs in VBA

Dies ist der Code,

Sub Trial() 

Dim HeaderArray() As Variant 

Dim HeaderValue As String 

Dim j As Long 

Dim i as Long 

set wk = Activeworkbook 

lastrow_header_Config = Wk.Sheets("Config").Cells(Rows.Count, "W").End(xlUp).Row 

j = 1 

     For i = 2 To lastrow_header_Config 

     HeaderValue = Wk.Sheets("Config").Range("W" & i).Value 

      If HeaderValue <> "" Then 

       HeaderArray(j - 1) = HeaderValue // Subscript out of range error 

      j = j + 1 

      End If 

     Next 

End Sub 

Was die Fehler, die ich mache. Freundlicher Hinweis.

+3

Autsch, bitte lesen Sie Ihren Code ein. Welche Zeilenfehler? – SJR

+4

Sie legen die Größe des Arrays nicht fest. Sie müssen 'Redim HeaderArray (die Größe, die Sie wollen)' –

+7

verwenden 'Option Explicit'! –

Antwort

4

Sie müssen die Größe des Arrays erklären, bevor Sie versuchen, Daten in sie zu setzen. Verwenden Sie COUNTA die Anzahl von Zellen mit Daten in Ihrem Bereich zu finden:

Sub Trial() 

Dim HeaderArray() As Variant 
Dim HeaderValue As String 
Dim lastrow_Header_Config As Long 
Dim j As Long 
Dim i As Long 

Set Wk = ActiveWorkbook 

lastrow_Header_Config = Wk.Sheets("Config").Cells(Rows.Count, "W").End(xlUp).Row 
ReDim HeaderArray(Application.WorksheetFunction.CountA(Wk.Sheets("Config").Range("W2:W" & lastrow_Header_Config))-1) As Variant 
j = 0 

For i = 2 To lastrow_Header_Config 
    HeaderValue = Wk.Sheets("Config").Range("W" & i).Value 
    If HeaderValue <> "" Then 
     HeaderArray(j) = HeaderValue 
     j = j + 1 
    End If 
Next 

End Sub 
1

Auf den ersten Durchgang, j = 1. Daher versuchen Sie HeaderArray(0) einen Wert festzulegen, während HeaderArray wahrscheinlich 1 basiert.
Sie können schließlich Option Base 0 oder explizit verwenden Redim HeaderArray(0 to 10) (oder was auch immer Wert, den Sie benötigen)

+0

Aber Array beginnt bei '0'? nicht wahr? – Sid29

+2

Nein, tun sie nicht. Es hängt von Ihrer Optionsbasis ab. Außer Split(), die immer ein 0-basiertes Array zurückgibt, wenn ich mich gut erinnere. –

+3

Und wenn ein Array direkt aus einem Bereich geladen wird, beginnt es bei 1: 'SomeArray = Bereich (" A1: A10 "). Wert wird bei 1 beginnen. @ Sid29 –

3

versuchen dies und sehen, wie es für Sie arbeitet

Pay besonderes Augenmerk auf die ReDim HeaderArray(j) Linie und die ReDim Preserve HeaderArray(j) Linien

Sub Trial() 
    Dim HeaderArray() As Variant 
    Dim HeaderValue As String 
    Dim j As Long 
    Dim i As Long 
     Set Wk = ActiveWorkbook 
     lastrow_header_Config = Wk.Sheets("Config").Cells(Rows.Count, "W").End(xlUp).Row 
     j = 1 
     ReDim HeaderArray(j) '<============= initialize your array length 
     For i = 2 To lastrow_header_Config 
      HeaderValue = Wk.Sheets("Config").Range("W" & i).Value 
      If HeaderValue <> "" Then 
       ReDim Preserve HeaderArray(j) '<================= adjust your array length to accomodate the additional info 
       HeaderArray(j - 1) = HeaderValue '// Subscript out of range error 
       j = j + 1 
      End If 
     Next 
End Sub 

Auch Sie möchten vielleicht über das Schlüsselwort Option nachlesen. Arrays haben standardmäßig den ersten Datenpunkt auf dem Index 0, so dass z. B. Array (1) ein Array mit einem Datenpunkt erstellt. Um jedoch auf diesen Datenpunkt zu verweisen, würden Sie Array (0) verwenden. Wenn Sie möchten, dass der erste Datenpunkt im Array mithilfe von Array (1) referenziert wird, verwenden Sie das Schlüsselwort ganz oben in Ihrem Modul.

+1

Schöne Option. FWIW; Redim Preserve ist langsamer als die Größe vorher festzulegen. Aber in vielen Fällen ist es die einzige Option. Ein weiterer Hinweis ist, dass Sie in mehrdimensionalen Arrays nur die letzten Dimensionen ändern können. Die anderen werden gesetzt, wenn sie initialisiert werden. –

Verwandte Themen