Return to VBA Code Examples
In this Article
- Clear Entire Array
- Resize and Clear Array
- Clear Part of an Array
- Loop Through Entire Array – Resetting Values
This tutorial will teach you how to clear an Array in VBA.
Clear Entire Array
To clear an entire array, you can use the Erase Statement:
Erase arrExample
In practice:
Sub ClearArray()
'Create Static Array
Dim arrExample(1 to 3) as String
'Define Array Values
arrExample(1) = "Shelly"
arrExample(2) = "Steve"
arrExample(3) = "Neema"
'Erase Entire Array
Erase arrExample
'Check Array Value
MsgBox arrExample(1)
End Sub
Resize and Clear Array
If your Array is dynamic (A dynamic array is an array that can be resized, as opposed to a static array which can not be resized), you can use the ReDim Command to resize the array, clearing the entire array of values.
'Erase Entire Array
ReDim arrExample(1 To 4)
Full Example:
Sub ClearArray2()
'Create Dynamic Array
Dim arrExample() As String
ReDim arrExample(1 To 3)
'Define Array Values
arrExample(1) = "Shelly"
arrExample(2) = "Steve"
arrExample(3) = "Neema"
'Erase Entire Array
ReDim arrExample(1 To 4)
'Check Array Value
MsgBox arrExample(1)
End Sub
Clear Part of an Array
As mentioned above, the ReDim Command will resize an array, clearing all values from the array. Instead you can use ReDim Preserve to resize the array, preserving any existing values. In practice, this can be used to quickly clear part of an array.
'Erase Position 3+
ReDim Preserve arrExample(1 To 2)
Full Example:
Sub ClearArray3()
'Create Dynamic Array
Dim arrExample() As String
ReDim arrExample(1 To 3)
'Define Array Values
arrExample(1) = "Shelly"
arrExample(2) = "Steve"
arrExample(3) = "Neema"
'Erase Position 3+
ReDim Preserve arrExample(1 To 2)
'Resize to 3 Positions
ReDim Preserve arrExample(1 To 3)
'Check Array Value
MsgBox arrExample(3)
End Sub
Loop Through Entire Array – Resetting Values
Instead of clearing array values using Erase or ReDim, you could loop through the entire array, resetting each value.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
i fell into a case where clearing the entire array failed with dim/redim :
having 2 module-wide arrays, Private inside a userform,
One array is dynamic and uses a class module, the other is fixed and has a special 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
And i have a sub declared as public to clear those arrays (and associated run-time created controls) from inside and outside the userform like 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
note : this last sub was first called from outside (other form and class module) with Call FormName.SubName
but had to replace it with Application.Run FormName.SubName
, less errors, don’t ask why…
Home / VBA / Arrays / VBA Clear Array (Erase)
You need to use the “Erase” statement to clear an array in VBA. Add the keyword “Erase” before the name of the array that you want to clear but note that all the values will be reset from the array. In the following array, you have 3 elements and we have used the erase statement to erase all.
Sub myMacro1()
Dim myArray() As Long
ReDim myArray(4)
myArray(1) = 1
myArray(2) = 2
myArray(3) = 3
myArray(4) = 4
ReDim myArray(1 To 5)
MsgBox myArray(3)
End Sub
And with that statement, it has erased all the elements from the array, and when we use the Debug.Print (Immediate Window) to get the array element, there’s nothing left.
Clear Dynamic Array
When you use ReDim it removes all the elements. But you can use the preserve statement to preserve some of the elements and clear an array partially. In the following example, we have an array and we have partially erased the fourth value and then re-defined the elements to 5.
And if you want to clear a dynamic array partially.
Sub myMacro2()
Dim myArray() As Long
ReDim myArray(1 To 4)
myArray(1) = 1
myArray(2) = 2
myArray(3) = 3
myArray(4) = 4
'erase position 4 but preserve the 1,2, and 3
ReDim Preserve myArray(1 To 3)
'redefine the array items to five
ReDim Preserve myArray(1 To 5)
MsgBox myArray(3)
End Sub
Important Points
- When you erase a fixed array:
- In an array that has all the values of a string, erase statement will reset all the elements to (variable length) to the zero-length string “” and (fixed length) to zero.
- In an array which has numeric values, erase statement will reset all the elements to zeros.
- In an array which as variant data type, erase statements will reset all the elements to empty.
- In an array which has objects, erase statement will reset all the elements to nothing.
- In an array which has objects, erase statement will reset all the elements if it were a separate variable.
- When you erase a dynamic array erase statement frees the space used by the dynamic array.
Массивы в VBA Excel: одномерные, многомерные и динамические. Объявление и использование массивов. Операторы Public, Dim и ReDim. Функции Array, LBound, UBound.
Массивы – это множества однотипных элементов, имеющих одно имя и отличающиеся друг от друга индексами. Они могут быть одномерными (линейными), многомерными и динамическими. Массивы в VBA Excel, как и другие переменные, объявляются с помощью операторов Dim и Public. Для изменения размерности динамических массивов используется оператор ReDim. Массивы с заранее объявленной размерностью называют статическими.
Одномерные массивы
Объявление одномерных (линейных) статических массивов в VBA Excel:
Public Massiv1(9) As Integer Dim Massiv2(1 To 9) As String |
В первом случае публичный массив содержит 10 элементов от 0 до 9 (нижний индекс по умолчанию — 0, верхний индекс — 9), а во втором случае локальный массив содержит 9 элементов от 1 до 9.
По умолчанию VBA Excel считает в массивах нижним индексом нуль, но, при желании, можно сделать нижним индексом по умолчанию единицу, добавив в самом начале модуля объявление «Option Base 1».
Многомерные массивы
Объявление многомерных статических массивов в VBA Excel аналогично объявлению одномерных массивов, но с добавлением размерностей дополнительных измерений через запятую:
‘Массив двухмерный Public Massiv1(3, 6) As Integer ‘Массив трехмерный Dim Massiv2(1 To 6, 1 To 8, 1 To 5) As String ‘Массив четырехмерный Dim Massiv3(9, 9, 9, 9) As Date |
Третий массив состоит из 10000 элементов — 10×10×10×10.
Динамические массивы
Динамические массивы в VBA Excel, в отличие от статических, объявляются без указания размерности:
Public Massiv1() As Integer Dim Massiv2() As String |
Такие массивы используются, когда заранее неизвестна размерность, которая определяется в процессе выполнения программы. Когда нужная размерность массива становится известна, она в VBA Excel переопределяется с помощью оператора ReDim:
Public Massiv1() As Integer Dim Massiv2() As String ReDim Massiv1(1 To 20) ReDim Massiv2(3, 5, 4) |
При переопределении размерности массива вместо верхнего индекса можно использовать переменную:
Dim Massiv1() as Variant, x As Integer x = 20 ReDim Massiv1(1 To x) |
Переопределять размерность динамических массивов в процессе работы программы можно неоднократно, как по количеству измерений, так и по количеству элементов в измерении.
С помощью оператора ReDim невозможно изменить обычный массив, объявленный с заранее заданной размерностью. Попытка переопределить размерность такого массива вызовет ошибку компиляции с сообщением: Array already dimensioned (Массив уже измерен).
При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения, используйте оператор Preserve:
Dim Massiv1() As String ——— операторы ——— ReDim Massiv1(5, 2, 3) ——— операторы ——— ReDim Preserve Massiv1(5, 2, 7) |
Обратите внимание!
Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.
Максимальный размер
Размер массива – это произведение длин всех его измерений. Он представляет собой общее количество элементов, содержащихся в данный момент в массиве.
По информации с сайта разработчиков, максимальный размер массивов зависит от операционной системы и доступного объема памяти. Использование массивов, размер которых превышает объем доступной оперативной памяти компьютера, приводит к снижению скорости, поскольку системе необходимо выполнять запись данных и чтение с диска.
Использование массивов
Приведу два примера, где не обойтись без массивов.
1. Как известно, функция Split возвращает одномерный массив подстрок, извлеченных из первоначальной строки с разделителями. Эти данные присваиваются заранее объявленному строковому (As String) одномерному динамическому массиву. Размерность устанавливается автоматически в зависимости от количества подстрок.
2. Данные в массивах обрабатываются значительно быстрее, чем в ячейках рабочего листа. Построчную обработку информации в таблице Excel можно наблюдать визуально по мерцаниям экрана, если его обновление (Application.ScreenUpdating) не отключено. Чтобы ускорить работу кода, можно значения из диапазона ячеек предварительно загрузить в динамический массив с помощью оператора присваивания (=). Размерность массива установится автоматически. После обработки данных в массиве кодом VBA полученные результаты выгружаются обратно на рабочий лист Excel. Обратите внимание, что загрузить значения в диапазон ячеек рабочего листа через оператор присваивания (=) можно только из двумерного массива.
Функции Array, LBound, UBound
Функция Array
Функция Array возвращает массив элементов типа Variant из первоначального списка элементов, перечисленных через запятую. Нумерация элементов в массиве начинается с нуля. Обратиться к элементу массива можно, указав в скобках его номер (индекс).
Sub Test1() Dim a() As Variant a = Array(«text», 25, «solo», 35.62, «stop») MsgBox a(0) & vbNewLine & a(1) & vbNewLine _ & a(2) & vbNewLine & a(3) & vbNewLine & a(4) End Sub |
Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения массива, извлеченные по индексу.
Функция LBound
Функция LBound возвращает значение типа Long, равное наименьшему (нижнему) доступному индексу в указанном измерении массива.
Синтаксис:
LBound (arrayname[, dimension])
- arrayname — это имя переменной массива, является обязательным аргументом;
- dimension — это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.
Наименьший индекс по-умолчанию может быть равен 0 или 1 в зависимости от настроек оператора Option Base. Нижняя граница архива, полученного с помощью функции Array, всегда равна 0.
При объявлении переменных массивов или переопределении их размерности наименьшие индексы могут быть любыми целыми числами, в том числе отрицательными.
Функция UBound
Функция UBound возвращает значение типа Long, равное наибольшему (верхнему) доступному индексу в указанном измерении массива.
Синтаксис:
UBound( arrayname[, dimension])
- arrayname — это имя переменной массива, является обязательным аргументом;
- dimension — это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.
Функция UBound используется вместе с функцией LBound для определения размера массива.
Sub Test2() Dim a(—2 To 53) As String MsgBox «Наименьший индекс = « & LBound(a) & _ vbNewLine & «Наибольший индекс = « & UBound(a) End Sub |
Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения наименьшего и наибольшего индекса переменной массива a.
Обход массива циклом
Обход одномерного массива циклом For… Next, в котором для определения границ массива используются функции UBound и LBound:
Sub Test3() Dim a() As Variant, i As Long a = Array(«text», 25, «solo», 35.62, «stop») For i = LBound(a) To UBound(a) Debug.Print «a(« & i & «) = « & a(i) Next End Sub |
Результат работы цикла вы увидите в окне Immediate.
Очистка (обнуление) массивов
Первый способ
Очистить любой массив, статический или динамический, без использования цикла можно с помощью оператора Erase. Термин «обнуление» можно применить только к массиву числового типа.
Dim Massiv1(4, 3) As String, Massiv2() As Variant ——— операторы ——— ‘переопределяем динамический массив ReDim Massiv2(2, 5, 3) ——— операторы ——— ‘очищаем массивы Erase Massiv1 Erase Massiv2 |
Обратите внимание, что оба массива при таком способе очистки будут возвращены в исходное состояние, которое они имели сразу после объявления:
- статический Massiv1 сохранит размерность (4, 3);
- динамический Massiv2 не сохранит размерность ().
Второй способ
Динамический массив можно очистить (обнулить) без использования цикла с помощью оператора ReDim. Просто переопределите его с той же размерностью.
Dim Massiv() As Double ——— операторы ——— ‘переопределяем массив ReDim Massiv(5, 6, 8) ——— операторы ——— ‘очищаем массив ReDim Massiv(5, 6, 8) |
I’m working on an Excel VBA addin that exchanges objects with a COM server, something like this:
'get an array of objects
Dim Ents() As ISomething
ComObject.GetEntities Ents
'send an array with 10 objects
ReDim Ents(9)
Set Ents(0) = ...
...
ComObject.SetEntities Ents
Getting the arrays works well: if the array contains objects it works as expected, if the array is empty then UBound(Ents) = -1
and everything works as expected.
Sending the arrays works only with not empty arrays, because I can’t Redim Ents(-1)
, and Erase
ing the array both VBA and the COM server crash: Debug.Print UBound(Ents)
crashes in VBA and who knows what crashes the server.
It looks like the Erase
statement leaves the array undefined/corrupted rather than empty.
EDIT (clarification to a comment below):
Executing this code it crashes because it can’t calculate the UBound
:
Sub Test()
Dim Ents() As ISmartId
Debug.Print UBound(Ents)
End Sub
But if you add Ents
to the watch window, then set a break point to the Debug.Print
line and execute, the debugger shows the ISmartId(0 to -1)
in the Type column. After this the execution continues without crash, and the Debug window shows the expected -1
.
It looks like the debugger was able to correctly initialize the empty array the way I need it just to show its value.
Содержание
- Оператор Erase
- Синтаксис
- Замечания
- Пример
- См. также
- Поддержка и обратная связь
- VBA Clear Array – Erase Function
- Clear Entire Array
- Resize and Clear Array
- Clear Part of an Array
- Loop Through Entire Array – Resetting Values
- VBA Coding Made Easy
- VBA Code Examples Add-in
- Массивы VBA (ч.3)
- Функции LBound, UBound
- Очистка и удаление массивов при помощи Erase
- Erase statement
- Syntax
- Remarks
- Example
- See also
- Support and feedback
- How to clear the entire array?
- 8 Answers 8
Оператор Erase
Повторно инициализирует элементы массивов фиксированного размера и освобождает место для хранения динамического массива.
Синтаксис
Очисткасписка массивов
Обязательный аргументarraylist — это одна или несколько переменных массива с разделителями-запятыми для удаления.
Замечания
Оператор удаления Erase ведет себя по-разному в зависимости от того, какой массив используется: с фиксированным размером (обычный) или динамический. Erase не освобождает память для массивов фиксированного размера. Erase задает элементы фиксированного массива следующим образом.
Тип массива | Влияние очистки на элементы фиксированного массива |
---|---|
Фиксированный числовой массив | Задает нулевое значение для каждого элемента. |
Фиксированный массив строк (переменной длины) | Задает строку нулевой длины («») для каждого элемента. |
Фиксированный массив строк (фиксированной длины) | Задает нулевое значение для каждого элемента. |
Фиксированный вариантный массив | Задает пустое значение для каждого элемента. |
Массив типов, определяемых пользователем | Задает для каждого элемента значение как для отдельной переменной. |
Массив объектов | Задает особое значение Nothing (Ничего) для каждого элемента. |
Erase освобождает память, используемую динамическими массивами. Прежде чем программа снова сможет ссылаться на динамический массив, она должна повторно объявить размеры переменной массива с помощью инструкции ReDim .
Пример
В этом примере оператор Erase используется для повторной инициализации элементов массивов фиксированного размера и отмены выделения места для хранения динамического массива.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
VBA Clear Array – Erase Function
In this Article
This tutorial will teach you how to clear an Array in VBA.
Clear Entire Array
To clear an entire array, you can use the Erase Statement:
Resize and Clear Array
If your Array is dynamic (A dynamic array is an array that can be resized, as opposed to a static array which can not be resized), you can use the ReDim Command to resize the array, clearing the entire array of values.
Clear Part of an Array
As mentioned above, the ReDim Command will resize an array, clearing all values from the array. Instead you can use ReDim Preserve to resize the array, preserving any existing values. In practice, this can be used to quickly clear part of an array.
Loop Through Entire Array – Resetting Values
Instead of clearing array values using Erase or ReDim, you could loop through the entire array, resetting each value.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
Источник
Массивы VBA (ч.3)
Функции LBound, UBound
Функции LBound, UBound возвращают нижнее и верхнее граничные значения индексов статического или динамического массива.
LBound (array_Name [, dimension])
UBound (array_Name [, dimension])
array_Name — имя массива
dimension — целое число (необязательный аргумент). Определяет измерение массива, для которого надо получить верхний или нижний предел. При отсутствии dimension возвращается предел для первого измерения массива.
Нижеприведенный листинг демонстрирует использование функций LBound, UBound:
Очистка и удаление массивов при помощи Erase
Оператор Erase позволяет выполнять очистку для статических массивов и удаление — для динамических.
Когда элементы массива заполнены, данные в массиве остаются до тех пор, пока пользователь не присвоит новые значения элементам массива или пока VBA не освободится от массива. Зачастую бывает, что в дальнейших вычислениях динамический массив ни при каких обстоятельствах использоваться не будет, поэтому нецелесообразно «держать» его в памяти компьютера, т.к. это может сказаться на скорости работы программы. Или же может понадобиться очистить все значения в статическом массиве, устанавливая числовые значения на 0, а строковые — на пустые строки. Это можно осуществить при помощи вложенных циклов — как было показано на предыдущем уроке. Но, можно сделать гораздо проще:
Данный оператор обнуляет (если массив статический) или очищает (если массив динамический) массив My_Array.
Оператор Erase удаляет из памяти динамические массивы, освобождая область памяти, ранее используемую этим массивом. При удалении динамического массива с помощью оператора Erase необходимо повторно создать массив с помощью оператора ReDim перед тем, как можно будет использовать этот определенный динамический массив снова.
Поведение оператора Erase для статических массивов зависит от конкретного типа элементов массива (см. таблицу):
Тип статического массива | Действие оператора Erase |
Любой числовой тип | Устанавливает элементы массива на 0 |
Любой строковый тип | Устанавливает элементы массива на строку нулевой длины, а для строк фиксированной длины — как все символы пробела |
Тип Variant | Устанавливает элементы массива на Empty |
Тип Object | Устанавливает элементы массива на Nothing |
Любой пользовательский тип | Устанавливает каждую переменную в пользовательском типе индивидуально: численные — на 0; строковые — на строки нулевой длины; Variant — Empty; Object — Nothing |
В начало страницы
В начало страницы
Источник
Erase statement
Reinitializes the elements of fixed-size arrays and releases dynamic-array storage space.
Syntax
Erase arraylist
The required arraylist argument is one or more comma-delimited array variables to be erased.
Erase behaves differently depending on whether an array is fixed-size (ordinary) or dynamic. Erase recovers no memory for fixed-size arrays. Erase sets the elements of a fixed array as follows:
Type of array | Effect of Erase on fixed-array elements |
---|---|
Fixed numeric array | Sets each element to zero. |
Fixed string array (variable length) | Sets each element to a zero-length string («»). |
Fixed string array (fixed length) | Sets each element to zero. |
Fixed Variant array | Sets each element to Empty. |
Array of user-defined types | Sets each element as if it were a separate variable. |
Array of objects | Sets each element to the special value Nothing. |
Erase frees the memory used by dynamic arrays. Before your program can refer to the dynamic array again, it must redeclare the array variable’s dimensions by using a ReDim statement.
Example
This example uses the Erase statement to reinitialize the elements of fixed-size arrays and deallocate dynamic-array storage space.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
How to clear the entire array?
I have an array like this:
How do I clear the entire array? What about a collection?
8 Answers 8
You can either use the Erase or ReDim statements to clear the array. Examples of each are shown in the MSDN documentation. For example:
To remove a collection, you iterate over its items and use the Remove method:
For deleting a dynamic array in VBA use the instruction Erase .
It is as simple as :
Find a better use for myself: I usually test if a variant is empty, and all of the above methods fail with the test. I found that you can actually set a variant to empty:
this way i get the behaviour i want
Then the array will be without content and can be filled again.
This will resize the array to zero and erase all data.
i fell into a case where clearing the entire array failed with dim/redim :
having 2 module-wide arrays, Private inside a userform,
One array is dynamic and uses a class module, the other is fixed and has a special type.
And i have a sub declared as public to clear those arrays (and associated run-time created controls) from inside and outside the userform like this :
Источник