Ms access 如何从VBA中的任何位置删除动态数组中的值?

Ms access 如何从VBA中的任何位置删除动态数组中的值?,ms-access,vba,Ms Access,Vba,我有一个要从中删除项目的动态数组。我知道我们可以从数组末尾删除一个项目,方法是将其大小减小1并重新命名。但是,有没有一种方法可以从数组中删除项目,而不管该项目在数组中处于什么位置?没有内置函数可以从数组中删除。因此,唯一的方法是将每个值向下“拉”一,然后重新调暗以删除最后一个值 数组可以追溯到20世纪70年代末和80年代初在个人计算机上流行的FORTAN和早期GWBASIC语言的旧时代。大多数新语言(包括VBA)都有更好的选择。因为这是一种“痛苦”的方法,所以我将构建一个函数来为您删除该行 此代

我有一个要从中删除项目的动态数组。我知道我们可以从数组末尾删除一个项目,方法是将其大小减小1并重新命名。但是,有没有一种方法可以从数组中删除项目,而不管该项目在数组中处于什么位置?

没有内置函数可以从数组中删除。因此,唯一的方法是将每个值向下“拉”一,然后重新调暗以删除最后一个值

数组可以追溯到20世纪70年代末和80年代初在个人计算机上流行的FORTAN和早期GWBASIC语言的旧时代。大多数新语言(包括VBA)都有更好的选择。因为这是一种“痛苦”的方法,所以我将构建一个函数来为您删除该行

此代码将显示删除是如何工作的:

Private Sub Command104_Click()

  Dim MyData()     As Integer

  Dim i       As Integer

  ReDim MyData(1 To 5)

  For i = 1 To 5
     MyData(i) = i * 100
  Next i

  Call MyDisplay(MyData)

  ' delete 3rd row
  Call MyDelete(MyData, 3)

  Call MyDisplay(MyData)

End Sub

Public Sub MyDelete(v() As Integer, intPos As Integer)

  Dim numRows    As Integer
  Dim i          As Integer

  numRows = UBound(v)
  ' move every row down one

  For i = intPos To numRows - 1
     v(i) = v(i + 1)
  Next i

  ' get rid of last row   
  ReDim Preserve v(1 To numRows - 1)

End Sub


Public Sub MyDisplay(v() As Integer)

  Dim i       As Integer

  For i = 1 To UBound(v)
     Debug.Print i, "--->", v(i)
  Next i

End Sub
输出:

  1            --->           100 
  2            --->           200 
  3            --->           300 
  4            --->           400 
  5            --->           500 

  1            --->           100 
  2            --->           200 
  3            --->           400 
  4            --->           500 

可以从数组元素中删除值,但元素仍然存在,不调整大小。可能要使用集合而不是数组。我尝试使用collection,但在网上找不到任何可以在不知道其密钥的情况下删除collection项的方法。我在这里为它制作了一个不同的线程:我为你的收集问题发布了一个工作示例-我建议你使用它,但我也为数组()发布了一个工作解决方案,但如果可能,我会尽量避免使用数组。谢谢@AlbertD.Kallal。我决定使用Collectionarray,当然它仍然有用。数组的一个优点是,可以直接从记录集中填充数组。因此,您可以将整个表直接拉入一个数组,而不需要循环(并且可以得到带列的行(矩阵)。因此,阵列并没有消亡,这实际上取决于特定的用例。最终取决于一个人试图实现的目标。因此,虽然阵列通常很难使用,但其中一些可能会让我们的开发人员变得越来越懒惰。许多可以追溯到FORTAN的系统在没有集合的情况下运行了多年。