Как очистить весь массив?

40

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

Dim aFirstArray() As Variant

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

Теги:
excel-vba
arrays

6 ответов

80
Лучший ответ

Вы можете использовать операторы 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
  • 0
    как насчет коллекции?
  • 1
    @ Я: см. Мой обновленный ответ, пожалуйста.
Показать ещё 6 комментариев
14

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

Пример:

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

Надеюсь на эту помощь!

  • 4
    По какой причине был опубликован ответ через два года после того, как был задан вопрос, если этот самый ответ уже был опубликован?
  • 0
    @Gerg, это очень хорошо сформулированное предложение.
Показать ещё 2 комментария
6

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

Erase aFirstArray
  • 0
    Тот же ответ, что и Андрес, опубликованный 4 года назад. Не могу понять, как это полезно.
2
[your Array name] = Empty

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

  • 1
    Это не работает Появляется сообщение «Ошибка компиляции: невозможно назначить массив»
0

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

 Dim aFirstArray() As Variant

Redim aFirstArray(nRows,nColumns)
0

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

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

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

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

И у меня есть sub, объявленный как public, чтобы очистить эти массивы (и связанные с ними временные элементы управления) изнутри и вне пользовательской формы, например:

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: последний последний был вызван извне (другой модуль формы и класса) с Call FormName.SubName, но ему пришлось заменить его на Application.Run FormName.SubName, меньше ошибок, не спрашивайте, почему...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню