ТОП 10:

Пользовательские типы данных. Структуры



Для создания новых типов данных используется оператор Type. Его формат:

Type имя

.......тело структуры

End Type

Например,

Type Client

Name As String

Phone As String

birthday As Date

End Type

Далее можно объявить

Dim MyClient(199) As Client

Для доступа к элементу структуры используется точка (как в СИ), например,

MyClient(k).Name=”Николай”.

Динамическое перераспределение памяти

Для динамического перераспределения памяти применяется оператор ReDim .

Синтаксис: ReDim [Preserve] Var1 (индексы) [As тип] , Var2 (индексы) [As тип]].

Здесь Var1, Var2,… - имена переменных, Preserve - необязательный параметр, ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности.

Оператор ReDim используется для задания или изменения размера динамического массива, который уже был формально описан с помощью оператора Private, Public или Dim с пустыми скобками (без индексов размерностей).

Пример:

Оператор Комментарий
Dim MyArray() As Single Начальное объявление типа (Single)
num=Selection. Rows.Count Число строк в выделенном массиве ячеек Excel
ReDim MyArray (num) Выделяется память для массива MyArray, размерностью num

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

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

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

ReDim X(10, 10)

. . .

ReDim Preserve X(10, 15)

 

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

Константы

Объявление константы определяется ключевым словом Const, например

Const Blue=5.

Видимость переменных и констант

Видимость переменных и констант аналогична СИ. Чтобы сделать переменную доступной всем процедурам во всех модулях, вместо Dim используется ключевое слово Public

 

Операторы присваивания

Специфика VB

- Слева от знака равенства может быть записано некоторое свойство объекта (см. выше).

- Чтобы присвоить значение объектной переменной, используется ключевое слово Set, например:

Dim Myobject As Object

Set Myobject=ActiveSheet.Range(“B5”)

Myobject.Value=5

Математические и строковые операции

Специфичные для Basic математические операции:

Операция Назначение Операция Назначение
^ Возведение в степень \ Деление нацело
Mod Остаток от деления & Объединение строк

Встроенные математические функции, не требующие пояснений: Sin(), Cos(), Tan(), Atn(), Abs(), Exp(), а также: Log() -натуральный логарифм, Sqr() - квадратный корень, Randomize() - начальная инициализация генератора случайных чисел, Rnd() - генерация случайных чисел, Sgn() - знак числа, Fix() - целая часть с отсечением дробной части, Int() - целая часть с округлением. Другие вложенные функции можно найти в справке по VB (справочное руководство по VB, раздел функции).

Как правило, в комплект установки Excel входит файл Funcs.xls, где перечислены и описаны все встроенные функции Excel не только в русской, но и английской идентификации. Рекомендуем вам ознакомиться с этим файлом.

Часто в приложениях используются Строковые функции:

Функция Назначение Функция Назначение
StrComp Сравнение строк Lset Выравнивание по левому краю
Lcase Нижний регистр Rset Выравнивание по правому краю
Ucase Верхний регистр Left Выделение левой части строки
Space Строка пробелов Right Выделение правой части строки
String Строка символов Mid Выделение или перемещение подстроки
Len Длина строки Ltrim Удаление пробелов слева
Instr Поиск полстроки Rtrim Удаление пробелов справа
Asc ASCII - код Trim Удаление пробелов с двух сторон
Chr Символ по ASCII - коду Format Число - в строку по формату
Str Число - в строку Hex Шестнадцатеричное число - в строку
Val Строка - в число Oct восьмеричное число - в строку

Процедуры

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

Формат

Sub имя (аргументы)

Тело процедуры

End Sub

Формальные аргументы в заголовке процедуры должны быть описаны по типам.

Различают четыре типа процедур: Общие, Командные, Обработки событий, Функции.

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

Командные процедуры. Их функционирование аналогично директивам меню. Процедуры, созданные макрорекордером - пример таких процедур. Обычно командные процедуры не имеют аргументов. При необходимости они получают данные через диалоговые окна.

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

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

Для того чтобы процедура запускалась, когда активизируется таблица, приравняйте имя процедуры к свойству OnSheetActivate конкретного объекта таблицы. Например, записанный в процедуре Auto_Open оператор

Worksheets("ТКЗ"). OnSheetActivate = "MySub”

запускает процедуру MySub всякий раз, когда пользователь активизирует лист ТКЗ.

Аналогично используется свойство OnSheetDeactivate (при деактивации объекта).

Если используется объект Application, процедура будет выполняться каждый раз, когда пользователь активизирует таблицу.

Вызов процедуры

Как правило, процедуры закрепляются за командными кнопками, меню, клавишами клавиатуры и др. Из других программных процедур или функций процедура вызывается по имени. Фактические параметры (в отличие от СИ) записываются без скобок. Кроме упорядоченного списка, разделенного запятыми, фактические параметры можно передавать поименованным списком, где используется имя переменной из вызываемой процедуры (формальный параметр), затем знак присваивания (:=) и далее фактический аргумент. Аргументы при этом могут и не соответствовать порядку, указанному в названии процедуры. Использование поименованных списков удобно для процедур с большим количеством аргументов, где не всегда очевидно, какое значение какой переменной передается.

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

[Горсети.xls]. [Mod1].mysub

Для того чтобы сделать процедуру недоступной из другого модуля, используйте ключевое слово Private, например Private Sub Proc1().

Примеры процедуры с аргументами

Sub Multyply (Val1 As Single, Val2 As Single, Product As Single)

Product= Val1* Val2

End Sub

 

Sub main

Result As Single

Multyply 5,7, Result ' Обращение к функции Multyply с параметрами 5,7, Result

Debug.Print Result ' Вывод результата на отладочную панель

End Sub

Вызов процедуры Multyply можно записать с поименованным списком:

Multyply Result:= Product, Val1:=5, Val2:= 7

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

· Выполнить отладку данных функций. Проверить их работу.

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

Необязательные аргументы записываются в конце списка аргументов. Перед ними ставится ключевое слово Optional. Переменная справа от Optional должна иметь тип Variant.

Пример

Sub Multyply (Product As Single, Val1 As Single, Optional Val2)

If IsMissing (Val2) Then Val2=10 ' проверка: задана ли переменная Val2?

Product= Val1* Val2

End Sub

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

Пример

Sub Multyply (Product As Single, ParamArray Value())

Dim Val As Variant

Product=1

For Each Val in Value ' Цикл для объектов : для каждого элемента в массиве Value…

Product= Product * Val

Next Val

End Sub

 

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

· Напишите и выполните отладку процедуры, которая складывает два аргумента и возвращает результат в третьем. Вызов данной процедуры осуществляется из другой процедуры.

· Напишите и выполните отладку процедуры ss1, которая складывает список аргументов - действительных чисел и возвращает сумму (руководствуйтесь приведенным выше аналогом). Выполните расчеты для двух, трех, четырех аргументов.

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

· Создайте стартовую процедуру, которая выполняется при старте Excel и печатает "Добрый день, господа студенты!" где-нибудь в центре экрана.

Функции

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

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

В отличие от СИ процедура-функция не имеет оператора RETURN , поэтому в теле процедуры обязательно должен присутствовать оператор присвоения некоторого значения идентификатору функции.

В разрабатываемой процедуре можно использовать не только собственные функции или функции VB, но встроенные функции Excel. Все функции таблиц подключены к объекту Application. Например, в операторе n = Application.Min(n1, n2) используется функция Min() из библиотеки Excel.

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

 

Передача массива

Массив констант заключается в фигурные скобки. Элементы массива записываются через запятую построчно. Разделители строк - точка с запятой. Например, массив их двух строк и трех столбцов записывается в виде{1,3,4; 2,4,3}.

Ссылка на область, например А2:С6, передается как объект Range. Соответствующий аргумент функции должен принадлежать к типу Variant. Массив станет объектом. Доступ к элементам массива осуществляется обычным способом - с помощью круглых скобок и индексов.

Пользовательской функции можно передавать и Excel-объекты (например, блоки ячеек). Доступ к отдельным элементам можно реализовать, например, с помощью метода Cells, но лучше использовать оператор цикла For Each. В приведенном ниже примере программа обрабатывает как массивы, так и отдельные блоки ячеек. Однако левая программа не может обрабатывать составные ссылки на области, например, А3:С8; В2:В8. Для этого нужно организовывать вложенные циклы, часто с проверкой, чем является элемент внутреннего цикла - объектом или массивом. В списке аргументов указывается ключевое слово ParamArray.

Function Multyply (Value)As Single Dim Product As Single, Val ‘(Val имеет тип Variant) Product=1 For Each Val in Value Product= Product * Val Next Val Multyply= Product End Function Function Multyply(ParamArray Value()) As Single Dim Product As Single, Val, Part Product = 1 For Each Val In Value For Each Part In Val Product = Product * Part Next Part Next Val Multyply = Product End Function

 

Для проверки типа элемента часто используется функция TypeName(), например

If TypeName(Part)=”Range” Or Right(TypeName(Part),2)=”()” Then

Для передачи массива из функции в таблицу необходимо, чтобы функция возвращала тип Variant.







Последнее изменение этой страницы: 2016-08-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.215.182.81 (0.012 с.)