2015-12-11 32 views
7

VBAに配列の最初の要素を削除する方法はありますか?VBA配列の最初の要素を削除します

javascript shift()のようなものはありますか?

Option Explicit 

Sub Macro1() 
Dim matriz() As Variant 
Dim x As Variant 
matriz = Array(0) 

ReDim Preserve matriz(1) 
matriz(1) = 5 
ReDim Preserve matriz(2) 
matriz(2) = 10 
ReDim Preserve matriz(3) 
matriz(3) = 4 

ReDim Preserve matriz(1 To UBound(matriz)) 

For Each x In matriz 
    Debug.Print x 
Next x 
End Sub 

これはエラーをreturingさ:Subscript out of range

答えて

8

ありVBAには直接的な方法はありませんが、あなたはこのように簡単に最初の要素を削除することができます。

'Your existing code 
'... 
'Remove "ReDim Preserve matriz(1 To UBound(matriz))" 
For i = 1 To UBound(matriz) 
    matriz(i - 1) = matriz(i) 
Next i 
ReDim Preserve matriz(UBound(matriz) - 1) 
+4

これは良い答えですが、私はそのようにアップボーティングしていますが、目的がキューのようなものであれば、これを実装するのは非常に非効率的な方法だと言えるでしょう。このようなことを頻繁に使用するコードは、おそらくそれを必要としないように変更する必要があります。 –

+0

0番目の要素があるので、 'For Each'は常に最初の(0番目の)要素について何かを報告することに注意してください。 – rheitzman

+0

「We?」コメントはおそらくOPにあったはずです。 – rheitzman

4

残念ながらありません。それを行う方法を書かなければなりません。一つの良い例は、答えが、アドレッシングアレイ上の研究http://www.vbforums.com/showthread.php?562928-Remove-Item-from-an-array

'~~> Remove an item from an array, then resize the array 

    Public Sub DeleteArrayItem(ItemArray As Variant, ByVal ItemElement As Long) 
    Dim i As Long 

    If Not IsArray(ItemArray) Then 
     Err.Raise 13, , "Type Mismatch" 
     Exit Sub 
    End If 

    If ItemElement < LBound(ItemArray) Or ItemElement > UBound(ItemArray) Then 
     Err.Raise 9, , "Subscript out of Range" 
     Exit Sub 
    End If 

    For i = ItemElement To lTop - 1 
     ItemArray(i) = ItemArray(i + 1) 
    Next 
    On Error GoTo ErrorHandler: 
    ReDim Preserve ItemArray(LBound(ItemArray) To UBound(ItemArray) - 1) 
    Exit Sub 
    ErrorHandler: 
    '~~> An error will occur if array is fixed 
    Err.Raise Err.Number, , _ 
    "Array not resizable." 

    End Sub 
+0

このサブルーチンをあなたのコードに "そのまま"組み込むには、 'lTop'を' UBound(ItemArray) 'に変更してください – lucam

2

されていません。

このコード: のReDimは保持(1) (1)= 5

は、2つの要素を持つ配列を作成マトリズマトリズ:0と1 UBound関数()ここで、1

を返しをいくつかのコードであります

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 

アウト:

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 
問題を探る助けるかもしれません
関連する問題