Ik heb een array als deze:
Dim aFirstArray() As Variant
Hoe wis ik de hele array?
Hoe zit het met een verzameling?
Antwoord 1, autoriteit 100%
U kunt de instructies Erase
of Redim
gebruiken om de array te wissen. Voorbeelden van elk worden getoond in de MSDN-documentatie . Bijvoorbeeld:
Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer
Erase threeDimArray, twoDimArray
ReDim threeDimArray(4, 4, 9)
Als u een verzameling wilt verwijderen, herhaalt u de items en gebruikt u de methode Remove
:
For i = 1 to MyCollection.Count
MyCollection.Remove 1 ' Remove first item
Next i
Antwoord 2, autoriteit 24%
Voor het verwijderen van een dynamische array in VBA gebruik je de instructie Erase
.
Voorbeeld:
Dim ArrayDin() As Integer
ReDim ArrayDin(10) 'Dynamic allocation
Erase ArrayDin 'Erasing the Array
Ik hoop dat dit helpt!
Antwoord 3, autoriteit 6%
Het is zo simpel als:
Erase aFirstArray
Antwoord 4, autoriteit 3%
Zoek een beter gebruik voor mezelf:
Ik test meestal of een variant leeg is en alle bovenstaande methoden mislukken met de test. Ik heb ontdekt dat je een variant op leeg kunt zetten:
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
op deze manier krijg ik het gewenste gedrag
Antwoord 5, autoriteit 2%
[your Array name] = Empty
De array is dan zonder inhoud en kan opnieuw worden gevuld.
Antwoord 6
ReDim aFirstArray(0)
Hiermee wordt de grootte van de array gewijzigd naar nul en worden alle gegevens gewist.
Antwoord 7
ik kwam in een geval terecht waarbij het wissen van de hele array mislukte met dim/redim :
met 2 module-brede arrays, privé in een gebruikersformulier,
Eén array is dynamisch en gebruikt een klassenmodule, de andere is vast en heeft een speciaal type.
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
En ik heb een sub die als openbaar is gedeclareerd om die arrays (en bijbehorende door runtime gemaakte besturingselementen) van binnen en buiten het gebruikersformulier als volgt te wissen:
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
opmerking: deze laatste sub werd eerst van buitenaf aangeroepen (andere formulier- en klassenmodule) met Call FormName.SubName
maar moest deze vervangen door Application.Run FormName.SubName
, minder fouten, vraag niet waarom…
Antwoord 8
Gebruik alleen Redim
-instructie
Dim aFirstArray() As Variant
Redim aFirstArray(nRows,nColumns)