2010-06-10 7 views

Répondre

82

Vous pouvez utiliser les Erase ou ReDim déclarations pour effacer le tableau:

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

See the different usage of each method here.

Mise à jour

Pour supprimer une collection, vous itérer sur ses articles et utilisez la méthode remove:

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

Qu'en est-il une collection? –

+0

@I: voir ma réponse mise à jour s'il vous plaît. – Sarfraz

+0

Juste une note rapide, au moins pour VBA, vous ne pouvez pas ReDim un tableau qui a été déclaré avec des dimensions. – KevenDenen

15

Pour supprimer un tableau dynamique dans VBA, utilisez l'instruction Erase.

Exemple:

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

Hope this aide!

+3

Quelle était la raison pour laquelle vous avez répondu à une question deux ans après que la question ait été posée, à condition que cette réponse ait déjà été postée? – GSerg

+0

@GSerg qui est une phrase très bien formulée. –

+7

commentaires sans importance à vous deux. Aucune réponse ne démontre Erase. De plus, c'est presque un an après qu'Andres a posté sa réponse et qu'elle m'a donné la solution de code d'une ligne que je cherchais. Si je pouvais rétrograder vos deux commentaires, je le ferais. – oscilatingcretin

7

Il est aussi simple que:

Erase aFirstArray 
+0

Même réponse que celle d'Andres publiée 4 ans plus tôt. Je ne vois pas comment cela est utile. – trincot

0

je suis tombé dans un cas où le défrichement l'ensemble du réseau a échoué avec dim/redim:

ayant 2 tableaux de modules à l'échelle, privé à l'intérieur d'un userform,

Un tableau est dynamique et utilise un module de classe, l'autre est fixe et a un type spécial.

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 

Et j'ai une sous déclarée publique pour effacer les tableaux (et associés contrôles créés d'exécution) à l'intérieur et à l'extérieur du userform comme ceci:

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 

Note: ce dernier sous était d'abord appelé à l'extérieur (autre forme et module de classe) avec Call FormName.SubName mais a dû le remplacer par Application.Run FormName.SubName, moins d'erreurs, ne demandez pas pourquoi ...

2
[your Array name] = Empty 

Ensuite, le tableau sera sans contenu et peut être rempli à nouveau.

+1

Cela ne fonctionne pas. Vous obtenez une "erreur de compilation: impossible d'affecter au tableau" – seadoggie01

0

Utilisez uniquement des Redim déclaration

Dim aFirstArray() As Variant 

Redim aFirstArray(nRows,nColumns) 
0

Trouver une meilleure utilisation pour moi-même: je teste habituellement si une variante est vide, et toutes les méthodes ci-dessus échouent au test. Je trouve que vous pouvez réellement définir une variante à vide:

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 

cette façon que je reçois le comportement que je veux