如何清空整个数组?

67

我有一个像这样的数组:

Dim aFirstArray() As Variant

如何清空整个数组? 集合呢?

8个回答

123

你可以使用EraseReDim语句来清空数组。每个语句的示例都在MSDN文档中展示。例如:

Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer
Erase threeDimArray, twoDimArray
ReDim threeDimArray(4, 4, 9)

要删除集合,您需要遍历其项并使用Remove方法:

For i = 1 to MyCollection.Count
  MyCollection.Remove 1 ' Remove first item
Next i

只是一个快速的提示,至少对于VBA而言,您无法重新定义已声明维度的数组。 - KevenDenen
2
+1 @KevenDenen 这是真的,但原问题中的数组没有声明维度。@Sarfraz 很棒的答案,但你的链接是给 VB.Net 的。我找不到 VBA 的链接。这里是 VB6 手册的链接 http://msdn.microsoft.com/en-us/library/aa243360(v=VS.60).aspx - MarkJ
1
Sarfraz,你为什么不直接说:MyCollection = new Collection呢?为什么要迭代它? - Sam Johnson
2
如果我只是调用ReDim会怎么样?它会简单地将值重置为零,还是会分配一个全新的数组?我担心的是在循环中调用ReDim来重置一个大数组时的时间性能问题。 - Cavaz
请注意:如果数组是模块范围声明的,则不需要最后一行(redim)。 - Patrick Lepelletier
2
这一切都不能与测试“IsEmpty(aFirstArray)”一起工作。我为此添加了一个答案。 - Rafiki

29

在VBA中删除动态数组时,请使用指令Erase

示例:

Dim ArrayDin() As Integer    
ReDim ArrayDin(10)    'Dynamic allocation 
Erase ArrayDin        'Erasing the Array   

希望这可以帮助!


4
在已经有人发布同样答案的情况下,在问题发布两年后回答的原因是什么? - GSerg
@GSerg,那是一个非常措辞得当的句子。 - Alex Gordon
13
你们两个的评论毫无价值。没有任何回答能够解决问题。而且,距离Andres发布他的答案已经快一年了,他的答案实际上给了我我所需要的一行代码解决方案。如果我可以对你们两个的评论进行反对投票,我会这样做的。 - oscilatingcretin
3
添加评论对于那些稍后查看它们的人非常有用,比如我在2018年12月使用这个答案时。非常感谢Andres花时间发布。 - JimT

7

这很简单:

Erase aFirstArray

1
和Andres四年前发布的答案一样。不明白那有什么用处。 - trincot

4

发掘更好的用途:

我通常测试变量是否为空,而所有上述方法都无法通过测试。我发现实际上可以将变量设置为空:

Dim aTable As Variant
If IsEmpty(aTable) Then
    'This is true
End If
ReDim aTable(2)
If IsEmpty(aTable) Then
    'This is False
End If
ReDim aTable(2)
aTable = Empty
If IsEmpty(aTable) Then
    'This is true
End If
ReDim aTable(2)
Erase aTable
If IsEmpty(aTable) Then
    'This is False
End If

这样我就能获得所需的行为


3
[your Array name] = Empty

然后数组将没有内容,可以重新填充。

1
这不起作用。你会得到一个“编译错误:无法分配给数组”的错误。 - seadoggie01
对于变量数组,您的解决方案比erase更好,因为使用您的解决方案,我可以稍后通过执行if isempty(MyArray)检查数组是否为空,而如果我们使用erase,则无法实现。 - JustGreat

1
ReDim aFirstArray(0)

这将调整数组大小为零并擦除所有数据。

2
不,这将会在数组中保留一个索引为0的元素。 - EvE

0

我遇到了一个问题,使用dim/redim清空整个数组失败:

有两个模块级数组,都是在用户窗体内部的私有数组,

其中一个数组是动态的,使用类模块,另一个是固定的,具有特殊类型。

Option Explicit

Private Type Perso_Type
   Nom As String
   PV As Single 'Long 'max 1
   Mana As Single 'Long
   Classe1 As String
   XP1 As Single
   Classe2 As String
   XP2 As Single
   Classe3 As String
   XP3 As Single
   Classe4 As String
   XP4 As Single
   Buff(1 To 10) As IPicture 'Disp
   BuffType(1 To 10) As String
   Dances(1 To 10) As IPicture 'Disp
   DancesType(1 To 10) As String
End Type

Private Data_Perso(1 To 9, 1 To 8) As Perso_Type

Dim ImgArray() As New ClsImage 'ClsImage is a Class module

我有一个公共子程序,可以在用户窗体内外清除这些数组(以及相关的运行时创建的控件),如下所示:

Public Sub EraseControlsCreatedAtRunTime()
Dim i As Long
On Error Resume Next
With Me.Controls 'removing all on run-time created controls of the Userform :
    For i = .Count - 1 To 0 Step -1 
        .Remove i
    Next i
End With
Err.Clear: On Error GoTo 0

Erase ImgArray, Data_Perso
'ReDim ImgArray() As ClsImage ' i tried this, no error but wouldn't work correctly
'ReDim Data_Perso(1 To 9, 1 To 8) As Perso_Type 'without the erase not working, with erase this line is not needed.
End Sub

注意: 这个子程序最初由外部(其他窗体和类模块)使用 Call FormName.SubName 调用,但必须将其替换为 Application.Run FormName.SubName ,这样会减少错误,别问为什么...

0

只使用Redim语句

 Dim aFirstArray() As Variant

Redim aFirstArray(nRows,nColumns)

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