通过位置从数组中删除元素

3

我正在尝试弄清如何从数组中删除特定位置的元素。我们还需要调整数组大小。为了使示例更简单,让我们尝试删除数组中位置一的任何颜色(“绿色”,“蓝色”,“红色”)。

Sub Example()

Dim pos
colors = Array("Green", "Blue", "Red")

pos = 1

colors(pos).Delete 'obviously this doesn't work but what would the correct protocol be?

 End Sub
3个回答

6
您也可以使用过滤器(如果值是唯一的,就像在这个例子中任何匹配Green的字符串都会被删除)。
Colors = Array("Green", "Blue", "Red", "Yellow", "Pink")
Colors = Filter(Colors, Colors(0), False)

5
您可以将具体元素设置为空格,并使用TRIM()将其删除:
Sub DropFirstElement()
    Colors = Array("Green", "Blue", "Red")
    Colors(0) = " "
    Mystring = Application.WorksheetFunction.Trim(Join(Colors, " "))
    Colors = Split(Mystring, " ")
End Sub

注意:
我们使用工作表的Trim()函数而不是VBA的Trim()函数来删除多个连续空格。

2
良好地使用工作表函数的[TRIM函数](https://support.office.com/en-us/article/TRIM-function-410388FA-C5DF-49C6-B16C-9E5630B479F9)将内部双空格减少为单个空格字符,而VBA的[Trim函数](https://msdn.microsoft.com/en-us/library/h9wz3dez%28v = vs.90%29.aspx)无法执行此操作。我相信[Join函数](https://msdn.microsoft.com/en-us/library/b65z3h4h%28v = vs.90%29.aspx)默认使用单个空格作为分隔符(即未提供)。 - user4039065
1
好的,缺省值是为那些熟悉各种函数的人准备的。详细说明永远不会有坏处。 - user4039065
谢谢你提醒我这两个“Trim”函数之间的区别。 - DaveU

4
您可以将从pos开始的数组值移动,然后使用ReDim调整为新尺寸。
Sub Example()

    Dim pos As Long, p As Long, vCOLOURs As Variant

    vCOLOURs = Array("Green", "Blue", "Red", "Purple", "Pink")

    For p = LBound(vCOLOURs) To UBound(vCOLOURs)
        Debug.Print p & ": " & vCOLOURs(p)
    Next p

    'vCOLOURs is an array dimmed 0 to 4
    pos = 3
    'vCOLOURs(pos) is 'Purple'

    For p = pos To UBound(vCOLOURs) - 1
        vCOLOURs(p) = vCOLOURs(p + 1)
    Next p
    ReDim Preserve vCOLOURs(0 To (UBound(vCOLOURs) - 1))

    For p = LBound(vCOLOURs) To UBound(vCOLOURs)
        Debug.Print p & ": " & vCOLOURs(p)
    Next p

End Sub

VBE的即时窗口(Ctrl+G)中的结果

example
0: Green
1: Blue
2: Red
3: Purple
4: Pink
0: Green
1: Blue
2: Red
3: Pink

请记住,您正在使用的方法将值放入变量数组中创建了一个从零开始的数组。第一个值位于 vCOLOURs(0),而不是 vCOLOURs(1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接