Как очистить весь массив? - PullRequest
53 голосов
/ 11 июня 2010

У меня есть такой массив:

Dim aFirstArray() As Variant

Как очистить весь массив?А как насчет коллекции?

Ответы [ 8 ]

105 голосов
/ 11 июня 2010

Вы можете использовать операторы Erase или ReDim для очистки массива:

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
20 голосов
/ 22 марта 2012

Для удаления динамического массива в VBA используйте инструкцию Erase.

Пример:

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

Надеюсь, это поможет!

6 голосов
/ 17 марта 2013

Это так же просто, как:

Erase aFirstArray
2 голосов
/ 27 мая 2016
[your Array name] = Empty

Тогда массив будет без содержимого и может быть снова заполнен.

1 голос
/ 27 февраля 2019
ReDim aFirstArray(0)

Это позволит изменить размер массива до нуля и стереть все данные.

0 голосов
/ 07 февраля 2018

Найдите лучшее применение для себя: Я обычно проверяю, является ли вариант пустым, и все ли вышеперечисленные методы не проходят тест Я обнаружил, что вы действительно можете установить вариант пустым:

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

таким образом я получаю поведение, которое хочу

0 голосов
/ 04 февраля 2017

Используйте только оператор Redim

 Dim aFirstArray() As Variant

Redim aFirstArray(nRows,nColumns)
0 голосов
/ 21 апреля 2016

Я попал в случай, когда очистка всего массива завершилась неудачно с помощью dim / redim:

с двумя массивами всего модуля, Private внутри пользовательской формы,

Один массив является динамическим и используетмодуль класса, другой исправлен и имеет специальный тип.

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

И у меня есть подпрограмма, объявленная как общедоступная для очистки этих массивов (и связанных с ними элементов управления во время выполнения) изнутри и снаружи пользовательской формы, напримерthis:

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, меньше ошибок, не спрашивайте, почему...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...