nie odpowiedź, ale badania na tablicy adresowania.
Kod: ReDim Zachowanie matriz (1) matriz (1) = 5
tworzy tablicę z dwóch elementów: 0 i 1 Ubound() zwraca 1
Oto kodami może pomóc zbadać problem:
Option Explicit
Sub Macro1()
Dim matriz() As Variant
Dim x As Variant
Dim i As Integer
matriz = Array(0)
ReDim Preserve matriz(1)
matriz(1) = 5
ReDim Preserve matriz(2)
matriz(2) = 10
ReDim Preserve matriz(3)
matriz(3) = 4
Debug.Print "Initial For Each"
For Each x In matriz
Debug.Print ":" & x
Next x
Debug.Print "Initial For i = 0"
For i = 0 To UBound(matriz)
Debug.Print ":" & matriz(i)
Next i
Debug.Print "Initial For i = 1"
For i = 1 To UBound(matriz)
Debug.Print ":" & matriz(i)
Next i
Debug.Print "remove one"
For i = 1 To UBound(matriz)
matriz(i - 1) = matriz(i)
Next i
ReDim Preserve matriz(UBound(matriz) - 1)
For Each x In matriz
Debug.Print ":" & x
Next x
Debug.Print "remove one more"
For i = 1 To UBound(matriz)
matriz(i - 1) = matriz(i)
Next i
ReDim Preserve matriz(UBound(matriz) - 1)
For Each x In matriz
Debug.Print ":" & x
Next x
End Sub
OUT:
Initial For Each
:0
:5
:10
:4
Initial For i = 0
:0
:5
:10
:4
Initial For i = 1
:5
:10
:4
remove one
:5
:10
:4
remove one more
:10
:4
Chociaż jest to dobra odpowiedź, a ja ją stosuję jako taką, być może zauważysz, że jeśli celem jest posiadanie czegoś w rodzaju kolejki, byłby to strasznie nieefektywny sposób na jej wdrożenie. Kod, który intensywnie wykorzystuje takie rzeczy, prawdopodobnie powinien zostać zmodyfikowany, aby go nie wymagać. –
Zauważ, że istnieje 0 element, więc 'Dla każdego' zawsze zgłasza coś dla pierwszego (zerowego) elementu. – rheitzman
"My"? Komentarz prawdopodobnie powinien być w OP. – rheitzman