2015-12-11 11 views
7

VBA में किसी सरणी के पहले तत्व को हटाने का कोई तरीका है?वीबीए सरणी के पहले तत्व को हटाएं

जावास्क्रिप्ट 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 वां तत्व है इसलिए 'प्रत्येक के लिए' हमेशा पहले (0 वें) तत्व के लिए कुछ रिपोर्ट करेगा। – rheitzman

+0

'हम'? शायद ओपी पर टिप्पणी होनी चाहिए। – 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

यदि आप अपने कोड "as-is" में इस सबराउटिन को शामिल करना चाहते हैं, तो 'lTop' को 'UBound (ItemArray)' में बदलने के लिए सावधान रहें। – lucam

2

नहीं एक जवाब लेकिन सरणी पर एक अध्ययन को संबोधित है।

इस कोड: ReDim बचाना Matriz (1) Matriz (1) = 5

दो तत्वों के साथ एक सरणी बनाता है: 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 
संबंधित मुद्दे