tjvg1991
tjvg1991

Reputation: 402

Remove item from array

How do you remove an item in the middle of an array? I tried this:

Public Sub RemoveArrayElement(AryVar() As Object, ByVal RemoveWhich As Long)
Dim byteLen As Byte    
byteLen = 4

If RemoveWhich < UBound(AryVar) Then
    CopyMemory ByVal VarPtr(AryVar(RemoveWhich)), ByVal _
        VarPtr(AryVar(RemoveWhich + 1)), (byteLen) * _
        (UBound(AryVar) - RemoveWhich)
End If

If UBound(AryVar) = LBound(AryVar) Then
    Erase AryVar
Else
    ReDim Preserve AryVar(UBound(AryVar) - 1)
End If
End Sub

But when I retrieve item from aryvar, it returns Nothing.

Upvotes: 2

Views: 3928

Answers (3)

Andrew Alderson
Andrew Alderson

Reputation: 903

A bit of a different approach then the one you're taking above, but couldn't you just shuffle all the values down and shrink the array afterwards?

For example:

Public Sub RemoveArrayElement(AryVar() As Object, ByVal RemoveWhich As Long)
    If UBound(AryVar) > 0 Then
        Dim i As Integer
        For i = LBound(AryVar) To UBound(AryVar) - 1
            If i >= removeWhich Then
                    AryVar(i) = AryVar(i + 1)
            End If
        Next
        ReDim Preserve AryVar(UBound(AryVar) - 1)
    End If
End Sub

Upvotes: 1

Anish Sharma
Anish Sharma

Reputation: 505

Well This code snippet might help you.

Dim remove_place As Integer
Dim ar() As Integer
Dim n As Integer
n = 10
ReDim ar(n)                     'Initial size of an array
remove_place = Val(Text1.Text)  'This is the position to be deleted
For i = remove_place To n - 1
ar(i) = ar(i + 1)               'This loop will shift array position one    place   to the left. This way the number at your position will be replaced by the next number.
Next
ReDim Preserve ar(n - 1)        'I guess you know what it means.

Place it under any event procedure.

Upvotes: 1

Hrqls
Hrqls

Reputation: 2951

and another approach :

'1 form with:
'  1 command button: name=Command1

Option Explicit

Private Sub Command1_Click()
  Dim intIndex As Integer
  'dim an array with undefined boundaries
  Dim intArray() As Integer
  'set boundaries
  ReDim intArray(10) As Integer
  'fill array with values
  For intIndex = 0 To 10
    intArray(intIndex) = intIndex * intIndex
  Next intIndex
  'show the data from the initial array
  ShowArray intArray
  'remove the 6th item (index=5)
  intArray = RemoveItem(5, intArray)
  'show the data of the resulting array (with the 6h item removed)
  ShowArray intArray
End Sub

Private Function RemoveItem(intItem As Integer, intSrc() As Integer) As Integer()
  Dim intIndex As Integer
  Dim intDest() As Integer
  Dim intLBound As Integer, intUBound As Integer
  'find the boundaries of the source array
  intLBound = LBound(intSrc)
  intUBound = UBound(intSrc)
  'set boundaries for the resulting array
  ReDim intDest(intLBound To intUBound - 1) As Integer
  'copy items which remain
  For intIndex = intLBound To intItem - 1
    intDest(intIndex) = intSrc(intIndex)
  Next intIndex
  'skip the removed item
  'and copy the remaining items, with destination index-1
  For intIndex = intItem + 1 To intUBound
    intDest(intIndex - 1) = intSrc(intIndex)
  Next intIndex
  'return the result
  RemoveItem = intDest
End Function

Private Sub ShowArray(intArray() As Integer)
  Dim intIndex As Integer
  'print all items to the form to show their value
  For intIndex = LBound(intArray) To UBound(intArray)
    Print "Item " & CStr(intIndex) & " : " & CStr(intArray(intIndex))
  Next intIndex
  'print an empty line to separate the arrays in displaying
  Print
End Sub

The differences :

  • return the array instead of passing byref
  • using a temporary array which is dimmed to the right size instead of redim preserve at the end
  • copy the items which keep the same index, and only move the ones after the removed item

Upvotes: 3

Related Questions