Darbe.ru

Быт техника Дарби
27 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Массив в vba excel примеры

Массив в vba excel примеры

Для данных типа String существует только одна операция — конкатенация (объединение). Например, результатом операции конкатенации трех строковых значений «Петр» & » » & «Иванович» будет строка «Петр Иванович». Возможно также использование другого оператора для операции конкатенации, например: «десяти» + «тысячник». Разница между этими выражениями состоит в том, что в первом случае операндами могут быть значения любого типа (они просто будут преобразовываться в строковые), а во втором — оба операнда должны иметь тип String.

Для работы со строками существует большое количество функций (таблица. Функции работы со строками).

Таблица «Функции работы со строками»

ФункцияОписаниеПример
Len(str)Определяет длину строкиИз а=lеn(«Персонажи») следует а=9
Left (<строка>, <длина>)Выделяет из аргумента <строка> указанное количество символов слеваLeft(» 1234string», 4) =»1234″
Right(<строка>, <длина>)Выделяет из аргумента <строка> указанное количество символов справаRight(» 1234string», 6) =»string»
Mid(<строка>, <старт> [, <длина>])Выделяет из аргумента <строка> подстроку с указанным числом символов, начиная с позиции <старт>Mid («12345678″, 4, 3) =»456»
Mid(<строка>, <старт>)Выделяется подстрока от позиции <старт> до конца строкиMid («12345678″, 4) =»45678»
LTrim (<строка>)Удаляет пробелы в начале строкиLTrim(» печать») =»печать»
RTrim (<строка>)Удаляет пробелы в конце строкиRTrim(«печать «) =»печать»
Trim (<строка>)Удаляет пробелы в начале и в конце строкиTrim(» печать «) =»печать»
InStr([<старт>, ] < строка 1>, <строка 2> [, <сравнение>])Производит поиск подстроки в строке. Возвращает позицию первого вхождения строки <строка 2> в строку <строка 1>, <старт> — позиция, с которой начинается поиск. Если этот аргумент пропущен, поиск начинается с начала строкиInstr(«C:Temp test.mdb», «Test»)=9 Если искомая строка не находится в указанной строке, функция возвращает 0
InStrRev ([<старт>, ] <строка 1>, <строка 2> [, <сравнение>])Ищет подстроку в строке, но начинает поиск с конца строки и возвращает позицию последнего вхождения подстроки. Необязательный аргумент <сравнение> определяет тип сравнения двух строк
Replace (<строка>, <строка Поиск>, <строка Замена>)Позволяет заменить в строке одну подстроку другой. Эта функция ищет все вхождения аргумента <строка Поиск> в аргументе <строка> и заменяет их на <строка Замена>

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

Для сравнения строковых значений также применяется оператор Like, который позволяет обнаруживать неточное совпадение, например выражение «Входной сигнал» Like «Вход*» будет иметь значение True, так как сравниваемая строка начинается со слова «Вход». Символ звездочка (*) в строке заменяет произвольное число символов. Другие символы, которые обрабатываются оператором Like в сравниваемой строке:

  • ? — любой символ (один);
  • #- одна цифра (0-9);
  • [<список>] — символ, совпадающий с одним из символов списка;
  • [!<список>] — символ, не совпадающий ни с одним из символов списка.

Следующие три функции позволяют работать с массивом строк

  • Split (<строка> [, <разделитель>]) — преобразует строку в массив подстрок. По умолчанию в качестве разделителя используется пробел. Данную функцию удобно использовать для разбиения предложения на слова. Однако можно указать в этой функции любой другой разделитель. Например, Split(3, «Это тестовое предложение») возвращает массив из трех строковых значений: «Это», «тестовое», «предложение».
  • Join (<массив Строк> [, <разделитель>]) — преобразует массив строк в одну строку с указанным разделителем.
  • Filter (<массив Строк>, <строка Поиск>[, <включение>] [, <сравнение>]) — просматривает массив строковых значений и ищет в нем все подстроки, совпадающие с заданной строкой.

Эта функция имеет четыре аргумента:

  • <строка Поиск> — искомая строка;
  • <включение> — параметр (boolean значение), который указывает, будут ли возвращаемые строки включать искомую подстроку или, наоборот, возвращаться будут только те строки массива, которые не содержат искомой строки в качестве подстроки;
  • <сравнение> — параметр, определяющий метод сравнения строк.

Еще три функции обеспечивают преобразование строк:

  • LCase (<строка>) — преобразует все символы строки к нижнему регистру, например функция LCase(«ПОЧTA») возвращает строку «почта»;
  • UCase (<строка>) — преобразует все символы строки к верхнему регистру;
  • StrConv (<строка>, <преобразование>) — выполняет несколько типов преобразований строки в зависимости от второго параметра. Этот параметр описывается встроенными константами, например функция StrConv(«poccия», VbProperCase) возвращает значение «Россия».

И последние две функции генерируют строки символов

  • Space (<число>) — создает строку, состоящую из указанного числа пробелов;
  • String (<число>, <символ>) — создает строку, состоящую из указанного в первом аргументе числа символов. Сам символ указывается во втором аргументе.

Пример

Создать программу, работающую со строковыми переменными. Для этого создать форму, в метки которой выходят следующие сообщения:

1 метка: сообщается длина строки, введенной в первое текстовое поле (1 строка);

2 метка: преобразует все символы третьего текстового поля (3 строка) в заглавные буквы;

3 метка: выводит вместе содержание первого и второго текстовых полей (1 и 2 строки).

Хороший фреймворк (framework) лучшее решение для безпроблемной работы со строками.

Массив в vba excel примеры

Профиль
Группа: Участник
Сообщений: 754
Регистрация: 23.12.2006

Репутация: 1
Всего: 2

Знаю что массив можно обьявить 2 способами

Код
Dim i As Variant
Dim A(5) As Byte

Dim B As Variant

B = Array(61, 27, 37, 44, 65,86)

Но если у меня 1000 или 10000 элементов то довольно не удобно писать
A(0) = 98
A(10000) = 5674

а вот в таком массиве нельзя обращаться к каждой ячейке ((

B = Array(61, 27, 37, 44, 65,86)

как лучше сделать помагите плиззз

Профиль
Группа: Участник
Сообщений: 245
Регистрация: 15.2.2008
Где: Красноярск

Репутация: 3
Всего: 4

Я думаю не открою Америки,сказав, что такие массивы обычно заполняются программно в цикле.. Поясни откуда ты берешь данные, так как конкретная реализация зависит от того, что служит у тебя источником данных-таблица Excel,БД,текстовый файл, XML-файл..Вариантов море, соответственно столько же может быть и ответов.
Вот частный пример работы с диапазоном в таблице Еxcel, взят из Дж.Уокенбах "Професссиональное программирование на VBA"

Код
' Следующий пример считываеn диапазон в массив Variant , выполняет простую операцию умножения
'над каждым элементом массива и перемещает массив Variant обратно в диапазон
Option Explicit

Sub RangeToVariant()
Dim UserRange As Range
Dim x As Variant
Dim r As Long, c As Integer
Set UserRange = Range("A1:L600")

'просмотр массива
For r = 1 To UBound(x, 1)
For c = 1 To UBound(x, 2)
' умножение на 2
x(r, c) = x(r, c) * 2
Next c
Next r

'Перемещение массива обратно на рабочий лист
Range("A1:L50") = x

Это сообщение отредактировал(а) LOPUH — 8.4.2008, 06:10

Профиль
Группа: Участник
Сообщений: 754
Регистрация: 23.12.2006

Репутация: 1
Всего: 2

LOPUH — незнаю как у вас в VBA )) но у нас в Delphi массивы можно обьявлять в программе и заполнять тоже.

LOPUH — кароче смысл такой, конечно можно былобы таскать за макросом txt файл с данными но нужно чтобы они были в нутри макроса.

Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: 7
Всего: 15

Цитата(LOPUH @ 8.4.2008, 03:05 )
Я думаю не открою Америки,сказав, что такие массивы обычно заполняются программно в цикле..
Цитата(RinOSpro @ 9.4.2008, 13:41 )
LOPUH — незнаю как у вас в VBA )) но у нас в Delphi массивы можно обьявлять в программе и заполнять тоже.

Найди 10 отличий.

А можно поподробнее, что за

Цитата(RinOSpro @ 9.4.2008, 13:41 )
txt файл с данными

? Если они там в формате csv, то это формат эксель понимает. Открываем файл, берем данные из ячеек.

Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 9
Всего: 109

Код
Private Sub CommandButton1_Click()
Dim M As Variant

M = Array(1, 2, 3, 4, 5, 6)

В твоём случае это будет удобнее всего.
И к каждой ячейке обращается на запись/чтение.

Добавлено @ 11:21

Цитата
Array Function

Returns a Variant containing an array.

The required arglist argument is a comma-delimited list of values that are assigned to the elements of the array contained within the Variant. If no arguments are specified, an array of zero length is created.

The notation used to refer to an element of an array consists of the variable name followed by parentheses containing an index number indicating the desired element. In the following example, the first statement creates a variable named A as a Variant. The second statement assigns an array to variable A. The last statement assigns the value contained in the second array element to another variable.

Dim A As Variant
A = Array(10,20,30)
B = A(2)

The lower bound of an array created using the Array function is determined by the lower bound specified with the Option Base statement, unless Array is qualified with the name of the type library (for example VBA.Array). If qualified with the type-library name, Array is unaffected by Option Base.

Note A Variant that is not declared as an array can still contain an array. A Variant variable can contain an array of any type, except fixed-length strings and user-defined types. Although a Variant containing an array is conceptually different from an array whose elements are of type Variant, the array elements are accessed in the same way.

Это сообщение отредактировал(а) mihanik — 12.4.2008, 11:26

Программистами не рождаются, — это родовая травма.
user posted image

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль «Помогите!» таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в «Книге отзывов о работе администрации»
  • А вот тут лежит FAQ нашего подраздела

Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »

[ Время генерации скрипта: 0.1054 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Циклы VBA

Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application. И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.

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

В данной статье мы разберём синтаксис и примеры следующих циклов в VBA:

  • For
  • For each
  • While
  • Until

Цикл For в VBA

Блок схема цикла for

Цикл for в VBA обычно используется при зацикливании фрагмента кода, если нам известно конечное значение counter — счетчика, при котором мы выйдем из цикла.
Возьмём для примера самый распространённый пример:

Сгенерировать массив из 5 целых значений

Обратите ваше внимание, что в этом примере используется неявное объявление при работе с циклами в VBA. i% — означает неявное объявление переменной i в формате integer. Такая конструкция по сути заменяет следующую: dim i as integer . Это используется для сокращения кода и для удобства написания и чтения. В старых версиях VBA необходимо указывать знак формата после каждого использования неявной переменной. В более поздних версиях достаточно всего один раз.

VBA для цикла for даёт возможность использовать функцию Step. Как ясно из перевода, это шаг, с которым мы будем проходить наш интервал. По умолчанию, он равен 1. Популярный вариант использования встречается в случаях, когда counter связан с переменной, используемой внутри цикла. Например, при написании программ, связанных с функциями.

Найти пересечение графика функции y = 5*x + 5 с осью ординат

И ещё один интересный пример:

Изменить размер шрифта и выравнить по центру текст в label

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

Цикл While в VBA

Цикл while VBA

Циклы в VBA, которые используют структуру Do..Loop (это while и until циклы) можно записывать с разным расположением фрагмента условия. Как видите на картинке выше, условие может проверяться после выполнения одной итерации, а может перед запуском цикла.
Самый популярный пример:

Отсортируйте по возрастанию сгенерированный массив методом пузырька

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

Цикл Until в VBA

Цикл Until VBA

Как видите, отличия от while крайне несущественные. Цикл Until в VBA можно реализовать с помощью конструкции while NOT (condition). Тем не менее, приведу пример:

Заставить пользователя ввести число

Почему заставить? Потому, что если пользователь закроет окно ввода, это его не спасёт, оно будет появляться вновь и вновь пока он не введёт любое число.

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

Формулы массива в Excel — от А до Я

Пример формулы массива в Excel

Пример формулы массива

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

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

  • узнаете все о формулах массива;
  • увидите множество примеров таких формул;
  • сможете начать активно их применять на практике.

Что такое формула массива

Формула массива (array formula) — это такая формула, в процессе вычисления которой создается один или несколько массивов. При этом не обязательно как результат вычисления, но и как промежуточный этап.

Будьте на 100% уверены: если формула

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

— это формула массива.

Слишком очевидно и все еще непонятно? Не беда — читаем далее.

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

Массивы в Excel

Массив (array) — это фиксированный набор элементов с фиксированным порядком. Иными словами, все элементы массива, включая их положение в нем, являются его неотъемлемой частью, их порядок и количество нельзя изменить.

Отличие массивов от диапазонов в Excel

В отличие от массива, диапазон (range) — это просто метод адресации к ячейкам в Excel, никак не связанный с самим их содержимым.

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

Содержимое диапазона также можно свободно сортировать, если в нем нет объединенных ячеек.

Если же на лист Excel выведен массив, ни сортировка строк, ни вставка строк и столбцов в середину диапазона, в который он выведен, не возможна — это нарушило бы само его определение.

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

Ошибка Excel при попытке нарушить целостность массива

Размерность массивов

Как массивы, так и диапазоны в Excel могут быть одномерными (вектор), двумерными (таблица) и трехмерными (многослойная таблица).

Одномерные массивы (векторы) в свою очередь могут быть вертикальными и горизонтальными.

два одномерных и один двумерный массив

Одномерные и двумерные массивы в Excel

Трехмерные массивы — довольно редко используемая на практике сущность.

Виды массивов

По типам элементов в них:
По типу данных —

  • числовой массив (массив чисел)
  • строковый массив (текстовые значения)
  • булевый массив (значения ИСТИНА-ЛОЖЬ)
  • смешанного типа

По изменяемости элементов —

  • массив констант,
  • вычисляемый массив

Методы создания массивов

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

Массив констант, созданный вручную

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

При этом разделителем между элементами слева направо является точка с запятой, а разделителем строк — двоеточие.

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

Именованный массив констант

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

Массив цифр как в примере ниже, поможет быстро найти цифры в текстовых ячейках.

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

Используем именованный массив

С помощью функций

Указанные выше методы создания массивов довольно редки на практике. Чаще всего массивы создаются автоматически при обращении различных функций к диапазонам в Excel.

Единственное условие для создания массива с помощью функции — функция не должна обладать агрегирующим свойством. Например, СУММ, СРЗНАЧ не создадут массив при обращении к диапазону.

На этом сайте есть статья — как дописать символ, слово или текст к нескольким ячейкам. Там рассматриваются несколько способов, в том числе без создания дополнительного столбца. Но вот еще один — с помощью функции СЦЕПИТЬ и формулы массива:

Формула массива с функциями СЦЕПИТЬ и СИМВОЛ

Кавычки-ёлочки в этой формуле нам помогает создать функция СИМВОЛ.

С помощью математических операторов

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

Массивы в Excel, полученные с помощью математических операторов

С помощью операторов сравнения

Аналогично математическим операторам, массивы создаются при сравнении диапазонов с константой или значением ячейки. Результатом операции сравнения являются значения ИСТИНА или ЛОЖЬ.

Массивы в Excel, полученные с помощью операторов сравнения

С помощью других массивов

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

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

Размер результирующего массива в таком случае будет аналогичен размеру массива констант.

Еще раз обратите внимание на разделители строк и столбцов в массивах. Столбцы разделяются точкой с запятой, строки — двоеточием.

С помощью комбинаций указанных методов

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

Вывод массива на лист

Для корректного вывода массива на лист нужно выделить диапазон ячеек эквивалентной размерности и размера, использовать метод создания массива (вручную или формулой), и нажать

Если выделить недостаточное количество ячеек — будут выведены не все элементы массива, а только те, что соответствуют по порядку.
Если выделить избыточное количество — лишние ячейки выдадут ошибку #Н/Д.

На примере результирующий массив должен быть размером 5*5, но перед вводом формулы массива был выделен диапазон 6*6.

Взаимодействие функций Excel с массивами

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

Однако, есть ряд функций, называемых агрегирующими. Если им на вход подается диапазон или массив, они возвращают единственное результирующее значение. Самая популярная — функция СУММ. Но есть и множество других.

Из раздела математических функций к таковым также относятся ПРОИЗВЕД, СУММПРОИЗВ, СУММЕСЛИ, СУММЕСЛИМН.

Практически все статистические функции по природе берут на вход диапазон или массив и возвращают одно число. Наиболее популярные из них — СРЗНАЧ, МИН, МАКС, СЧЁТ, СЧЁТЗ, СЧЁТЕСЛИ.

Среди логических функций агрегирующим свойством обладают функция И и функция ИЛИ.

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

  • учитывают весь массив
  • выводят одно значение

ВЫБОР, ВПР, ГПР, ИНДЕКС, ПОИСКПОЗ — эти функции поиска используются наиболее часто.

Формулы массива — примеры формул

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

Синтаксис VBA Переменные, константы и типы данных

Переменные — контейнеры для хранения изменяемых данных. Без них не обходится практически ни одна программа. Для простоты переменную можно сравнить с номерком в гардеробе — вы сдаете в «гардероб» какие-то данные, в ответ вам выдается номерок. Когда вам опять потребовались эти данные, вы «предъявляете номерок» и получаете их. Пример работы с переменными в VBA может выглядеть так:

Dim nMyAge As Integer

nMyAge = nMyAge + 10

Перед работой с переменной настоятельно рекомендуется ее объявить. Объявление переменной в нашем примере выглядит так:

Dim nMyAge As Integer

Как расшифровать эту строку:

Dim — это область видимости переменной. В VBA предусмотрено 4 ключевых слова для определения области видимости переменных:

  • Dim — используется в большинстве случаев. Если переменная объявлена как Dim в области объявлений модуля, она будет доступна во всем модуле, если в процедуре — только на время работы этой процедуры;
  • Private — при объявлении переменных в VBA значит то же, что и Dim;
  • Public — такая переменная будет доступна всем процедурам во всех модулях данного проекта, если вы объявили ее в области объявлений модуля. Если вы объявили ее внутри процедуры, она будет вести себя как Dim/Private;
  • Static — такие переменные можно использовать только внутри процедуры. Эти переменные видны только внутри процедуры, в которой они объявлены, зато они сохраняют свое значение между разными вызовами этой процедуры. Обычно используются для накопления каких-либо значений. Например:

Static nVar1 As Integer

nVar1 = nVar1 + 1

Если нет никаких особых требований, то есть смысл всегда выбирать область видимости Dim.

Второе слово в нашем объявление (nMyAge) — это идентификатор (проще говоря, имя) переменной. Правила выбора имен в VBA едины для многих элементов (переменные, константы, функции и процедуры и т.п.). Имя:

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

При создании программ VBA настоятельно рекомендуется определиться с правилами, по которым будут присваиваться имена объектам — соглашение об именовании. Чаще всего используется так называемое венгерское соглашение (в честь одного из программистов Microsoft, Charles Simonyi, венгра по национальности):

  • имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
    • str (или s) — String, символьное значение;
    • fn (или f) — функция;
    • c (или сделать все буквы заглавными) — константа;
    • b — Boolean, логическое значение (true или false);
    • d — дата;
    • obj (или o) — ссылка на объект;
    • n — числовое значение.
    • в ранних версиях VB не было слова Const — все константы определялись как переменные, а для отличия их записывали заглавными буквами, между словами ставили подчеркивания:

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

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

    В VBA предусмотрены следующие типы данных:

    • числовые (byte — целое число от 0 до 255, integer — целое число от -32768 до 32767, long — большое целое число, currency (большое десятичное число с 19 позициями, включая 4 позиции после запятой), decimal (еще большее десятичное число с 29 позициями), single и double — значение с плавающей запятой (double в два раза больше));

    Внимание! Попытка объявить переменную с типом Decimal (например, Dim n As Decimal) приведет к синтаксической ошибке. Чтобы получить возможность работать с типом Decimal, переменную нужно изначально объявить как Variant или вообще объявить без типа (Dim n), поскольку тип данных Variant используется в VBA по умолчанию.

    • строковые (string переменной длины (до примерно 2 млрд символов) и фиксированной длины (до примерно 65400 символов);
    • дата и время (date — от 01.01.100 до 31.12.9999);
    • логический (boolean — может хранить только значения True и False);
    • объектный (object — хранит ссылку на любой объект в памяти);
    • Variant — специальный тип данных, который может хранить любые другие типы данных.

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

    Некоторые моменты, связанные с выбором типов данных для переменных:

    • общий принцип — выбирайте наименьший тип данных, который может вместить выбранные вами значения. Если есть какие-то сомнения — выбирайте больший тип данных во избежание возникновения ошибок;
    • если есть возможность, лучше не использовать типы данных с плавающей запятой (single и double). Работа с такими типами данных производится медленнее, кроме того, могут быть проблемы при сравнениях за счет округлений;
    • если есть возможность, лучше не пользоваться типом Variant. Этот тип все равно приводится VBA к одному из других типов, но памяти для него требуется больше. Кроме того, в ходе такого неявного образования могут возникнуть ошибки;
    • при определении переменных можно использовать так называемые символы определения типа (% — integer, $ — String и т.п.). Например, в нашем примере нужно закомментировать строку Dim nVar 1 As Integer, а во второй строке написать:

    Такой подход является устаревшим и к использованию не рекомендуется.

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

    В этом случае переменная будет автоматически объявлена с типом Variant.

    В принципе, в VBA можно работать и без объявления переменных. Например, такой код

    nVar1 = nVar1 + 1

    будет вполне работоспособным. Если мы используем переменную в программе без ее объявления, то будет автоматически создана новая переменная типа Variant. Однако объявлять переменные нужно обязательно! И при этом желательно явно указывать нужный тип данных. Почему:

    • сокращается количество ошибок: программа с самого начала откажется принимать в переменную значение неправильно типа (например, строковое вместо числового);
    • при работе с объектами подсказка по свойствам и методам действует только тогда, когда мы изначально объявили объектную переменную с нужным типом. Например, в Excel два варианта кода будут работать одинаково:

    Dim oWbk As Workbook

    Set oWbk = Workbooks.Add()

    Set oWbk = Workbooks.Add()

    Но подсказка по свойствам и методам объекта oWbk будет работать только во втором случае.

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

    а можно вставлять эту команду во все модули при их создании автоматически — установив в окне редактора кода флажок Require Variable Declarations (меню Tools -> Options, вкладка Editor).

    Проиллюстрировать, зачем они это делают, можно на простом примере:

    С виду код не должен вызывать никаких проблем и просто выводить в окне сообщения единицу. На самом деле он выведет пустое окно сообщения. Причина спрятана очень коварно: в третьей строке n — это вовсе не английская буква N, а русская П. На вид в окне редактора кода отличить их очень сложно. В то же время компилятор VBA, встретив такой код, просто создаст новую переменную с типом данных Variant, у которой будет пустое значение. На выявление такой ошибки может потребоваться определенное время.

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

    Можно объявить несколько переменных в одной строке, например, так:

    Dim n1 As Integer, s1 As String

    Присвоение значений переменным выглядит так:

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

    nVar1 = nVar1 + 1

    В обоих примерах знак равенства означает не «равно», а присвоить.

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

    • строковые значения всегда заключаются в двойные кавычки:
    • значение даты/времени заключаются в «решетки» — символы фунта:

    Обратите внимание, что при присвоении значения даты/времени таким «явным способом» нам придется использовать принятые в США стандарты: 05 в данном случае — это месяц, 06 — день. Отображение же этого значения (например, в окне сообщения) будет зависеть от региональных настроек на компьютере пользователя.

    Если нужно передать шестнадцатеричное значение, то перед ним ставятся символы &H:

    Что содержится в переменных до присвоения им значений?

    • В переменных всех числовых типов данных — 0.
    • В строковых переменных переменной длины — «» (строка нулевой длины).
    • В строковых переменных фиксированной длины — строка данной длины с символами ASCII 0 (эти символы на экран не выводятся).
    • В Variant — пустое значение.
    • В Object — ничто (нет ссылки ни на один из объектов).

    Константы, объявление, ключевое слово Const, встроенные константы, vbCrLf

    Константы — еще один контейнер для хранения данных, но, в отличие от переменных, они не изменяются в ходе выполнения VBA-программы. Для чего нужны константы:

    • код становится лучше читаемым/убираются потенциальные ошибки;
    • чтобы изменить какое-либо значение, которое много раз используется в программе (например, уровень налога) — это можно сделать один раз.

    В VBA константы определяются при помощи ключевого слова Const:

    Const COMP_NAME As String = “Microsoft”

    При попытке в теле процедуры изменить значение константы будет выдано сообщение об ошибке.

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

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

    В VBA встроено множество служебных констант: календарных, для работы с файлами, цветами, формами, типами дисков и т.п. Просмотреть их можно через справочную систему VBA: Microsoft Visual Basic Documentation -> Visual Basic Reference -> Constants. Про одну из констант (она находится в разделе Miscellaneous) следует сказать особо: константа vbCrLf позволяет произвести переход на новую строку. Например:

    MsgBox («Первая строка» + vbCrLf + «Вторая строка»)

    Множество наборов констант встроено в объектные модели, которые мы будем рассматривать в последних разделах.

    голоса
    Рейтинг статьи
    Читайте так же:
    Как в проводнике отобразить скрытые файлы
Ссылка на основную публикацию
Adblock
detector