`
к оглавлению   к 4GL - визуальному программированию

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА VBA

Типы данных

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

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

Тип данных

Размер (байт)

Диапазон значений

Byte (байт)

1

От 0 до 255

Boolean (логический)

2

True или False

Integer (целое число)

2

От -32 768 до 32 767

Long (длинное целое число)

4

От -2 1 47 483 648 до 2 1 47 483 647

single (число с плавающей запятой обычной точности)

4

От -3.402823Е38 до ‑1.401298Е-45 для отрицательных значений;
от 1.401298Е-45 до 3.402823Е38 для положительных значений

Double (число с плавающей запятой двойной точности)


8

От -1 ,7976931 3486232Е308 до -4.94065645841 247Е-324 для отрицательных значений;

от 4.94065645841 247Е-324 до 1.79769313486232Е308 для положительных значений

Currency (денежный)

8

От -922 337 203685477.5808 до 922337203685477.5807

Тип данных

Размер (байт)

Диапазон значений

Decimal (масштабируемое целое число)

14

+/-792281 6251 4264337593543950335 с 28 знаками справа от запятой; минимальное ненулевое значение имеет вид

+/-0,0000000000000000000000000001

Date (даты и время)

8

От 1 января 100 г. до 31 декабря 9999 г.

Ob j ect (объект)

4

Любой указатель объекта

string (строка переменной длины)

10 + длина строки

От 0 до приблизительно 2 миллиардов

string (строка постоянной длины)

Длина строки

От 1 до приблизительно 65 400

Variant (числовые подтипы)

16

Любое числовое значение вплоть до границ диапазона для типа Double

Variant (строковые подтипы)

22 + длина строки

Как для строки (string) переменной длины

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

Объем определяется элементами

Диапазон каждого элемента определяется его типом данных

Описание переменных

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

Синтаксис:

Dim [WithEvents] ИмяПеременной[([Индексы])] [As [New] Тип]

[,[WithEvents] ИмяПеременной[([Индексы])] [As [New] Тип]] . . .

Аргументы:

WithEvents

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

ИмяПеременной

Имя переменной, удовлетворяющее стандартным правилам именования переменных

Индексы

Размерности переменной массива; допускается описание до 60 размерностей. Для задания аргумента индексы используется следующий синтаксис:

[Нижний То] Верхний [, [Нижний То] Верхний] ...

Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией option Base. Если отсутствует инструкция option Base, нижняя граница массива равняется нулю

New

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

Тип

Тип данных переменной. Для каждой описываемой переменной следует использовать отдельное предложение As Тип

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

Инструкция Dim предназначена для описания типа данных переменной на уровне модуля или процедуры. Например, следующая инструкция описывает переменную с типом integer.

Dim N As Integer

Инструкция Dim предназначена также для описания объектного типа переменных. Далее приводится описание переменной для нового экземпляра рабочего листа.

Dim X As New Worksheet

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

Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefTnn, по умолчанию переменная получает тип variant. Для обязательного описания всех переменных надо поместить в начале модуля инструкцию option Explicit. Использование этой инструкции полезно при отладке программ, т. к. она позволяет легче отслеживать возможную путаницу в именах при наборе программы.

Допустимые имена

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

  1. Длина имени не должна превышать 255 символов.
  2. Имя не может содержать точек, пробелов и следующих символов: %, .&,
    !, #, @, $.
  3. Имя может содержать любую комбинацию букв, цифр и символов, начинающуюся с буквы.
  4. Имена должны быть уникальны внутри области, в которой они определены.
  5. Не следует использовать имена, совпадающие с ключевыми словами VBA и именами встроенных функций и процедур.

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

процентная

ставка х_начзнач

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

ПроцентнаяСтавка

х_НачЗнач

Инструкция DefТип

Инструкция DefTиn (вместо тип в имени инструкции фигурируют буквы, обозначающие конкретный тип данных) используется на уровне модуля для задания типа данных по умолчанию для переменных, аргументов, передаваемых в процедуры, и значений, возвращаемых процедурами Function и Property Get, имена которых начинаются с соответствующих символов.

Синтаксис:

DefBool ДиапазонБукв [ , ДиапазонБукв] ...

Тип данных Boolean

DefByte ДиапазонБукв!, ДиапазонБукв] ...

Тип данных Byte

Deflnt ДиапазонБукв [ , ДиапазонБукв] ...

Тип данных Integer

DefLng ДиапазонБукв!, ДиапазонБукв] ...

Тип данных Long

DefCur ДиапазонБукв [, ДиапазонБукв] ...

Тип данных Currency

DefSng ДиапазонБукв [, ДиапазонБукв] ...

Тип данных Single

DefDbl ДиапазонБукв [, ДиапазонБукв] ...

Тип данных Double

DefDate ДиапазонБукв [, ДиапазонБукв] ...

Тип данных Date

DefStr ДиапазонБукв [, ДиапазонБукв] ...

Тип данных String

DefObj ДиапазонБукв [, ДиапазонБукв] ...

Тип данных Оbject

DefVar ДиапазонБукв [, ДиапазонБукв] ...

Тип данных Variant

Аргумент ДиапазонБукв имеет следующий синтаксис:

Буква1[-Буква2]

Аргументы Буква1 и Буква2 указывают границы диапазона имен, для которых задается тип данных по умолчанию.

В следующем примере инструкция устанавливает, что все переменные с именами, начинающимися с букв из диапазона от А до Q, имеют строковый тип:

DefStr A-Q

Инструкция Def Тип действует только на модуль, в котором она используется.

При указании диапазона букв обычно определяется тип данных по умолчанию для переменных, которые начинаются с первых 128 символов набора. Однако при указании диапазона A—Z задается тип данных по умолчанию для всех переменных, включая те, что начинаются с международных символов из расширенной части набора (128-255).

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

*

Integer

&

Long

|

Single

#

Double

@

Currency

$

String

 

Массивы

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

Dim B(3, 3) As Single

Dim A(12) As Integer

Первая строка объявляет двумерный массив 3x3 (матрицу), состоящий из действительных чисел. Вторая строка объявляет одномерный массив (вектор) из 12 целых чисел, причем по умолчанию первый элемент массива будет А(0), а последний А(11). В этом случае говорят, что о — базовый индеке. Можно изменить базовый индекс, написав в начале листа модуля инструкцию Option Base1. После этого индексы массивов А и В будут начинаться с единицы. Другим способом изменения базового индекса является использование ключевого слова то при объявлении массива:

Dim B(l То 3, 1 То 3) As Single

Dim A(l To 12) As Integer

Массив в программе определяется поэлементно. Например,

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

B(l,l)=2

В(1,2)=4

В(2,1)=1

В(1,2)=6

Удобным способом определения одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в вектор из этих значений, и присваивающая их переменной типа variant. Например,

Dim A As Variant

А = Аггау(10,20,30)

В = А(2)

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

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

Dim R() As Single

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

Синтаксис:

ReDim [Preserve] ИмяПеременной(Индексы) [As Тип] [, ИмяПеременной(Индексы) [As Тип]] ...

Аргументы:

| Preserve

Ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности

ИмяПеременной

Имя переменной, удовлетворяющее стандартным правилам именования переменных

Индексы

Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис:

[Нижний То] Верхний [, [Нижний То] Верхний] . . .

Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция option Base, нижняя граница массива равняется нулю

Тип

Тип данных массива

Например, установим границы массивы R:

ReDim R(l To 10)

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

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

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

Array (СписокАргументов)

Создает массив типа variant. Аргумент спи-сокАргументов представляет разделенный запятыми список значений, присваиваемых элементам массива. Пример:

Dim День As Variant День = Array ("Пн", "Вт", "Ср", "Чт", "Пт")

IsArray (ИмяПеременной)

Возвращает True, если переменная содержит массив; в противном случае возвращается False. Функцию IsArray используют дляпроверки значений переменных типа variant, содержащих массивы

LBound (ИмяМассива [, Размерность])

и

Ubound (ИмяМассива

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

  • ИмяМассива — имя переменной массива

[, Размерность])

  • Размерность — целое число, указывающее размерность, нижнюю или верхнюю границу которой возвращает функция. Для первой размерности следует указать 1, для второй 2 и т. д. Если аргумент Размерность опущен, подразумевается значение 1


Erase СписокМассивов

Повторно инициализирует элементы массивов фиксированной длины и освобождает память, отведенную для динамического массива, списокМассивов представляет имена одной или нескольких очищаемых переменных массивов, разделенных запятой. Инструкция Erase устанавливает элементы массивов фиксированной длины следующим образом: массив чисел или строк фиксированной длины (присваивает каждому элементу значение 0), массив строк переменной длины (присваивает каждому элементу значение пустой строки), массив типа variant (присваивает каждому элементу значение Empty). Erase освобождает память, используемую динамическими массивами. Перед тем как из программы вновь появится возможность сослаться на динамический массив, необходимо переопределить размерности переменной массива с помощью инструкции ReDim.

 

Константы

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

Синтаксис:

[Public | Private] Const ИмяКонстанты [As Тип] = Выражение

Аргументы:

Public

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

Private

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

ИмяКонстанты

Имя константы, удовлетворяющее стандартным правилам именования переменных

Тип


Один из поддерживаемых типов данных: Byte, Boolean, Integer, Long, Currency, Single, Double. Decimal (в настоящее время не поддерживается), Date, string или variant. Для каждой описываемой константы следует использовать отдельное предложение AS тип

Выражение

Литерал, другая константа или любое сочетание, которое включает все арифметические или логические операторы, за исключением is

Пример:

Const ПроцентнаяСтавка As Single = 0.2

Const Фирма = "OOO Бескрайние просторы"

Тип данных, определенный пользователем

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

Синтаксис:

[Private | Public] Type ИмяПеременной ИмяЭлемента [([Индексы])] Аs тип [ИмяЭлемента [([Индексы])] As тип]

End Type

Аргументы:

Public

Используется телем типов, всех модулях для описания определяемых пользова-которые доступны для всех процедур во всех проектов

 

Private

Используется для описания определяемых пользователем типов, которые доступны только в модуле, в котором выполняется описание

ИмяПеременной

Имя типа, определяемого пользователем

ИмяЭлемента

Имя элемента, определяемого пользователем типа

Индексы

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

[Нижний То] Верхний [, [Нижний То] Верхний] . .

Тип

Тип данных элемента; поддерживаются типы: Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (для строк переменной длины), String* длина (для строк фиксированной длинны), Object, variant и другой, определяемый пользователем тип или объектный тип

В данном примере инструкция туре используется для определения типа данных (только на уровне модуля). При появлении в модуле класса инструкции туре должно предшествовать ключевое слово Private. '

' Тип, определенный пользователем

Туре Студент '

' Элементы типа данных

'

Фамилия As String * 20 Имя As String * 20

Отчество As String * 20 НомерЗачетки As Integer

Группа As String * 10 Курс As Long

ДатаРождения As Date

End Type

Sub ВводДанных()

' Описание переменной Экономист

'

Dim Экономист As Студент

' Присвоение значений элементам переменной Экономист

With Экономист

.НомерЗачетки = 12003

.Группа = "Менеджмент"

End With

End Sub

Можно создавать массив, содержащий элементы собственного типа. Например, следующий массив состоит из сведений о 20 студентах.

Dim СтудентЭкономист(1 to 20) As Студент

' Присваивает значения элементам первой компоненты массива

CтудентЭкономист(1). Фамилия = "Промокашкин"

CтудентЭкономист(1).

Имя = "Евстегней" СтудентЭкономист(1).

Отчество = "Поликарпович"

к оглавлению   к 4GL - визуальному программированию

Знаете ли Вы, в чем фокус эксперимента Майкельсона?

Эксперимент А. Майкельсона, Майкельсона - Морли - действительно является цирковым фокусом, загипнотизировавшим физиков на 120 лет.

Дело в том, что в его постановке и выводах произведена подмена, аналогичная подмене в школьной шуточной задачке на сообразительность, в которой спрашивается:
- Cколько яблок на березе, если на одной ветке их 5, на другой ветке - 10 и так далее
При этом внимание учеников намеренно отвлекается от того основополагающего факта, что на березе яблоки не растут, в принципе.

В эксперименте Майкельсона ставится вопрос о движении эфира относительно покоящегося в лабораторной системе интерферометра. Однако, если мы ищем эфир, как базовую материю, из которой состоит всё вещество интерферометра, лаборатории, да и Земли в целом, то, естественно, эфир тоже будет неподвижен, так как земное вещество есть всего навсего определенным образом структурированный эфир, и никак не может двигаться относительно самого себя.

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

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution