Массивы в VBA бывают статическими и динамическими. Массив в vba


Массивы в Visual Basic for Application

Массивы в Visual Basic for Application – это структуры, которые обычно хранят наборы взаимосвязанных переменных одного типа. Доступ к записям массива осуществляется по их числовому индексу.

Например, есть команда из 20 человек, имена которых нужно сохранить для дальнейшего использования в коде VBA. Можно было бы просто объявить 20 переменных для хранения каждого имени, вот так:

Dim Team_Member1 As String Dim Team_Member2 As String ... Dim Team_Member20 As String

Но можно использовать гораздо более простой и организованный способ – сохранить список имён членов команды в массиве из 20 переменных типа String:

Dim Team_Members(1 To 20) As String

В строке, показанной выше, мы объявили массив. Теперь запишем значение в каждый из его элементов, вот таким образом:

Team_Members(1) = "John Smith"

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

Как это работает продемонстрировано ниже на примере кода, который выводит имена каждого члена команды последовательно в ячейки столбца A активного рабочего листа Excel.

For i = 1 To 20 Cells(i,1).Value = Team_Members(i) Next i

Очевидно, что работа с массивом, в котором сохранено 20 имён, значительно менее громоздка и более аккуратна, чем использование 20 отдельных переменных. А что, если этих имён не 20, а 1000? А если, вдобавок, требуется сохранить отдельно фамилии и отчества?! Ясно, что вскоре станет совершенно невозможно справиться с таким объёмом данных в коде VBA без помощи массива.

Многомерные массивы в Excel Visual Basic

Массивы Visual Basic, о которых шла речь выше, считаются одномерными. Это означает, что они хранят простой список имён. Однако, массивы могут иметь множество измерений. Например, двумерный массив можно сравнить с сеткой значений.

Предположим, что нужно сохранить ежедневные показатели продаж за январь для 5 разных команд. Для этого потребуется двумерный массив, состоящий из 5 наборов показателей для 31 дня. Объявим массив таким образом:

Dim Jan_Sales_Figures(1 To 31, 1 To 5) As Currency

Для того, чтобы получить доступ к элементам массива Jan_Sales_Figures, нужно использовать два индекса, указывающих день месяца и номер команды. Например, адрес элемента, содержащего показатели продаж для 2-ой команды за 15-ое января будет записан так:

Таким же образом можно объявить массив с 3-мя и более измерениями – достаточно добавить дополнительные измерения в объявление массива и использовать дополнительные индексы для ссылки на элементы этого массива.

Объявление массивов в Excel Visual Basic

Ранее в этой статье мы уже рассмотрели несколько примеров объявления массивов в VBA, но эта тема заслуживает более подробного рассмотрения. Как было показано, одномерный массив можно объявить вот так:

Dim Team_Members(1 To 20) As String

Такое объявление сообщает компилятору VBA, что массив Team_Members состоит из 20 переменных, к которым можно обратиться по индексам от 1 до 20. Однако, нам может прийти в голову пронумеровать наши переменные массива числами от 0 до 19, и в таком случае массив должен быть объявлен вот так:

Dim Team_Members(0 To 19) As String

На самом деле, по умолчанию нумерация элементов массива начинается с 0, и в объявлении массива начальный индекс может быть не указан вовсе, вот так:

Dim Team_Members(19) As String

Такую запись компилятор VBA расценит, как объявление массива из 20 элементов с индексами от 0 до 19.

Эти же правила действуют при объявлении многомерных массивов Visual Basic. Как уже было показано в одном из примеров, при объявлении двумерного массива индексы его измерений разделяются запятой:

Dim Jan_Sales_Figures(1 To 31, 1 To 5) As Currency

Однако, если не указывать начальный индекс для обоих измерений массива и объявить его вот так:

Dim Jan_Sales_Figures(31, 5) As Currency

то эта запись будет расценена, как двумерный массив, первое измерение которого содержит 32 элемента с индексами от 0 до 31, а второе измерение массива содержит 6 элементов с индексами от 0 до 5.

Динамические массивы

Все массивы в рассмотренных выше примерах имеют фиксированное количество измерений. Однако, во многих случаях мы не знаем заранее, какого размера должен быть наш массив. Можно выйти из ситуации, объявив огромный массив, размер которого будет наверняка больше, чем нужно для нашей задачи. Но такое решение потребует много лишней памяти и может замедлить работу программы. Есть решение лучше. Мы можем использовать динамический массив – это такой массив, размер которого может быть установлен и изменён сколько угодно раз в процессе выполнения макроса.

Динамический массив объявляется с пустыми скобками, вот так:

Dim Team_Members() As String

Далее нужно будет объявить измерение массива в процессе выполнения кода при помощи выражения ReDim:

ReDim Team_Members(1 To 20)

И если в процессе выполнения кода потребуется снова изменить размер массива, то можно использовать выражение ReDim снова:

If Team_Size > 20 Then ReDim Team_Members(1 To Team_Size) End If

Нужно иметь в виду, что изменение размера динамического массива таким способом приведёт к потере всех значений, хранившихся в массиве. Для того, чтобы сохранить данные, уже находящиеся в массиве, нужно использовать ключевое слово Preserve, как показано ниже:

If Team_Size > 20 Then ReDim Preserve Team_Members(1 To Team_Size) End If

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

Оцените качество статьи. Нам важно ваше мнение:

office-guru.ru

Массивы VBA | Программирование VBA в СУБД Access 2003

Массивы VBA

2011-12-27

Автор: Владимир Ткаченко

Источник: Обучение в интернет

В VBA применяются два вида переменных:

  • простые переменные;
  • переменные массивов.

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

Для обработки элементов в массиве можно использовать циклические структуры. При обработке элементов массива циклические структуры по сравнению с линейными структурами значительно снижают количество операторов в программе. Для обработки данных массивов применяют такие циклические структуры как For…Next и For Each...Next.

Массивы могут быть одномерными и многомерными, статическими и динамическими. К одномерным статическим массивам относится простой список данных (элементов) одного типа. Объявление массива производится следующим образом: Dim MyAr(5) As Integer - это одномерный массив хранит 6 элементов целочисленных значений. Где элемент с номером 5 является верхней границей массива или максимальным номером ячейки памяти.

Нижней границе массива по умолчанию соответствует элемент с номером 0 (минимальный номер ячейки памяти). Значение нижней границы массива можно изменить с помощью ключевого слова To. Например, в Dim MyAr(2 To 5) As String нижней границе массива установлено значение 2. Элементы массива имеют номера (индексы) 2, 3, 4, 5, значения которых (любые целые числа) размещаются в оперативной памяти последовательно. Необходимо отметить, что каждому элементу массива присваивается индекс. В массиве VBA допускается использовать до 60 индексов.

Индекс определяет положение элемента в массиве. Что касается значений элементов, то они могут быть любыми значениями, которые соответствуют объявленному типу данных. Для определения значений элементов массива используют следующую конструкцию: Переменная_Массива (индекс) = Значение.

Для объявления статического многомерного массива (матрицы) в поле индекса необходимо указать несколько индексов. Например, для двумерного массива (двумерной таблицы) в поле индекса надо указать два индекса: количество столбцов и строк.Dim MyAr(5, 3) As String - это двумерный массив из 24 элементов (6 столбцов и 4 строк).

Динамический массив - это массив, при объявлении которого не указаны его границы в явном виде. Например, Dim MyAr() As String. Для управления верхней и нижней границ массива используют ключевые слова ReDim, т.е. ReDim перераспределяет размеры массива. Инструкция ReDim имеет следующую конструкцию: ReDim [Preserve] ИмяПеременной (индексы) As ТипДанных. Где Preserve (не является обязательной инструкцией) - это ключевое слово, которое обеспечивает сохранность значений в текущем массиве при изменении размера массива инструкцией ReDim.

Пример динамического массива:Dim MyAr() As String ' объявление динамического массива.Dim intCounter As Variant ' объявление переменной.ReDim MyAr (2 To 5) As Integer ' определение размера одномерного массива из 4 элементов с нижней границей 2. For intCounter = 2 To 5 ' в цикле For ...Next переменной intCounter присваивается последовательно значения от 2 до 5. <блок операторов> Next

В VBA Access чаще приходится работать не с массивами, а с коллекциями объектов. Коллекция объектов — это группа связанных объектов. Например, в Access предусмотрена коллекция AllForms, которая хранит все формы базы данных. Другими словами в объекте Application приложении Access есть объекты CurrentProjec и CodeProject, которые содержат множество коллекций, в том числе и коллекцию AllForms. Коллекция AllForms содержит объекты AccessObject для каждой формы. Необходимо отметить, что объекты AccessObject представляют формы, отчеты, таблицы и другие объекты.

В коллекциях предусмотрен стандартный набор свойств и методов. Метод Add служит для добавления нового элемента в коллекцию, а Remove, для удаления элемента из коллекции. Метод Item для получения доступа к требуемому элементу коллекции. Свойство Count предназначено для получения информации о количестве элементов в коллекции.

www.lessons-tva.info

Массивы и циклы в VBA Access 2003 | Info-Comp.ru

Продолжаем изучать VBA Access, и сегодня мы будем разговаривать о том, как можно использовать циклы и массивы в VBA Access. Как обычно рассмотрим все это на примерах, а также научимся создавать  собственный тип данных типа record или «запись», который пригодится как раз, для того чтобы сделать своего рода ассоциативный массив, не совсем конечно, но в некоторых случаях может сильно облегчить Вам реализацию той или иной задачи.

Ранее мы с Вами уже сталкивались с задачами, которые необходимо было реализовать в Access 2003, а конкретней средствами VBA, например, Access – Импорт данных в базу MSSql 2008 или Выгрузка данных в текстовый файл из MSSql 2008 клиентом Access 2003 И там мы как раз сталкивались с циклами, но подробно о них мы не разговаривали, поэтому пришло время поговорить о циклах и еще, об очень полезной штуке в VBA это массивы.

Примечание! Для понимания всего того, о чем мы сегодня будем разговаривать, советую ознакомиться с материалом – Встроенные функции VBA Access.

Циклы в VBA Access

И как Вы поняли, начнем мы с циклов, и если конкретней, то с небольшой теории.

Цикл – это действия (инструкции), которые повторяются неоднократно, и прекращают свое выполнение в зависимости от условий или просто выполняются заданное количество раз.

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

Цикл For ….. Next – это цикл, который выполняется заданное количество раз, будь то вручную или в зависимости от значения переменной.

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

For счетчик=начальное значение счетчика to конечное значение счетчика Инструкции Step (шаг итерации) Exit for (выход из цикла до срочно) Next (следующая итерация)

А теперь давайте приведем пару простых примеров для понимания, откроем Access создадим форму, добавим элемент управления «кнопка» и в обработчик события «Нажатия кнопки» вставим следующий код (предполагается, что данные действия Вы уже должны уметь, если нет то вот скриншот):

Код:

'Переменные Dim cnt As Integer Dim i As Integer Dim rezult As Integer 'Задаем количество, столько раз будет выполняться цикл cnt = 10 rezult = 0 'Сам цикл For i = 1 To cnt rezult = rezult + 1 Next 'Просто сообщение о результате выполнения цикла MsgBox "Цикл выполнился " & rezult & " раз"

Это самый простой пример, когда мы сами указали сколько раз будет выполняться наш цикл, результат будет 10 раз, теперь давайте приведем пример чуть посложней:

'Переменные Dim cnt As Integer Dim i As Integer Dim rezult As Integer 'Задаем количество, столько раз будет выполняться цикл cnt = 10 rezult = 0 'Сам цикл For i = 1 To cnt Step 2 'Если i больше 5, то выходим из цикла If i > 5 Then Exit For End If rezult = rezult + 1 Next 'Просто сообщение о результате выполнения цикла MsgBox "Цикл выполнился " & rezult & " раз"

Догадайтесь сколько раз выполнится цикл? Ответ 3 раза, потому что мы указали шаг равным 2, и еще тогда когда i стало больше 5, мы завершили цикл, т.е.

Первая итерация

i = 1

result = 1

Вторая итерация

i = 3

result = 2

Третья итерация

i = 5

result = 3

Четвертая итерация

i = 7

и вот тут мы вышли из цикла

Надеюсь понятно:)

Цикл do while ……loop – это цикл выполняется до тех пор, пока соблюдается определенное условие, которое в свою очередь проверяется до начала итерации, другими словами цикл может и не начаться, если условие сразу не выполняется.

Синтаксис:

do while условие инструкции exit do (Выход из цикла по дополнительному условию) loop (переход к следующей итерации)

пример:

Dim cnt As Integer Dim rezult As Integer cnt = 1 rezult = 0 Do While cnt < 10 If rezult > 5 Then Exit Do End If rezult = rezult + 1 cnt = cnt + 1 Loop MsgBox "Цикл выполнился " & rezult & " раз"

Здесь мы входим в цикл и сразу проверяем cnt у нас меньше 10 и если да то выполняем блок инструкций, в которых у нас стоит еще одно условие, если result стал больше 5, то просто выходим из цикла. Результат в этом случае будет 6 раз, и в этом случае мы вышли из цикла через Exit Do.

Цикл do….. loop while – это цикл выполняется до тех пор, пока соблюдается определенное условие, а вот в этой разновидности циклов условие проверяется после выполнения первой итерации, и здесь хоть одна итерация да выполнится.

Пример:

Dim cnt As Integer Dim rezult As Integer cnt = 1 rezult = 0 Do If rezult > 5 Then Exit Do End If rezult = rezult + 1 cnt = cnt + 1 Loop While cnt < 5 MsgBox "Цикл выполнился " & rezult & " раз"

Это практически такой же пример, как и предыдущий только условие проверяется после выполнения операторов в теле цикла, и для того чтобы выйти из цикла по основному условию, я  изменил условие на cnt<5 и именно по этому условию мы вышли из цикла, так как когда переменная cnt достигла значения пяти то переменная rezul оставалась со значение 4, это кстати и результат.

Также существуют циклы:

Do until…..loop – цикл выполняется до тех пор пока условие не выполняется, а когда условие выполнится то произойдет завершение цикла. Проверка осуществляется до начала цикла.

Синтаксис:

Do until условие инструкции exit do (Выход из цикла по дополнительному условию) loop (переход к следующей итерации)

Do ….. until loop – тот же самый цикл только проверка осуществляется после выполнения блока инструкций.

Синтаксис:

Do инструкции exit do (Выход из цикла по дополнительному условию) loop until условие

Массивы в VBA Access

Массив в  VBA – это набор однотипных переменных. Массивы в VBA бывают статические, динамические, одномерные и многомерные. Для просмотра данных в массиве очень часто используют циклы, не спроста мы их рассмотрели в начале этого материала.

Синтаксис объявления массива:

Dim имя_массива (нижняя граница to верхняя) as тип данных в массиве

Давайте приведем простой пример, одномерного статического массива.

'Объявляем массив с типом String Dim test_arr(1 To 2) As String Dim str As String 'записываем данные в массив test_arr(1) = "Первый элемент" test_arr(2) = "Второй элемент" 'циклом перебираем массив и записываем значения в переменную str For i = 1 To 2 str = str & vbNewLine & test_arr(i) Next 'Выводим итоговую строку MsgBox str

Результат:

Теперь давайте приведем пример динамического массива:

'Объявляем массив с типом String, уже без размерности Dim test_arr() As String Dim str As String Dim n As Integer n = 2 'переопределяем размерность массива ReDim test_arr(1 To n) As String 'записываем данные в массив test_arr(1) = "Первый элемент" test_arr(2) = "Второй элемент" 'циклом перебираем массив и записываем значения в переменную str For i = 1 To 2 str = str & vbNewLine & test_arr(i) Next 'Выводим итоговую строку MsgBox str

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

ReDim Preserve  test_arr(1 To 10) As String

Пример многомерного массива:

Dim test_arr(2, 2) As String Dim str As String 'записываем данные в массив test_arr(1, 1) = "Первый элемент первого массива" test_arr(1, 2) = "Второй элемент первого массива" test_arr(2, 1) = "Первый элемент второго массива" test_arr(2, 2) = "Второй элемент второго массива" 'циклами перебираем массив и записываем значения в переменную str For i = 1 To 2 For a = 1 To 2 str = str & vbNewLine & test_arr(i, a) Next Next 'выводим итоговую строку MsgBox str

Здесь я просто использую два цикла для переборки элементов массива.

А теперь, как и обещал, давайте приведем примеры объявления собственного типа данных, и применим его к данным в массиве.

Для объявления типа необходимо прописать:

Public Type mytype name_str As String value_str As String End Type

А в процедуру вставляем:

'объявляем массив с нашим типом Dim test_arr(2) As mytype Dim str As String 'записываем данные в наш массив test_arr(1).name_str = "Поле 1" test_arr(1).value_str = "Значение поля 1" test_arr(2).name_str = "Поле 2" test_arr(2).value_str = "Значение поля 2" For i = 1 To 2 str = str & test_arr(i).name_str & " = " & test_arr(i).value_str & vbNewLine Next MsgBox str

Результат будет вот таким

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

Циклы и массивы очень часто используют для работы с неким массивом данных, например Recordset что значительно облегчает работу.

Для основ я думаю этого достаточно, примеры использования циклов и массивов мы продолжим изучать в следующих материалах, а пока на этом все. Удачи в освоении VBA Access!

Похожие статьи:

info-comp.ru

Функции VBA для работы с массивами

Главная » Функции VBA » 28 Апрель 2011       Дмитрий       93309 просмотров
  • Array() — позволяет автоматически создать массив нужного размера и типа и сразу загрузить в него переданные значения.

    'инициализируем переменную с типом Variant Dim avArr 'присваиваем переменной хначение массива avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний") 'показываем 3-ий по порядку элемент MsgBox avArr(2)

        'инициализируем переменную с типом Variant

        Dim avArr

        'присваиваем переменной хначение массива

        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")

        'показываем 3-ий по порядку элемент

        MsgBox avArr(2)

    Опечатки нет. avArr(2) действительно выдаст третий элемент, т.к. по умолчанию для массива нижняя граница равна нулю.
  • Filter() — позволяет на основе одного массива получить другой, отфильтровав в исходном массиве нужные нам элементы.
  • LBound() — возвращает информацию о нижней границе массива (то есть номере первого имеющегося в нем значения)

    Dim avArr avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний") 'показываем 3-ий по порядку элемент MsgBox LBound(avArr)

        Dim avArr

        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")

        'показываем 3-ий по порядку элемент

        MsgBox LBound(avArr)

  • UBound() — возвращает информацию о верхней границе массива (номер последнего имеющегося значения)

    Dim avArr avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний") 'показываем 3-ий по порядку элемент MsgBox UBound(avArr)

        Dim avArr

        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")

        'показываем 3-ий по порядку элемент

        MsgBox UBound(avArr)

  • Join() — возможность слить множество строк из массива строк в одну строковую переменную. В качестве разделителя по умолчанию используется пробел, можно указать свой разделитель.

    Dim avArr avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний") 'объединяем все элементы массива с разделителем "-" MsgBox Join(avArr, "-")

        Dim avArr

        avArr = Array("Первый элемент", "Второй элемент", "3", 4, "Последний")

        'объединяем все элементы массива с разделителем "-"

        MsgBox Join(avArr, "-")

  • Split() — обратная функция, разбивающая строку на массив строк . В качестве разделителя по умолчанию используется пробел, можно указать свой разделитель.

    'инициализируем переменную с типом Variant 'т.к. затем это будет массив Dim sStr 'разбиваем указанный текст массив. Разделитель - "-" sStr = Split("Первый элемент-Второй элемент-3-4-Последний", "-") 'показываем 3-ий по порядку элемент MsgBox avArr(2)

        'инициализируем переменную с типом Variant

        'т.к. затем это будет массив

        Dim sStr

        'разбиваем указанный текст массив. Разделитель - "-"

        sStr = Split("Первый элемент-Второй элемент-3-4-Последний", "-")

        'показываем 3-ий по порядку элемент

        MsgBox avArr(2)

www.excel-vba.ru

Массивы в VBA бывают статическими и динамическими.

⇐ ПредыдущаяСтр 5 из 9Следующая ⇒

Ø Статическими называются массивы, количество элементов в которых заранее известно и не изменяется в ходе выполнения программы.

Ø Динамическими называются массивы, в которых не известно начальное количество элементов и оно изменяется во время выполнения программы.

 

Описание массивов

Массив, как любую переменную, надо объявлять используя инструкции:

Dim, Static, Privat, Public

 

a) Объявление статических массивов (базовый индекс)

В статическом массиве допускается до 60 размерностей.

Статические массивы могут быть объявлены одним из следующих способов:

Ø Dim <имя массива> (<количество элементов массива>) [As <тип элементов>]

Ø Dim <имя массива> (<начальное значение индекса> To <конечное значение индекса>) [As <тип элементов>]

 

Например:

 

Dim A(11) As Integer – объявлен одномерный массив, состоящий из 12 целых чисел. Причем, по умолчанию первый элемент массива А(0), а последний А(11). В этом случае говорят, что 0 – базовый индекс

 

Dim B(2,2) As Single – матрица В(3*3) действительных чисел

 

Dim S (1 To 7) As Integer – одномерный массив, содержащий семь элементов целого типа.

 

Dim V As (1 To 5, 1 To 7) As Double – двухмерный массив, у которого 5 строчек и 7 столбцов вещественных элементов.

 

Можно изменить базовый индекс, написав в области объявления модуля директиву Option Base

Например

Option Base 1

Dim A(11) As Integer - объявлен одномерный массив, состоящий из 11 целых чисел.

Dim B(2,2) As Single – матрица В(2*2) действительных чисел

 

Инициализацию элементов массива можно производить по разному:

Ø Последовательностью операторов

Dim B(l To 2, 1 То 2) As Single

B(1,1)=2

В(1,2)=4

В(2,1)=1

В(1,2)=6

Ø Оператором цикла

Dim F (1 To 9, 1 To 11) As Integer

Dim i As integer

Dim j As integer

For i=1 to 9

For j=1 to 11

F(i,j)=i*j

Next j

Next i

 

Пример

 

Public Sub massiv()

Dim A(11) As Integer

For i = 0 To 11

A(i) = i

MsgBox "a(" & i & ")=" & A(i)

Next i

End Sub

 

Б) Динамические массивы

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

Синтаксис объявления динамического массива

Ø Dim <имя массива> ( ) [As <тип элементов>]

Затем в программе следует вычислить необходимый размер массива в некоторой переменной и изменить размер динамического массива. С помощью инструкции ReDim

ReDim <имя массива> (<размерность массива>)

Допустимо повторное использование инструкции ReDim для изменения числа элементов и размерностей массива

Например

Dim R() As Single

ReDim R(l To 10)

ReDim R(5,10)

 

10.7 Выражения и операции

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

Выражение — это запись, определяющая последовательность действий над величинами.

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

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

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

Константы

Операнды Переменные

Массивы

Функции

 

Арифметические

Отношения

Операции Логические

Текстовые

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

А) Арифметические операции:

+ - сложение;

- - вычитание;

* - умножение;

/ - деление;

\ - целочисленное деление;

Mod – остаток от целочисленного деления;

^ - возведение в степень

Например:

Dim x As Double, y As Double, z As Double

х=5 : y=3

Z=x+y

Z=x-y

Z=x*y

Z=x/y

Z=x\y ‘ целочисленное деление z=1

Z=x mod y ‘ остаток от целочисленного деления z=2

Z=x^y

Арифметические выражения состоят из операндов и математических операций.

Пример. Записать математические выражения в виде арифметических выражений на VBA

Математическое выражение Выражение на VBA
x2-7x+6 x^2-7*x+6
(Abs(x)-Abs(y))/(1+Abs(x*y))
ln Log(Abs((y-Sqr(Abs(x)))*(x-y/(z+(x)^2/4))))

 

Б) Операции отношения

>, <, >=, <=, <>, =

Например:

Dim x As Double, y As Double, z As Double, b As Boolean

X=5 : y=3

B= (x<y)

B= (x>y)

B= (x<=y)

B= (x>=y)

B= (x<>y)

B= (x=y)

 

В) Логические операции

Операция Наименование
Not And Or Отрицание Конъюнкция (умножение) Дизъюнкция (сложение)

 

Значения элементарных логических выражений приведены в таблице ниже

 

Таблица – Результат логических операций

A B not A A and B A or B A or B
True True False False True False True False False False True True True False False False True True True False False True True False

 

Читайте также:

lektsia.com

Решение: Массив массивов в VBA или что-то похожее (см. сообщении)

Здравствуйте, умные люди. Есть такая задача: на листах Excel различного рода таблички разного размера и конфигурации. Надо перенести данные из одного файла в другой. Всё просто, проблема лишь в том, что таблицы имеют разную конфигурацию (всякие там сдвоенные ячейки и пр.). Суть такова, что я работаю с массивами, если вид таблицы скажем так, однороден на всем протяжении, проблем вообще нет, но с нестандартными таблицами я работаю в отдельной процедуре... В эту процедуру мне надо передать массив данных в качестве параметра, но в зависимости от имени листа я должен передавать разные массивы, и я не могу сообразить, как это сделать. В справке по VB нашёл описание массива массивов, где каждый элемент в свою очередь является массивом, мне бы это подошло, но почему-то при объявлении такого массива в VBA Excel ругается. Может есть другой способ перебрать массивы и подставить их в процедуру? Немного кода, чтобы было понятнее, о чём я прошу: Изначально всё происходит так: перебираю в цикле список имён листов и проверяю на "стандартность", если лист нестандартный, запускаю процедуру ExclusiveFilling. For sht_i = 0 To 15         ThisWorkbook.Sheets(shtArray(sht_i)).Select             If (shtArray(sht_i) = "Имя листа ") Or (shtArray(sht_i) = "Имя листа ") ... Or (shtArray(sht_i) = "Имя листа " Then                 ExclusiveFilling (shtArray(sht_i)) ... Сейчас я передаю только имя листа, уже в процедуре по нему идёт Select и действия. В итоге я должен получить заполненный массив данных, но при выходе из подпрограммы его значение теряется. Вот я и хотел из массива массивов выбрать массив (i) и передать в процедуру скажем по ссылке, что-то вроде такого ExclusiveFilling (, ) Как же мне создать массив массивов на VBA или посоветуйте другой способ добиться желаемого... Спасибо.

studassistent.ru

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

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

  1. Копирование значений из диапазона ячеек в массив
  2. Копирование значений из массива в диапазон ячеек
  3. Простейшие примеры обмена значениями

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

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

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (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

Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can't assign to array (Нельзя назначать массив).

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

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

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

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

vremya-ne-zhdet.ru