Vba массивы динамические: VBA Excel. Массивы (одномерные, многомерные, динамические)
Содержание
Объявление динамических массивов. VBA для чайников
Объявление динамических массивов. VBA для чайников
ВикиЧтение
VBA для чайников
Каммингс Стив
Содержание
Создание массивов
Создание массивов
Массивом называют множество однородных предметов, образующих единое целое. Массивы программы AutoCAD – это совокупность копий одного объекта, расположенных на равном расстоянии друг от друга. Так как массивы связаны со смещением координат, они могут быть
8.1.4. Сравнение массивов
8.1.4. Сравнение массивов
При сравнении массивов возможны неожиданности — будьте осторожны!Для сравнения массивов служит метод экземпляра <=>. Он работает так же, как в других контекстах, то есть возвращает -1 (меньше), 0 (равно) или 1 (больше). Методы == и != опираются на
8.1.22. Чередование массивов
8.1.22. Чередование массивов
Предположим, что есть два массива и надо построить из них третий, который содержит массивы из двух элементов, взятых из соответственных позиций исходных массивов. В последних версиях Ruby модуль Enumerable содержит метод zip:a = [1, 2, 3, 4]b = [«a», «b», «c», «d»]с =
ГЛАВА 15. CIL и роль динамических компоновочных блоков
ГЛАВА 15. CIL и роль динамических компоновочных блоков
В этой главе ставится две задачи. В первой половине главы будет рассмотрен синтаксис и семантика языка CIL (Common Intermediate Language – общий промежуточный язык) намного более подробно, чем в предыдущих главах. Честно говоря, при
УКАЗАТЕЛИ МАССИВОВ
УКАЗАТЕЛИ МАССИВОВ
Как было сказано в гл. 9, указатели позволяют нам работать с символическими адресами. Поскольку в реализуемых аппаратно командах вычислительной машины интенсивно используются адреса, указатели предоставляют возможность применять адреса
Глава 2. Создание динамических и интерактивных пользовательских интерфейсов
Глава 2. Создание динамических и интерактивных пользовательских интерфейсов
2.0. Введение
Когда iPhone только появился на рынке, он поистине задал стандарт интерактивности в мобильных приложениях. Приложения iOS были и остаются поразительно интерактивными — вы можете на
2.4. Прикрепление нескольких динамических элементов друг к другу
2.4. Прикрепление нескольких динамических элементов друг к другу
Постановка задачи
Требуется прикреплять друг к другу динамические элементы, например виды, так, чтобы движения одного вида автоматически приводили в движение второй. В качестве альтернативы можно
Типы массивов
Типы массивов
Firebird позволяет создавать однородные массивы для большинства типов данных. Использование массива позволяет хранить множество элементов данных в виде дискретных, многомерных элементов в одном столбце. Firebird может выполнять операции над целым массивом,
Определение массивов
Определение массивов
Массив может быть определен как домен (с использованием CREATE DOMAIN) или как столбец в операторе CREATE TABLE или ALTER TABLE. Определение домена или столбца как массива похоже на определение любого другого такого объекта, здесь только добавляется указание
Создание массивов
Создание массивов
Массивом называют множество однородных предметов, образующих единое целое. Массивы программы AutoCAD – это совокупность копий одного объекта, расположенных на равном расстоянии друг от друга. Так как массивы связаны со смещением координат, они могут быть
Выработка соглашений для динамических псевдонимов
Выработка соглашений для динамических псевдонимов
Отмеченные тревожные последствия операций присваивания с участием ссылок порождают законный вопрос о целесообразности сохранения динамических псевдонимов в нашей модели вычислений.Ответ — частично теоретический и
Ревизия массивов
Ревизия массивов
Набросок библиотечного класса ARRAY дан в предыдущей лекции. Теперь мы в состоянии дать ему подходящее определение. Фундаментальное понятие массива требует задания предусловий, постусловий и инварианта.Приведем улучшенный, но все еще схематичный
Ввод и вывод двумерных массивов
Для ввода элементов двумерного массива, так же, как и одномерного, используются операторы InputBox и Cells, для вывода на печать – оператор MsgBox.
Ввод и вывод двумерного массива производится по программе, представляющей собой двойной цикл. В качестве параметров циклов используются индексные переменные, обозначающие строки и столбцы. По желанию ввод можно организовать по строкам или столбцам.
При вводе по строкам параметром внешнего цикла является индексная переменная, обозначающая номер строки, параметром внутреннего – индексная переменная, обозначающая номер столбца.
Пример 25: ввод матрицы А, содержащей n строк и m столбцов. Переменной i обозначим строки матрицы, переменной j – столбцы.
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Dim Int_Array() As Integer
n = InputBox(«Введите количество строк массива»)
m = InputBox(«Введите количество столбцов массива»)
ReDim Int_Array(n, m)
For i = 1 To n
For j = 1 To m
Int_Array(i, j) = InputBox(«Введите значение для » & «элемента_ (» & i & «,» & j & «) «, «Ввод элементов массива; строка » & i)
Next j
Next i
В этой программе для одного фиксированного значения номера строки i, осуществляется перебор всех значений индекса j, т. е. вводится строка. По окончании внутреннего цикла (по j) номер строки i увеличивается на 1 и ввод элементов производится с начального, нулевого столбца j.
В программе вместо оператора InputBox можно использовать оператор Cells. В этом случае элементы матрицы должны быть записаны по строкам в рабочем листе Excel. Возможен способ ввода, когда элемент массива вычисляется по какой-либо формуле, где в качестве ее параметров могут присутствовать номера строк и номера столбцов.
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Dim Int_Array() As Integer
n = InputBox(«Введите количество строк массива»)
m = InputBox(«Введите количество столбцов массива»)
ReDim Int_Array(n, m)
For i = 1 To n
For j = 1 To m
Int_Array(i, j) = Cells (i,j)
Next j
Next i
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Dim Int_Array() As Integer
n = InputBox(«Введите количество строк массива»)
m = InputBox(«Введите количество столбцов массива»)
ReDim Int_Array(n, m)
For i = 1 To n
For j = 1 To m
Int_Array(i, j) =. ..
Next j
Next i
При вводе элементов двумерного массива по столбцам параметром внешнего цикла выбирается номер столбца j, параметром внутреннего – строки i.
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Dim Int_Array() As Integer
n = InputBox(«Введите количество строк массива»)
m = InputBox(«Введите количество столбцов массива»)
ReDim Int_Array(n, m)
For j = 1 To m
For i = 1 To n
Int_Array(i, j) = InputBox(«Введите значение для » & «элемента_ (» & i & «,» & j & «) «, «Ввод элементов массива; строка » & i)
Next i
Next j
Как видно из обеих программ, по количеству операторов оба способа равноценны, однако следует помнить, что быстрее выполняются двойные циклы, в которых параметр внутреннего цикла имеет большее количество шагов. В оперативной памяти элементы двумерных массивов располагаются всегда по столбцам вне зависимости от способа ввода.
Алгоритмы вывода матрицы на печать аналогичны приведенным выше.
str_msg = «»
For i = 1 To n
For j = 1 To m
str_msg = str_msg & Int_Array(i, j) & «, «
Next j
str_msg = str_msg & Chr(13) ‘перевод строки
Next i
MsgBox «Введено: » & Chr(13) & str_msg,, » Вывод ранее введенного массива»
По этой программе элементы каждой строки будут выведены в диалоговое окно. Строка
str_msg = str_msg & Chr(13)
подготавливает печать каждой новой строки матрицы на очередной строчке диалогового окна (выполняет функцию «перевода каретки» как только напечатается очередная строка).
Пример 26. Ввод-вывод двумерного массива
Sub DemoStatArray()
Dim str_msg As String
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Dim Int_Array() As Integer
n = InputBox(«Введите количество строк массива»)
m = InputBox(«Введите количество столбцов массива»)
ReDim Int_Array(n, m)
For i = 1 To n
For j = 1 To m
Int_Array(i, j) = InputBox(«Введите значение для » & «элемента_ (» & i & «,» & j & «) «, «Ввод элементов массива; строка » & i)
Next j
Next i
str_msg = «»
For i = 1 To n
For j = 1 To m
str_msg = str_msg & Int_Array(i, j) & «, «
Next j
str_msg = str_msg & Chr(13) ‘перевод строки
Next i
MsgBox «Введено: » & Chr(13) & str_msg,, «Вывод ранее введенного массива «
End Sub
9. 12.8. Использование ReDim с динамическими массивами
Иногда могут сложиться обстоятельства, при которых точно неизвестно, сколько элементов потребуется в массиве. В VBA имеется возможность переопределять размерность массивов, а во время объявления не указывать размерность. Используя динамический массив, можно создавать массив такой большой или такой маленький, какой необходимо. Динамические массивы создаются с помощью оператора Dim, затем их размер устанавливается с помощью оператора ReDim во время выполнения процедуры.
Оператор R eDim имеет следующий синтаксис:
ReDim [Preserve] varname (subscripts) [As type] [varname_
(subscripts) [As type]]
Необязательное ключевое слово Preserve указывает VBA сохранять данные в имеющемся массиве, когда изменяется размер массива с помощью ReDim; varname – имя массива; subscripts – это новый размер массива; type – тип элементов массива. Необходимо использовать отдельный оператор As type для каждого массива, который определяется.
Dim aMonth() As String
ReDim aMonth(1 To 30) ReDim aMonth(31) ReDim Preserve aMonth(1 To 31) Dim Table()As Integer ReDim Table (3, 15) ReDim Table(4, 20) ReDim Preserve Table(4, 25) Dim Mas as Variant ReDim Mas(20) As Integer | ‘объявляет динамический массив aMonth
‘изменяет размер массива до 30 элементов ‘изменяет размер массива до 31 элемента ‘изменяет размер массива до 31 элемента, сохраняя содержимое массива ‘объявляет динамический массив ‘делает массив двумерным ‘изменяет размер двумерного массива ‘только изменяет последний размер массива ‘объявляет переменную типа Variant ‘создает массив 20 целых в Variant |
Важные моменты:
1. Можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserve;
2. Можно использовать ReDim для создания типизированного массива внутри переменной типа Variant; так как переменные типа Variant могут содержать данные любого типа, можно использовать переменную типа Variant для сохранения динамического массива. (Использование переменной типа Variant для сохранения динамического массива дает возможность изменять размер массива с помощью ReDim и изменять тип данных массива.)
Обычно оператор ReDim используется для изменения размера динамического массива, который уже был объявлен ранее с помощью операторов Dim. Можно использовать оператор ReDim для изменения числа элементов и измерений в динамическом массиве столько раз, сколько необходимо. Однако нельзя использовать оператор ReDim для изменения типа данных массива, если только массив не содержится в переменной типа Variant или сами элементы массива не имеют тип Variant. Если динамический массив сохраняется в переменной типа Variant, можно изменять тип данных, используя оператор As type в операторе ReDim.
Пример 27. Программа заполняет массив до тех пор, пока не будет введена пустая строка. При заполнении массива размерность массива увеличивается. При этом сохраняются предыдущие значения массива и очередному (новому) элементу присваивается введенное значение.
Option Base 1
Sub DemoDinArray()
Dim Int_Array() As Integer
Dim str_msg As String, i As Integer
Dim Num
str_msg = » «
i = 0
Do
i = i + 1
Num = InputBox(«Введите целое число для » & i & «-го элемента массива», «Ввод элементов массива»)
If Len(Num) = 0 Then Exit Do ‘ выход из цикла
‘ изменение размера массива с сохранением элементов
ReDim Preserve Int_Array(i)
‘ввод данных в i-й элемент’ массива
Int_Array(i) = Num
Loop
For j = 1 To i — 1
str_msg = str_msg & Int_Array(j) & «, «
Next j
MsgBox «Введено: » & str_msg,, «Вывод ра нее введенного массива»
End Sub
Пример 28. В первой части процедуры DemoDinArray в динамический массив Int_Array записывается первая строка будущего многомерного массива и определяется его вторая (количество столбцов) размерность. Как только пользователь во время ввода первой строки отказался от ввода, формирование первой строки заканчивается. В этот момент программе известна вторая размерность будущего двумерного массива: m=i-1. Функция MsgBox запрашивает ввести первую размерность массива Int_Array. Далее объявляется этот двумерный массив. Далее данные из одномерного массива Int_Arrayl переписываются в первую строку двумерного массива Int_Array/
Option Base 1
Sub DemoDinArray2()
Dim Int_Arrayl() As Integer
Dim str_msg As String
Dim i As Integer, m As Integer, n As Integer
Dim Num
str_msg = «»
i = 0
Do
i = i + 1
Num = InputBox(«Введите целое число для » & i & «-го элемента массива», «Ввод элементов массива»)
If Len(Num) = 0 Then Exit Do ‘ выход из цикла
ReDim Preserve Int_Arrayl(i) ‘изменение размера массива с сохранением элементов
Int_Arrayl(i) = CStr(Num) ‘ввод данных в i-й элемент массива
Loop
m = i — 1 ‘вторая размерность массива
n = InputBox(«Введите количество строк массива «)
ReDim Int_Array(n, m)
‘ запись в выходной массив уже введенной строки
For j = 1 To m
Int_Array(1, j) = Int_Arrayl(j)
Next j
‘теперь работаем с обычным двумерным массивом,
‘только первую строку не заполняем:
For i = 2 To n
For j = 1 To m
Int_Array(i, j) = InputBox(«Введите целое число для » & » элемента (» & i & «,» & j & «)», «Ввод элементов массива; строка » & i)
Next j
Next i
‘подготовка строки выдачи
For i = 1 To n
For j = 1 To m
str_msg = str_msg & Int_Array(i, j) & «, «
Next j
str_msg = str_msg & Chr(13) ‘ перевод строки
Next i
MsgBox «Введено: » & Chr(13) & str_msg,, «Вывод ранее введенного массива»
End Sub
|
Дата добавления: 2014-01-04; Просмотров: 2792; Нарушение авторских прав?; Мы поможем в написании вашей работы!
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
Добавление динамического массива в VBA
спросил
Изменено
1 месяц назад
Просмотрено
78 тысяч раз
Я перебираю именованный диапазон и добавляю массив в зависимости от того, пуста ячейка или нет. Я не слишком знаком с массивами в VBA, поэтому, возможно, моя логика неверна. Код продолжает перезаписывать 1-й элемент в массиве, и он никогда не увеличивается. Я не уверен, почему UBound(myArray) всегда остается равным 0 даже после того, как элементу был присвоен 1-й индекс.0005
Мой код выглядит примерно так:
Dim myArray() As Double ReDim Сохранить мой массив (0) Для каждой ячейки в [myRange] Если ячейка <> "" Тогда Если UBound(myArray) > 0 Тогда ReDim Preserve myArray (от 0 до UBound (myArray) + 1) Конец, если мой массив (UBound (мой массив)) = ячейка. значение Конец, если Следующий
- vba
- динамические массивы
0
Используйте переменную и увеличивайте ее, не имеет значения, если переменная больше, чем ubound, когда код завершается:
Sub Test() Dim myArray() как двойной, X как длинный Х = 0 ReDim сохранить мой массив (X) Для каждой ячейки в диапазоне («Привет») Если ячейка <> "" Тогда ReDim сохранить мой массив (от 0 до X) myArray(X) = ячейка.Значение Х = Х + 1 Конец, если Следующий Конец сабвуфера
2
Изменить Если UBound(myArray) > 0, то 9От 0032 до
Если UBound(myArray) >= 0, тогда
решит проблему.
Подтест() Dim myArray() как двойной ReDim Сохранить мой массив (0) Для каждой ячейки в диапазоне («Привет») Если ячейка <> "" Тогда Если UBound(myArray) >= 0 Тогда мой массив (UBound (мой массив)) = ячейка. Значение ReDim Preserve myArray (от 0 до UBound (myArray) + 1) Конец, если Конец, если Следующий Конец сабвуфера
6
Расширяя решение Дэна Донохью, чтобы избежать чрезмерного повторного расчета (и чрезмерного пересчета в случае решения Жанно за счет использования переменных), я бы использовал
Dim rng как диапазон Установить rng = Range("Привет") Dim myArray() как Double, X как Long, N как Long Х = 0 N = WorksheetFunction.CountIf(rng, "<>") ReDim сохранить мой массив (X) Для каждой ячейки в rng Если ячейка <> "" И X < N Тогда myArray(X) = ячейка.Значение Х = Х + 1 Если X < N, то ReDim сохранит myArray (от 0 до X) Конец, если Следующий
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
vba — динамический массив динамических массивов
Задавать вопрос
спросил
Изменено
7 лет, 6 месяцев назад
Просмотрено
408 раз
Я нигде не могу найти решение этой проблемы.
Мне нужно объявить кучу динамических массивов следующим образом:
Dim list1 () как вариант Dim list2() как вариант Dim list3() как вариант ... Dim listN() как вариант
Каждый список представляет собой одномерный динамический массив. Тем не менее, я не знаю, что будет "N" во время программы. Я также хочу сделать эти списки "N" динамическими. Я пробовал двумерные динамические массивы. Но оператор «redim» требует, чтобы оба измерения были объявлены одновременно. В частности, я делаю это:
Dim BigList() как вариант ... Redim BigList(listNum, listLength)
Чтобы получить доступ/перейти в подпрограмму "list1", "list2" , "list3"..., вызов "BigList(1)", "BigList(2)" дает мне ошибку. В частности, где-то в моем коде есть эта часть:
sub ProcessList (byref listToProcess() как вариант) ... конец суб суб основной () ... вызов списка процессов (список1) вызов списка процессов (список2) ... вызов списка процессов (списокN) конец суб Теперь я могу сделать цикл: для i = от 1 до N Вызов ProcessList(список "i") следующий я
Для этого требуется, чтобы list"i" был одномерным динамическим массивом. Итак, после redim BigList(listNum,listLength) и я делаю это:
для i = 1 до N Call ProcessList(BigList(i)) 'я ссылаюсь на listNum следующий я
Это дает мне ошибку "Несовместимый тип".
- массивы
- vba
8
Вот один из примеров создания словаря
, который содержит целочисленные значения (т. е. N
) и каждое значение изначально является пустым массивом.
Затем вы можете использовать что-то вроде функции ExtendList
для изменения размера этих пустых массивов по мере необходимости.
Sub foo() Dim BigList как объект Dim N As Long Dim v как вариант 'Создать пустой объект словаря Установите BigList = CreateObject("Scripting.Dictionary") 'Добавить в словарь N пустых массивов: Н = 3 Для i = 1 до N Большой список (я) = Массив () Следующий 'Измените размер одного из элементов в вашем BigList Большой список (2) = Расширить список (большой список (2), 1, 10) v = BigList(2) 'Здесь вы можете просмотреть v в окне Locals и увидеть, что это массив размером 1 x 10 Конец сабвуфера Функция ExtendList(lst, a As Long, b As Long) ReDim lst(a, b) Расширенный список = список Конечная функция
При рассмотрении вашего отредактированного вопроса я думаю, что вы просто неправильно поняли, как работает оператор ReDim
:
Redim BigList(listNum, listLength)
Изменяет размеры BigList
на основе параметров listNum
и listLength
. Он делает , а не (как вы, возможно, ожидали), создает список массивов внутри BigList
.
Я думаю, что это тоже может работать (не проверено, и помните, что массивы имеют нулевой индекс):
ReDim Preserve BigList(listNum) Большой список (номер списка) = Массив () ReDim BigList (listNum) (listSize)
2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.