如果元素是某个值VBA,则删除数组中的元素

H3l*_*lue 13 arrays excel vba element

我有一个prLst()可变长度的全局数组.这需要在数字作为字符串"1"Ubound(prLst).但是,当用户输入时"0",我想从列表中删除该元素.我编写了以下代码来执行此操作:

count2 = 0
eachHdr = 1
totHead = UBound(prLst)

Do
    If prLst(eachHdr) = "0" Then
        prLst(eachHdr).Delete
        count2 = count2 + 1
    End If
    keepTrack = totHead - count2
    'MsgBox "prLst = " & prLst(eachHdr)
    eachHdr = eachHdr + 1
Loop Until eachHdr > keepTrack
Run Code Online (Sandbox Code Playgroud)

这不起作用.prLst如果元素是"0"?如何有效删除数组中的元素?


注意:这是较大程序的一部分,可在此处找到相关说明:排序行组Excel VBA宏

Edd*_*ddy 35

数组是具有一定大小的结构.您可以在vba中使用可以使用ReDim缩小或增长的动态数组,但不能删除中间的元素.从您的示例中不清楚您的数组在功能上如何工作或如何确定索引位置(eachHdr)但您基本上有3个选项

(A)为你的数组写一个自定义的'删除'函数,如(未经测试)

Public Sub DeleteElementAt(Byval index As Integer, Byref prLst as Variant)
       Dim i As Integer

        ' Move all element back one position
        For i = index + 1 To UBound(prLst)
            prLst(i - 1) = prLst(i)
        Next

        ' Shrink the array by one, removing the last one
        ReDim Preserve prLst(Len(prLst) - 1)
End Sub
Run Code Online (Sandbox Code Playgroud)

(B)只需将'哑'值设置为值,而不是实际删除元素

If prLst(eachHdr) = "0" Then        
   prLst(eachHdr) = "n/a"
End If
Run Code Online (Sandbox Code Playgroud)

(C)停止使用数组并将其更改为VBA.Collection.集合是(唯一的)键/值对结构,您可以在其中自由添加或删除元素

Dim prLst As New Collection
Run Code Online (Sandbox Code Playgroud)

  • 当“Len(Array())”是类型不匹配错误时,如何获得高度评价和接受的答案?该代码不能按原样使用。收缩线应为“ReDim Preserve thisArray(LBound(prLst) To UBound(prLst) -1)” (3认同)