Vba массив массивов: Массив в массиве vba — CodeRoad

Содержание

Массив в массиве vba — CodeRoad



я должен создать массив в массиве

вот мой код:

Dim servers(2) As String
Dim parameters(3) As String
Dim i, j As Integer

parameters(0) = "db1"
parameters(1) = "server1"
parameters(2) = "user1"
parameters(3) = "password1"

For i = 0 To 2
    For j = 0 To 3
       servers(i) = parameters(j)
    Next j
Next i

Я сделал графический пример с результатом и действительно не знаю как это сделать: https://i.stack.imgur.com/1uSme.png

arrays vba
Поделиться Источник Alessandro95     19 апреля 2017 в 12:30

3 ответа


  • Массив из 600 + строк в excel VBA

    Я делаю цикл для каждой строки в массиве таким образом, что filename = Array(file1,file2…..file600) Однако VBA получает ошибку компиляции, которая вызвана тем, что массив занимает 8 строк. Насколько мне известно, он допускает только 1 строку (ошибка говорит, что ожидаемый список или разделитель)…

  • Добавление значений строк в массив: VBA

    Я строю генетический алгоритм в VBA, и моя функция пригодности зависит от того, сколько единиц имеет строка массива. Массив представляет собой комбинацию 1 и 0. Массив может быть любого размера (2D), и мне нужно добавить число 1 в строке и сравнить его с rest значениями. Я рассматривал возможность…



4

Похоже, что определенный пользователем тип может вам помочь:

Type tServerData
    DBname As String
    ServerID As String
    UserName As String
    Password As String
End Type

Dim ServerData(0 To 2) As tServerData

Теперь у вас есть arrray для 3 серверов, например:

ServerData(0).DBname= "db1"

и т.д.

Поделиться Paul Ogilvie     19 апреля 2017 в 12:40



1

На самом деле вам нужен массив 2-D для заполнения вашего servers, попробуйте следующий код:

Option Explicit

Sub x()

Dim servers(2, 3) As String
Dim parameters() As Variant
Dim i As Long, j As Long

parameters = Array("db", "server", "user", "password")

For i = 0 To 2
    For j = LBound(parameters) To UBound(parameters)
       servers(i, j) = parameters(j) & i + 1
    Next j
Next i

End Sub

Поделиться Shai Rado     19 апреля 2017 в 12:39



0

Попробуйте использовать двумерный массив:

Dim parameters(10,10) As String

parameters(1,1) = "db1"
parameters(1,2) = "server1"
. ..
parameters(2,1) = "db2"
parameters(2,2) = "server2"
...

Поделиться David G     19 апреля 2017 в 12:38


  • Получение индекса элемента в массиве VBA

    Я пытаюсь получить индекс элемента в массиве VBA, но у меня есть проблема с его получением. Const NoOfVol As Integer = 5 Dim vol(NoOfVol) As Integer For Index = 1 To NoOfVol vol(Index) = Cells(15 + Index, 8).Value Next Массив выглядит следующим образом: (-2500,-1250,0,1250,2500). Я вызываю функцию…

  • Как хранить имена массивов в массиве в VBA

    У меня есть список массивов. Я перебираю циклы, чтобы записать данные в массивы в текстовый файл. Когда я перебираю каждый раз, я хотел бы использовать другой массив для доступа к данным. Я думаю о том, чтобы хранить имена этих массивов в другом массиве, и по мере прохождения цикла я могу получить…


Похожие вопросы:


Возвращаемый индекс элемента в массиве Excel VBA

У меня есть массив prLst, который представляет собой список целых чисел. Целые числа не сортируются, поскольку их положение в массиве представляет определенный столбец в электронной таблице. Я хочу…


Преобразование массива VBA в массив «column»

Как мне теперь известно, массив в Excel имеет два вида представления : {1,2,3,4} also known as one-dimensional horizontal array и {1;2;3;4} also known as one-dimensional vertical array Я создал…


Хранить VBA вычислять значения в массиве

Уважаемые эксперты, я хочу сохранить каждое значение в массиве VBA, который вычисляется циклом VBA. после завершения цикла я хотел бы использовать этот массив VBA для моего дальнейшего примера…


Массив из 600 + строк в excel VBA

Я делаю цикл для каждой строки в массиве таким образом, что filename = Array(file1,file2. ….file600) Однако VBA получает ошибку компиляции, которая вызвана тем, что массив занимает 8 строк….


Добавление значений строк в массив: VBA

Я строю генетический алгоритм в VBA, и моя функция пригодности зависит от того, сколько единиц имеет строка массива. Массив представляет собой комбинацию 1 и 0. Массив может быть любого размера…


Получение индекса элемента в массиве VBA

Я пытаюсь получить индекс элемента в массиве VBA, но у меня есть проблема с его получением. Const NoOfVol As Integer = 5 Dim vol(NoOfVol) As Integer For Index = 1 To NoOfVol vol(Index) = Cells(15 +…


Как хранить имена массивов в массиве в VBA

У меня есть список массивов. Я перебираю циклы, чтобы записать данные в массивы в текстовый файл. Когда я перебираю каждый раз, я хотел бы использовать другой массив для доступа к данным. Я думаю о…


VBA: массив & СЧЕТЕСЛИ

Все, Я изо всех сил пытаюсь найти подход к следующему случаю в Excel VBA: Из разных листов я создал массив в VBA (4 столбца: ключ, тип, дата действия A, дата действия B), например: Я решил не…


Найти среднее значение значений в массиве (Excel VBA)

Как найти среднее значение значений, содержащихся в массиве 2D в excel VBA? У меня есть массив с именем Numbers, который имеет значения 1,2,3,4,6 как мне ввести среднее значение в значение с именем…


Хранить элемент из excel в массив VBA

У меня есть некоторые данные в терминах столбца, которые я хочу сохранить в массиве с помощью VBA. После его сохранения я буду ссылаться на элемент в массиве и делать сравнение. Dim tRange As Range…

Обработка массивов — VBA

В повседневной жизни часто приходится встречаться с информацией, представленной в табличном виде. Для обработки можно использовать электронные таблицы, а также VBA.

Массив – это структурированный тип данных, конечная упорядоченная совокупность данных одного типа, доступ к которым осуществляется по индексу (порядковому номеру). Массивы необходимы, когда требуется несколько раз обращаться к одной и той же группе однотипных данных.

Данные в массивах

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

Использование массивов значительно упрощает работу с группами однотипных данных.

Все действия с массивами выполняются поэлементно, в цикле. Поскольку массив — это последовательность с известным числом элементов, удобнее использовать цикл For.

Пример 1

Пример. Вычислить средний рост по данным, записанным в электронной таблице.

Результат вычисления среднего роста будут записаны в ячейку B9.

Решение.

Sub средний_рост()
Dim Rost(6) As Double
Dim i As Integer
Dim Сумма, Среднее As Double
 
' ввод таблицы для обработки
For i = 1 To 6
Rost(i) = Cells(1 + i, 2).Value
Next i
 
' нахождение суммы чисел в таблице
Сумма = 0
For i = 1 To 6
Сумма = Сумма + Rost(i)
Next i
 
' вычисление среднего
Среднее = Сумма / 6
 
'вывод
Cells(9, 2).Value = Среднее
MsgBox (Среднее)
End Sub

Пояснение решения.

В строке Dim Rost(6) As Doubl объявляется массив чисел двойной точности именем Rost размерностью 6, то есть одномерная таблица Rost емкостью 6 (шесть) ячеек.

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

Пример 2

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

Решение.

Sub simetria()
Const n = 4
Dim i, j
Dim x(n, n)
Dim t, check As Boolean
For i = 1 To n
For j = 1 To n
x(i, j) = Cells(i, j)
Next
Next
t = True 'предположим, что матрица симметрична
i = 2
While t And (i < n)
j = 1
While (j < i) And (x(i, j) = x(j, i))
j = j + 1
Wend
t = (j = i)
i = i + 1
Wend
check = t
MsgBox check
End Sub

arrays — Объединение двух массивов в VBA?

Как мне объединить эти массивы с результатами (2, 4, 5, 3, 7, 6)?

array1 = Array(4,5,3,7,6)

array2 = Array(2)

3

attemptingpython 11 Дек 2018 в 18:41

3 ответа

Лучший ответ

Вы могли бы потенциально Join() и объединить ваши два массива, а затем Split() результат обратно в новый массив:

array3 = Split(Join(array2, ",") & "," & Join(array1, ","), ",")

Объяснение :
Join() вернет строку, в которой каждый элемент массива (первый параметр) разделен

"," (вторым параметром). Мы объединяем эти два объединенных массива еще с одной запятой, чтобы получить строку типа 2,4,5,3,7,6. Затем мы используем Split(), чтобы превратить эту строку обратно в массив, сообщающий Split(), что разделитель является запятой ",".

6

JNevill 11 Дек 2018 в 15:59

Вы можете использовать arrayLists. Это также обеспечивает легкую сортировку, если требуется.

Option Explicit
Public Sub test()
    Dim list1 As Object, list2 As Object

    Set list1 = CreateObject("System.Collections.Arraylist")
    Set list2 = CreateObject("System.Collections.Arraylist")
    list1.Add 4
    list1.Add 5
    list1.Add 3
    list1.Add 7
    list1.Add 6
    list2.Add 2
    list1.addRange list2
    list1.Sort
End Sub

4

QHarr 11 Дек 2018 в 15:56

Поздно на вечеринку, но я также добавлю свои два цента

Вы можете просто скопировать один из двух массивов в новый массив. Затем Redim Preserve это размер двух исходных массивов, чтобы затем зациклить только первый массив. Следующий код является базовым, но выполняет работу быстро, без преобразования какого-либо типа данных:

Sub Test()

Dim arr1 As Variant: arr1 = Array(4, 5, 3, 7, 6)
Dim arr2 As Variant: arr2 = Array(2)
Dim arr3 As Variant: arr3 = arr2

ReDim Preserve arr3(UBound(arr1) + Ubound(arr2) + 1)
For x = (UBound(arr3) - UBound(arr1)) To UBound(arr3)
    arr3(x) = arr1(x - UBound(arr2) - 1)
Next x

End Sub

Чтобы продемонстрировать возврат различных Data Type с использованием некоторых Type преобразований:

Sub Test()

Dim arr1 As Variant: arr1 = Array(CDbl(4), CLng(5), CStr(3), CDate(7), CCur(6))
Dim arr2 As Variant: arr2 = Array(2)
Dim arr3 As Variant: arr3 = arr2

ReDim Preserve arr3(UBound(arr1) + Ubound(arr2) + 1)
For x = (UBound(arr3) - UBound(arr1)) To UBound(arr3)
    arr3(x) = arr1(x - UBound(arr2) - 1)
Next x

End Sub

1

JvdV 6 Фев 2020 в 21:13

Тема: Массивы в vba — Контрольные вопросы

Практическая работа

Тема: Массивы в VBA

Цель: Освоить технологию обработки массивов в VBA

Задачи

  1. Изучение теоретического материала

  2. Привитие навыков самостоятельной работы с электронными материалами

Задания

  1. Изучить предложенный материал

  2. Разобрать и проверить примеры

  3. Ответить в конспекте на контрольные вопросы

  4. Выполнить индивидуальные задания

Контрольные вопросы

  1. Что такое сортировка массива? Для чего она производится?

  2. Каким образом производится удаление элементов массива?

  3. Каким образом производится вставка элементов массива?

Массивы

Часто бывает необходимо работать с некоторым набором однотипных данных как с единым целым. j)

Объявление массива

Как и обычные переменные, массивы должны быть объявлены. Описание массива выглядит следующим образом:

Dim Имя массива (Размерность массива) As Тип элементов.

Пример

Dim A (100) As Integer

Dim B (50) As Byte

Dim С (40) As Double

При таком описании массива его элементы индексируются (т.е. нумеруются), начиная с нуля.

Если оператор описания будет выглядеть следующим образом:

Dim A (1 To 100) As Integer,

то элементы массива индексируются с единицы.

Заполнение массива может происходить:

  • с клавиатуры

  • по некоторому алгоритму

  • случайными значениями при помощи генератора случайных чисел, который инициализируется инструкцией Randomize без аргумента, и активизируется функцией Rnd, возвращающей вещественное значение из диапазона [0;1).

Пример

Randomize

For i = 1 To 10

A(i) = Int(Rnd * 101) – 50 ‘заполнение массива целыми числами [-50;50]

Next i

Сортировка элементов одномерного массива методом “пузырька”

Рассмотрим одномерный массив А:

– 4 6 – 2 10

Нужно расставить элементы этого массива по убыванию.

Метод “пузырька” заключается в том, что сравниваются два соседних элемента массива и, если первый из них меньше второго, то их переставляют местами (сортировка по убыванию).

I просмотр


– 4 6 – 2 10


6 – 4 – 2 10


6 – 2 – 4 10

6 – 2 10 – 4

II просмотр

6 – 2 10 – 4

6 10 – 2 – 4

III просмотр

6 10 – 2 – 4

10 6 – 2 – 4

Для получения данного результата необходимо отладить следующую программу.

Option Explicit

Sub PR19()

Dim A(30) As Integer

Dim N As Integer

Dim I As Integer

Dim K As Integer

Dim R As Integer

N = Val(InputBox(«Введите N»))

For I = 1 To N

Cells(1,I) = Int(Rnd * 100 – 50) ‘ Заполнение ячеек рабочего листа

‘ случайными числами

A(I) = Cells(1,I) ‘ Заполнение массива

Next I

‘ Сортировка массива

For K = 1 To N–1

For I = 1 To N–K

If A(I)

R = A(I) ‘ Перестановка элементов

A(I) = A(I+1)

A(I+1) = R

End If

Next I

Next K

‘ Распечатка полученного массива на рабочем листе Excel

Cells(3,3) = «Упорядоченный массив»

For I = 1 To N

Cells(5,I) = A(I)

Next I

End Sub

Самостоятельная работа № 10

В 1

  1. Упорядочить элементы массива по возрастанию и вычислить сумму первого и последнего элементов.

  2. Упорядочить элементы массива по убыванию и переставить местами первый и последний элементы.

В 2

  1. Упорядочить элементы массива по возрастанию и найти максимальный из двух первых элементов.

  2. Упорядочить элементы массива по убыванию и вычислить произведение первого и последнего элементов.

В 3

  1. Упорядочить элементы массива по возрастанию и вычислить сумму первых трех элементов.

  2. Упорядочить элементы массива по убыванию и переставить местами второй и предпоследний элементы.

В 4

  1. Упорядочить элементы массива по возрастанию и вычислить минимальный из четных элементов.

  2. Упорядочить элементы массива по убыванию и найти произведение первого и третьего элементов.

В 5

  1. Упорядочить элементы массива по возрастанию и найти сумму первого и четвертого элементов.

  2. Упорядочить элементы массива по убыванию и поменять местами первый и пятый элементы.

В 6

  1. Упорядочить элементы массива по возрастанию и найти максимальный элемент в первой половине массива.

  2. Упорядочить элементы массива по убыванию и найти произведение последних двух элементов.

В 7

  1. Упорядочить элементы массива по возрастанию и поменять местами второй и последний элементы.

  2. Упорядочить элементы массива по убыванию и найти минимальный из первого и пятого элементов.

В 8

  1. Упорядочить элементы массива по возрастанию и найти сумму положительных элементов.

  2. Упорядочить элементы массива по убыванию и переставить местами второй и минимальный элемент.

В 9

  1. Упорядочить элементы массива по возрастанию и найти сумму второго и пятого элементов.

  2. Упорядочить первую половину массива по убыванию и переставить первый и последний элементы.

В 10

  1. Упорядочить вторую половину массива по возрастанию и найти произведение первого и шестого элементов.

  2. Упорядочить элементы массива по убыванию и поменять местами максимальный и минимальный элементы.

Самостоятельная работа № 11

В 1

Задан целочисленный массив А(10). Упорядочить по убыванию четные элементы.

В 2

Задан целочисленный массив А(10). Упорядочить по возрастанию нечетные элементы.

В 3

Задан целочисленный массив А(10). Упорядочить по убыванию элементы массива, кратные 7.

В 4

Задан целочисленный массив А(10). Упорядочить по убыванию положительные элементы.

В 5

Задан целочисленный массив А(10). Упорядочить по возрастанию те элементы массива, которые стоят на четных местах.

В 6

Задан целочисленный массив А(10). Упорядочить по возрастанию те элементы массива, которые стоят на нечетных местах.

В 7

Задан целочисленный массив А(10). Упорядочить элементы, стоящие на четных местах, по возрастанию, а стоящие на нечетных местах, по убыванию.

В 8

Задан целочисленный массив А(10). Упорядочить положительные элементы по возрастанию, а отрицательные по убыванию.

В 9

Задан целочисленный массив А(10). Упорядочить элементы, кратные 3, по убыванию, а некратные 3 по возрастанию.

В 10

Задан целочисленный массив А(10). Упорядочить по возрастанию элементы кратные 5.

В 11

Задан целочисленный массив А(10). Упорядочить по убыванию элементы, принадлежащие интервалу (–2; 12).

Удаление одного или группы элементов из одномерного массива

Удаление одного элемента из одномерного массива происходит по следующей схеме:

  1. указывается или ищется порядковый номер элемента, который необходимо удалить из массива;

  2. все элементы, стоящие за удаляемым элементом сдвигаются на одну позицию влево;

  3. количество элементов уменьшается на единицу.

Удаление одного элемента из одномерного массива

Пример 1

Дан массив Х = (– 4 8 – 6 5 8 4).

Удалить из массива элемент, стоящий на третьем месте.

Фрагмент программного кода, в котором удаляется третий элемент массива Х, выглядит следующим образом:

k = 3

For i = k To N – 1 ‘ начиная с k-го и до предпоследнего элемента

X(i) = X(i + 1) ‘ сдвигаем элементы массива влево

Next i

N = N – 1 ‘уменьшаем длину массива на 1

Пример 2

Сформировать одномерный массив из случайных чисел. Удалить из массива минимальный и максимальный элементы.

Программный код

Sub PR20()

Dim x(40) As Integer

Dim n As Integer

Dim i As Integer

Dim Min As Integer, Max As Integer

Dim IMin As Integer, IMax As Integer

n = Val(InputBox(«Введите число элементов N»))

Label1.caption = «Исходный массив»

For i = 1 To n

x(i) = Int(Rnd * 100) – 50

ListBox1.AddItem Str(x(i))

Next i

‘ Поиск минимального и максимального элементов

Min = x(1): Max = x(1)

For i = 2 To n

If x(i)

If x(i) > Max Then Max = x(i): IMax = i

Next i

MsgBox()

‘ Удаление минимального элемента

For i = IMin To n – 1

x(i) = x(i + 1)

Next i

n = n – 1

‘ если максимальный элемент стоял правее минимального, то он

‘ сдвигается влево на одну позицию

If IMax > IMin Then IMax = IMax – 1

‘ Удаление максимального элемента

For i = IMax To n – 1

x(i) = x(i + 1)

Next i

n = n – 1

Label2.caption = «Полученный массив»

For i = 1 To n

ListBox2.AddItem Str(x(i))

Next i

End Sub

Удаление из массива группы элементов

Пример

Задан одномерный массив 6 – 4 – 9 9 2 7 4 8. Удалить из него все элементы, кратные 3.

I удаление 6 – 4 – 9 9 27 4 8

результат – 4 – 9 9 27 4 8

II удаление – 4 – 9 9 27 4 8

результат – 4 9 27 4 8

III удаление – 4 9 27 4 8

результат – 4 27 4 8

IV удаление – 4 27 4 8

результат – 4 4 8

Для реализации данного алгоритма воспользуемся следующим фрагментом программы.

i = 1

While i

If x(i) Mod 3 = 0 Then

For j = i To n – 1

x(j) = x(j + 1)

Next j

n = n – 1

Else

i = i + 1

End If

Wend

Вставка одного элемента в массив

При вставке одного элемента в массив необходимо сначала освободить место для вставляемого элемента, т.е. “раздвинуть” элементы, а затем вставить новый элемент в массив.

Вставка группы элементов в массив

Пример

В одномерный массив перед каждым числом 0 вставить сумму всех элементов массива.

Фрагмент программы, в котором происходит вставка элементов, выглядит следующим образом:

i = 1

While i

If x(i) = 0 Then

For j = n + 1 To i + 1 Step -1

x(j) = x(j – 1)

Next j

x(i) = s

n = n + 1

i = i + 2

Else

i = i + 1

End If

Wend

Практическая работа № 12

В 1

  1. Удалить последний четный элемент массива.

  2. Вставить 2 перед каждым элементом большим заданного числа В.

В 2

  1. Удалить все элементы кратные 3.

  2. Вставить 3 перед каждым элементом большим заданного числа В.

В 3

  1. Удалить все нечетные элементы.

  2. Вставить заданное число В после каждого элемента, меньшего В.

В 4

  1. Удалить первый элемент кратный 5.

  2. Вставить заданное число В, после первого отрицательного элемента массива.

В 5

  1. Удалить все отрицательные элементы массива.

  2. Вставить3 после max и перед max элементом массива.

В 6

  1. Удалить первый отрицательный элемент массива.

  2. Вставить 100 перед 5 элементом массива

В 7

  1. Удалить последний элементы массива больше заданного числа С.

  2. Вставить перед каждым отрицательным элементом массива заданное число В.

В 8

  1. Удалить все элементы массива, которые больше заданного числа.

  2. Вставить заданное число B, после первого четного числа в массиве.

В 9

  1. Удалить все четные элементы массива.

  2. Вставить перед последним отрицательным элементом массива число В.

В 10

  1. Удалить последний нечетный элемент массива.

  2. Вставить перед последним отрицательным элементом массива число В.

В 11

  1. Удалить все четные отрицательные элементы.

  2. Вставить число А, перед каждым отрицательным элементом кратным Д, а число В после каждого положительного элемента, кратного Д.

В 12

  1. Удалить первый положительный четный элемент.

  2. Вставить 1 после всех элементов, больших P.

Статические и динамические массивы в VBA

Что такое массив? 

Массив это набор элементов одинакового типа, которые имеют общее имя. А обращение к этим элементам происходит по их индексу. Проще говоря, это множество переменных собранных в одну группу по определенному типу. Для более ясного понимания возьмем, например, жемчужные бусы, одни черного цвета, другие белого. Так вот, бусы черного и белого цвета это массивы жемчужин, сгруппированные по цвету, черный и белый, а жемчужины являются элементами этих массивов.
Массивы бывают одномерными (линейными), те же вышеупомянутые бусы и многомерными — двумерные(матрицы, 2D), трехмерные и т.д. Статические — кол-во элементов массива объявляется на этапе разработки и не изменяется в процессе выполнения программы, и динамические — число элементов и размерность изменяется в процессе работы программы.

Объявление статических массивов в VBA

Массив в VB объявляется как обычная переменная, после ключевого слова Dim или Public, с той лишь разницей, что после имени переменной (перед ключевым словом «As«) должны быть скобки.
Dim Mas () as integer

Статические массивы объявляются с указанием верхней и нижней границы:
Dim Mas (2 to 50) as integer

Объявить массив также можно указав только кол-во элементов:
Dim Mas (50) as integer

В этом случае нижняя граница будет установлена по умолчанию 0. Если Вы хотите что бы первым индексом во всех массивах была 1, то Вам необходимо в начале модуля (перед первой процедурой) указать следующее:
Option Base 1

Для объявления многомерных массивов используется запись следующего вида:
Dim Matrix (1 to 10, 1 to 10) as integer
Dim V3D (10, 10,10) as integer ‘трехмерный массив
Dim V4D (10, 10, 25, 5) as integer ‘четырехмерный массив
и т.д.

Объявление динамических массивов в VBA

Динамический массив — не имеет предопределенного  кол-ва элементов и определяется без указания в скобках границ:
Dim MyDynMas () as integer

Но динамический массив можно будет использовать только после программного определения границ, после ключевого слова ReDim:
Dim MyDynMas () as integer
‘некоторый код или расчет границ
i=4
Redim MyDynMas (i)

x = i +13
Redim MyDynMas (x)

после переопределения кол-ва элементов массива, все элементы обнуляются. Для того чтобы сохранить значения элементов массива, после ReDim необходимо добавить ключевое слово Preserve:

Redim Preserve MyDynMas (x)

Так же возможно переопределить размерность массивов, например с одномерного на двух-трех-мерный:
Dim MyDynMas () as integer
‘некоторый код или расчет границ
i=4
Redim MyDynMas (i)

x = i +13
Redim MyDynMas (i, x)

но учтите, что при переопределении размерности массива, использование ключевого слова Preserve для сохранения значений элементов — невозможно!

Рассмотрим примеры по работе со статическими и динамическими массивами.

Пример 1:
Дан одномерный массив с тремя элементами и матрица 3х4 (3 строки, 4 столбца). Необходимо умножить каждый элемент одномерного массива со всеми элементами строки матрицы, т.е. 1-й элемент умножаем со всеми элементами первой строки матрицы, 2-й со второй строкой и т.д. Результат вывести в виде матрицы в сообщении.

Option Explicit
Option Base 1

Sub StatMas()
Dim Mas(3) As Integer
Dim Matr(3, 4) As Integer
Dim Msg As String
Dim i, j As Integer

‘заполняем масивы
Mas(1) = 2: Mas(2) = 4: Mas(3) = 6

Matr(1, 1) = 4: Matr(1, 2) = 5: Matr(1, 3) = 1: Matr(1, 4) = 7
Matr(2, 1) = 12: Matr(2, 2) = 10: Matr(2, 3) = 2: Matr(2, 4) = 9
Matr(3, 1) = 24: Matr(3, 2) = 11: Matr(3, 3) = 6: Matr(3, 4) = 3

Msg = «Результат:» & Chr(13)
For i = 1 To 3
  For j = 1 To 4
     Matr(i, j) = Matr(i, j) * Mas(i)
     ‘добавляем результат в строку сообщения, резделитель TAB (chr(9))
     Msg = Msg & CStr(Matr(i, j)) & Chr(9)
  Next j
  ‘добавляем перенос на новую строку chr(13)
  Msg = Msg & Chr(13)
Next i
MsgBox Msg
End Sub

Пример 2:
Двухмерный массив не известной длины заполняется следующим образом Mas(i,j) = i * j. Размеры массива вводятся пользователем с помощью формы InputBox. Результат вывести в сообщении.

Sub DynMasTest()
Dim Msg As String
Dim i, j, col, row As Integer
Dim DynMas() As Long

Msg = «Результат:» & Chr(13)

col = InputBox(«Введите кол-во столбцов массива», _
                «Пример создания динамического массива», 2)
row = InputBox(«Введите кол-во строк массива», _
                «Пример создания динамического массива», 2)
                
ReDim Preserve DynMas(col, row)

For i = 1 To col
  For j = 1 To row
    DynMas(i, j) = i * j
    Msg = Msg & CStr(DynMas(i, j)) & Chr(9)
  Next j
  Msg = Msg & Chr(13)
Next i
MsgBox Msg
End Sub

И напоследок, для того чтобы узнать (получить) длину массива воспользуйтесь функцией  UBound(). Запись типа UBound(Mas) вернет кол-во элементов одномерного массива. Если же необходимо узнать длину многомерного массива, то функция примет вид UBound(Matr, 2) – вернет кол-во элементов второго измерения, UBound(Matr, 3) – третьего и т.д. Запись же UBound(Matr, 1)  равносильна UBound(Mas).

Пример:

Sub GetLengthMas()
Dim Matr(3, 4, 5) As Integer

MsgBox «Размер массива: » & UBound(Matr, 1) & «x» & UBound(Matr, 2) & «x» & UBound(Matr, 3) _
       & Chr(13) & «Всего элементов: » & UBound(Matr, 1) * UBound(Matr, 2) * UBound(Matr, 3)
End Sub

 

Прикрепленный файл: work_mass_vba.zip

 

 

VBA Excel. Диапазон ячеек и массив (обмен значениями)

Главная › Новости

Опубликовано: 01. 09.2018

Вставка данных из Excel

Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.


Именованные диапазоны в Excel
Копирование значений из диапазона ячеек в массив Копирование значений из массива в диапазон ячеек Простейшие примеры обмена значениями

Как известно, VBA обрабатывает информацию в массивах значительно быстрее, чем в ячейках рабочего листа Excel. Поэтому, при работе с большими объемами данных, удобнее использовать массивы, чем сидеть и долго наблюдать во время выполнения кода за мерцанием изображения на экране или просто смотреть в неизменную картинку, если обновление экрана отключено (Application.ScreenUpdating = False). Здесь обмен значениями между массивом и диапазоном будет более, чем уместен.


Курсы программирования. Алгоритм №2. Удаление пробелов в конце строки

Копирование значений из диапазона ячеек в массив

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):

Dim a As Variant a = Range(«A1:C3»)

VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).

Можно, в этом случае, объявить сразу динамический массив, чтобы изначально указать, что эта переменная будет массивом. Так как свойством диапазона ячеек по-умолчанию в VBA Excel является значение (Value), его можно в коде явно не указывать, но, при желании, можно и указать. Получится такая конструкция, аналогичная первой:

Dim a() As Variant a = Range(«A1:C3»).Value

Еще стоит отметить, что объявить динамический массив можно, а вот использовать обычный двумерный массив с указанной заранее размерностью не получится.

Копирование значений из массива в диапазон ячеек

Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):

Range(«A6:F15») = a ‘или Range(«A6:F15»).Value = a ‘где a — переменная двумерного массива

Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).

Для вставки значений в диапазон ячеек из массива идеально подойдет массив, созданный для копирования в него значений из диапазона. В этом случае, данные с рабочего листа Excel переносятся в массив, обрабатываются и, после обработки, вставляются обратно в ту же или другую таблицу на том же или другом рабочем листе.

Простейшие примеры обмена значениями

Эти примеры составлены так, чтобы вам не пришлось совершать лишних действий, просто скопируйте их в свой модуль любой книги Excel с поддержкой макросов и запустите по-очереди на выполнение.

Пример 1

Заполнение двумерного массива значениями и и их присвоение диапазону ячеек на рабочем листе Excel:

Sub Test1() Dim a(2, 2) As Variant a(0, 0) = «телепузик» a(0, 1) = «журналист» a(0, 2) = «ящерица» a(1, 0) = «короед» a(1, 1) = «утенок» a(1, 2) = «шмель» a(2, 0) = 200 a(2, 1) = 300 a(2, 2) = 400 Range(«A1:C3»). Value = a End Sub

В данном случае переменная массива не обязательно должна быть универсального типа (As Variant), например, если бы в нее записывались только текстовые данные, ее можно было бы объявить как строковую (As String), и все бы работало.

Пример 2

Объявление обычной переменной универсального типа, присвоение ей значений из диапазона ячеек «A1:C3», записанных кодом первого примера, и вставка этих значений из полученного двумерного массива в диапазон «D10:F12»:

Sub Test2() Dim a As Variant a = Range(«A1:C3») Range(«D10:F12») = a End Sub

Естественно, указанные диапазоны ячеек расположены на активном листе.

Исходники программ. Репетитор по программированию. Код для студентов

Вопросами повторного использования готового кода озадачены лучшие «программерские» умы. Как ни где в мире, использование прошлого опыта целесообразно в области программировании.

Любой студент-второкурсник знает:

  • Выделение часто повторяющегося действия в отдельную функцию в разы сокращает исходный код;
  • Использование параметров в этой функции делает ее более универсальной и гибкой;
  • Функции из одной области (допустим, графика или базы данных) целесообразно объединять в отдельный модуль и подключать его к новой программе в случае необходимости;
  • и т.д.
Продолжу на эту же тему:
  • Структуры и Классы это вообще клад, так как представляют собой концентрированное выражение знаний (метаданных и алгоритмов) из определенной области. Сторонние пакеты классов предоставляются в виде библиотек (например *.dll).;
  • Найти в нужный момент нужный класс это огромная удача. Иначе придется писать его самому, отлаживать, тестировать. Но, как говорится, «что Бог ни дает все к лучшему». В этом случае Вы становитесь автором и обладателем «сокровища». Сохраняйте и берегите его. В нужный момент, Вы обязательно вспомните, что в ваших запасах уже имеется что-то похожее и пригодное к использованию или доработке.

Вот поэтому, куски и кусочки готового исходного кода всегда будут востребованы. Смело используйте их. То, что в искусстве называется «плагиат» и не поощряется, в технике, промышленности и программировании выглядит с точностью до наоборот. «Не надо снова изобретать велосипед», — скажут Вам.

Мелкие объекты всегда более универсальны, чем крупные. Из десятка «мелких» можно собрать сотню крупных на разные случаи жизни. Но последующее применение «крупному объекту» найти сложнее (по крайней мере, без доработки).

Я буду рад, если Вы найдете на этом сайте, что-то полезное, как «детали конструктора». Творите. Перерабатывайте. Объединяйте и комбинируйте.

В крайнем случае, если цейтнот и времени не хватает катастрофически (а для студентов это очень характерно всегда не хватает времени и денег), можно поручить сборку мне, т.к. составление пошаговых инструкций для компьютера на одном из языков: C, C++, C#, Delphi, Visual Basic, Pascal, VBA — является достаточно специфическим видом деятельности. Чтобы им заниматься — это надо любить.

А с недавнего времени, я добавил услугу Скайп-Консультирование! Это для тех, кто уже пишет код сам, но вдруг уперся в стену на какой-то мелочи

Ведь Skype предоставляет возможности

  • либо мне видеть ваш экран, и подсказывать, где Вы не так поступаете;
  • либо я демонстрирую Вам свой экран, т.е. показываю, как я поступаю в таких случаях.

И это очень эффективно!!!
Для начинающих программистов, как раз, самое важное — это обучиться отладке, т. е. поиску ошибок в собственном коде Вот эти способы и приемы отладки собственных программ Вы и увидите на экране монитора вне зависимости от разделяющего нас расстояния!

Разумеется, для студентов, что заказали код, час общения по Скайпу остается бесплатным.

А сейчас, ВНИМАНИЕ! Отличительная особенность моих услуг!

Если вы позвоните на указанный телефон, то Вам отвечу я.
Если вы напишите на e-mail, зададите вопрос, пожелаете получить консультацию, то Вам буду отвечать непосредственно я.

Вам не придется общаться с автоответчиками или «блондинками-попугаями», которые отвечают заученными фразами. Вы будете общаться с первым лицом, которое писало код и несет всю ответственность за проделанную работу.

Согласитесь, что решать вопросы в такой ситуации намного проще, чем через выстроенную систему прослоек, где каждый выполняет только отведенную ему функцию.
Плата, понятно, чуть выше, чем в сервисах ориентированных на поток но если вы хотите не просто столкнуть задание и забыть, а разобраться в нем и даже приятно удивить преподавателя, то Вам ко мне

И особенно удобна моя «индивидуальная» система в случаях, когда возникают вопросы по доработке, наращиванию проекта. Это, как правило, касается дипломных работ, когда точный объем функциональности изначально не известен и техническое задание, как таковое, составить невозможно.

VBA — Неровные массивы (массивы массивов)

Пример

Неровные массивы НЕ многомерные массивы

Массивы массивов (зазубренные массивы) не то же самое, что многомерные массивы, если вы думаете о них визуально. Многомерные массивы будут выглядеть как матрицы (прямоугольные) с определенным количеством элементов в их размерах (внутри массивов), в то время как зазубренный массив будет как годовой календарь с внутренними массивами, имеющими разное количество элементов, например дни в разных месяцах.

Хотя зазубренные массивы довольно запутаны и сложны в использовании из-за их вложенных уровней и не имеют особой безопасности типов, но они очень гибкие, позволяют легко манипулировать различными типами данных и не должны содержать неиспользуемые или пустые элементы.

Создание массива с зазубринами

В приведенном ниже примере мы инициализируем зубчатый массив, содержащий два массива, один для имен, а другой для чисел, а затем получим доступ к одному элементу каждого

  Dim OuterArray () как вариант
Тусклые имена () как вариант
Тусклые числа () как вариант
'массивы объявлены как вариант, поэтому мы можем получить доступ к атрибутам любого типа данных для его элементов

Names = Array ("Person1", "Person2", "Person3")
Числа = Массив («001», «002», «003»)

OuterArray = массив (имена, числа)
'Непосредственное предоставление OuterArray массива, содержащего массивы имен и чисел внутри

Отлаживать.Печать OuterArray (0) (1)
Отладка. Печать OuterArray (1) (1)
'доступ к элементам внутри зазубрины, задавая координаты элемента
  

Динамическое создание и чтение массивов с зазубринами

Мы также можем быть более динамичными в нашем приближении к построению массивов, представив, что у нас есть лист данных клиента в Excel, и мы хотим построить массив для вывода сведений о клиенте.

  Имя - Телефон - Электронная почта - Номер клиента
Лицо1 - 153486231 - 1 @ СТЕК - 001
Person2 - 153486242 - 2 @ СТЕК - 002
Person3 - 153486253 - 3 @ СТЕК - 003
Person4 - 153486264 - 4 @ СТЕК - 004
Person5 - 153486275 - 5 @ СТЕК - 005
  

Мы динамически построим массив заголовков и массив клиентов, заголовок будет содержать заголовки столбцов, а массив клиентов будет содержать информацию о каждом клиенте / строке в виде массивов.

  Тусклые заголовки в качестве варианта
'заголовки массив с верхней частью паспорта клиента
    Для c = от 1 до 4
        Если IsEmpty (заголовки), то
            Заголовки ReDim (0)
            Заголовки (0) = Ячейки (1, c).  Значение
        Еще
            Заголовки ReDim Preserve (от 0 до UBound (заголовки) + 1)
            Заголовки (UBound (Заголовки)) = Ячейки (1, c). Значение
        Конец, если
    Следующий
    
Тусклые клиенты как вариант
'Массив клиентов будет содержать массивы значений клиентов
Dim Customer_Values ​​As Variant
'Customer_Values ​​будет массивом клиента в его элементах (Name-Phone-Email-CustNum).
    
    Для r = от 2 до 6
    'перебирать клиентов / строки
        Для c = от 1 до 4
        'перебирать значения / столбцы
            
            'построить массив, содержащий значения клиентов
            Если IsEmpty (Customer_Values), то
                ReDim Customer_Values ​​(0)
                Customer_Values ​​(0) = Ячейки (r, c).Ценить
            ElseIf Customer_Values ​​(0) = "" Тогда
                Customer_Values ​​(0) = Ячейки (r, c) .Значение
            Еще
                ReDim Preserve Customer_Values ​​(от 0 до UBound (Customer_Values) + 1)
                Customer_Values ​​(UBound (Customer_Values)) = Ячейки (r, c). Значение
            Конец, если
        Следующий
        
        'добавить массив customer_values ​​в массив Customers
        Если IsEmpty (клиенты), то
            Клиенты ReDim (0)
            Клиенты (0) = Customer_Values
        Еще
            ReDim Preserve клиентов (от 0 до UBound (клиентов) + 1)
            Клиенты (UBound (Клиенты)) = Customer_Values
        Конец, если
        
        'сбросить Custumer_Values, чтобы при необходимости перестроить новый массив
        ReDim Customer_Values ​​(0)
    Следующий

    Dim Main_Array (от 0 до 1) как вариант
    'основной массив будет содержать как заголовки, так и клиентов
    
    Main_Array (0) = Заголовки
    Main_Array (1) = Клиенты
  

Чтобы лучше понять способ динамического построения одномерного массива, проверьте динамические массивы (изменение размера массива и динамическая обработка) в документации по массивам.

Результатом приведенного выше фрагмента является зазубренный массив с двумя массивами, один из этих массивов с 4 элементами, 2 уровнями отступа, а другой сам является другим зазубренным массивом, содержащим 5 массивов по 4 элемента каждый и 3 уровня отступа, см. Структуру ниже :

  Main_Array (0) - Заголовки - Массив («Имя», «Телефон», «Электронная почта», «Номер клиента»)
          (1) - Клиенты (0) - Массив ("Person1", 153486231, "1 @ STACK", 001)
                Клиенты (1) - массив ("Person2", 153486242, "2 @ STACK", 002)
                ...
                Клиенты (4) - массив ("Person5", 153486275, "5 @ STACK", 005)
  

Чтобы получить доступ к информации, вы должны иметь в виду структуру созданного вами массива Jagged. В приведенном выше примере вы можете видеть, что основной массив содержит массив заголовков и массив массивов ( клиентов). ), следовательно, с разными способами доступа к элементам.

Теперь мы прочитаем информацию об основном массиве и распечатаем каждую информацию о клиентах как Тип информации: Информация .

  Для n = 0 до UBound (Main_Array (1))
    'n для итерации от первого до последнего массива в Main_Array (1)
    
    Для j = 0 в UBound (Main_Array (1) (n))
        'j будет выполнять итерацию от первого до последнего элемента в каждом массиве Main_Array (1)
        
        Debug.Print Main_Array (0) (j) & ":" & Main_Array (1) (n) (j)
        'print Main_Array (0) (j), который является заголовком, и Main_Array (0) (n) (j), который является элементом в массиве клиентов
        'мы можем вызвать заголовок с помощью j, поскольку массив заголовков имеет ту же структуру, что и массив клиентов
    Следующий
Следующий
  

ПОМНИТЕ, чтобы отслеживать структуру вашего Jagged Array, в приведенном выше примере для доступа к имени клиента нужно обратиться к Main_Array -> Customers -> CustomerNumber -> Name , который является трехуровневым, чтобы вернуть "Person4" вам понадобится местоположение клиентов в Main_Array, затем местоположение клиента четыре в массиве Customers Jagged и, наконец, местоположение нужного вам элемента, в данном случае Main_Array (1) (3) (0) , который — это Main_Array (Customers) (CustomerNumber) (Name) .




Как мне настроить «зубчатый массив» в VBA?

Как мне настроить «зубчатый массив» в VBA? — Переполнение стека

Присоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.

Спросил

Просмотрено 45k раз

У меня целый класс детей, каждый из которых должен перечислить свои любимые игрушки для задания.Некоторые дети указывают только одну игрушку, а другие — больше.

Как мне создать зубчатый массив, чтобы Kids (x) (y) … где x — количество детей в моем классе, а y — список игрушек, которые они указывают как свои любимые?

Джоэл Кохорн

3,7kk103103 золотых знака528528 серебряных знаков763763 бронзовых знака

Создан 24 фев.

фанфан

3,798211 золотых знаков5858 серебряных знаков8181 бронзовый знак

1

«Неровный массив» — это жаргонное обозначение массива массивов. Тип данных VBA Variant может содержать что угодно *, включая массив. Итак, вы создаете массив типа Variant и назначаете каждому из его элементов массив произвольной длины (т.е. не все они должны иметь одинаковую длину).

Вот пример:

  Dim nStudents As Long
Dim iStudent пока долго
Тусклые игрушки () как вариант
Dim nToys As Long
Уменьшить размер thisStudentsToys () как вариант

nStudents = 5 'или что угодно

ReDim toys (от 1 до nStudents) 'это будет ваш зазубренный массив

Для iStudent = 1 для nStudents
    'дать этому ученику случайное количество игрушек (например,грамм. до 10)
    nToys = Int ((10 * Rnd) + 1)
    ReDim thisStudentsToys (от 1 до nToys)

    'здесь идет код для заполнения thisStudentsToys ()
    'своими настоящими игрушками

    игрушки (iStudent) = thisStudentsToys
Следующий iStudent

Массив игрушек теперь зубчатый.

'Чтобы получить игрушку № 7 ученика №3:
Игрушки MsgBox (3) (7)
'выдаст ошибку, если у ученика №3 меньше 7 игрушек
  

* Заметным исключением являются типы, определяемые пользователем. Варианты не могут содержать их.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa