Visual basic for applications (vba)
Вид материала | Документы |
- Myreferatik at ua, 109.55kb.
- Краткий курс по изучению языка программирования Visual Basic, 357.37kb.
- Даний курс призначений для тих, хто: ніколи не програмував, але хоче навчитися, 360.9kb.
- Применение Microsoft Excel для обработки табличных данных. Выполнение расчетов в таблицах, 14.68kb.
- План Введение. Начало пути. Редактирование, удаление, переименование и назначение макросов, 283.36kb.
- Лекция Основы программирования Эта лекция введение в Visual Basic for Applications,, 208.31kb.
- Н. Г. Волчёнков программирование на visual basic 6 Учебное пособие, 128.99kb.
- Тема урока: Массивы в Visual Basic, 35.5kb.
- Vba(Visual Basic for Application), 276.36kb.
- Программа дисциплины visual Basic для приложений дпп. В. 01 Для специальности, 141.22kb.
Dim intA As Integer
strA = "Строковая переменная"
intA = Len(strA) ' Результат: 20
449
В том случае, когда параметром функции Len является переменная не строкового типа, тогда ее результатом будет являться объем памяти в байтах, который занимает эта переменная.
Например:
Dim bytA As Byte
Dim intA As Integer
Dim IngA As Long
Dim intR As Integer
intR = Len(bytA) ' Результат: 1
intR = Len(intA) ' Результат: 2
intR = Len(IngA) ' Результат: 4
Если в качестве параметра функции Len используется переменная типа Variant, содержимое которой можно представить в виде строки, то результатом будет количество символов, содержащееся в ней.
Например:
Dim vntA
Dim intA As Integer
vntA = -15.68
intA = Len(vntA) ' Результат: 6
Нередко в программе возникает необходимость выделения из строковой переменной той или иной ее части. В этом случае следует использовать одну из функций: Left, Right или Mid.
Left. Применяется для выделения подстроки в начале исходной строки. Формат данной функции следующий:
Left(строка, количество)
Результатом функции Left является строка с указанным количеством символов, находящаяся в начале исходной строки.
Right. Используется при выделении подстроки в конце исходной строки. Функция имеет такой формат:
Right(строка, количество)
Функция Right возвращает строку с указанным количеством символов, расположенную в конце исходной строки.
450
Mid. Применяется для выделения подстроки в середине исходной строки. Данная функция имеет следующий формат:
Mid(строка, номер, [количество])
Результатом функции Mid является строка с указанным количеством символов, находящаяся в исходной строке, начиная с определенного номера. Если количество символов не указывается, то строка выделяется до конца, т. е. в этом случае Mid будет аналогом функции Right, но с другим параметром
(Right; количество = "сколько выделять";
Mid: номер = "откуда начинать").
Ниже приводится пример использования рассмотренных функций.
Dim strA As String
Dim strB As String
strA = "Это строковая переменная"
strB = Left(strA, 3)
' Результат; "Это" strB = Right(strA, 10)
' Результат: "переменная" strB = Mid (strA, 5, 9)
' Результат; "строковая"
Работа с датой и временем
При необходимости работы со значениями, обозначающими дату или время, соответствующая переменная должна иметь тип Date, диапазон значений которой находится в пределах от 1 января 100 года до 31 декабря 1999 года.
В языке Visual Basic для работы с датой и временем используется ряд форматов, общим для которых является то, что значения должны размещаться между так называемыми литералами даты и времени, в качестве которых используется знак #.
Например:
Dim dtmDate As Date dtmDate = #30-05-2000#
451
Значение, которое содержится в переменной типа Date, может быть как кратким (только дата или только время), так и полным (и дата, и время). Причем во втором случае значение времени должно указываться после даты.
Например:
dtmDate = #30-05-2000 20:30#
Следует отметить тот факт, что представление для значений переменных, преобразуемых из строки в дату, которое используется в языке Visual Basic по умолчанию, зависит от настроек вкладки Дата раздела Язык и стандарты в Панели управления (см. рис. 6.18). Т. е. в том случае, когда осуществляется преобразование строковой переменной в дату, из одной и той же строки в зависимости от установленного региона могут быть получены разные даты, например:
Dim strDate As String Dim dtmDate As Date strDate = "08/05/99" dtmDate = CDate(strDate)
Если приведенный выше программный код будет выполнен при установленном формате "дд/ММ/гг" региона Русский, то результатом будет дата 8 мая 1999 года. Если же программу запустить при настройке "ММ/дд/гг" региона Английский (США), то в этом случае результатом будет 5 августа 1999 года.
Для переменных, содержимым которых является дата, в языке Visual Basic по умолчанию используется формат #ММ/дд/гг#. Например, следующее значение переменной dtmDate:
dtmDate = "8/5/99"
что будет интерпретировано как дата 5 августа 1999 года, независимо от настроек Панели управления. Однако необходимо отметить, что в случае использования любого другого формата. Например:
dtmDate = "30/5/99" или
dtmDate = "30-05-99"
452
т. е. когда, в отличие от предыдущего случая, разночтения исключены, вводимое значение будет автоматически преобразовано в соответствии с форматом, используемым по умолчанию:
dtmDate = "5/30/99"
Над переменными типа Date возможно выполнение арифметических операций. В частности прибавление или вычитание целого числа приведет к увеличению или уменьшению количества дней. Если же подобную операцию выполнить с дробью, знаменателем которой является число 24, то соответствующим образом увеличится или уменьшится значение, обозначающее количество часов. Аналогичным способом можно изменить количество минут (знаменатель - 24 * 60).
453
Например:
Dim dtmDate As Date, dtmCurrent As Date
Dim intDate
dtmCurrent = Now
' Результат: #5/30/2000 12:11:56#
intDate = dtmCurrent - 5
' Результат: #5/25/2000 12:11:56#
intDate = dtmCurrent -5/24
' Результат: #5/30/2000 7:11:56#
intDate = dtmCurrent - 5 / (24 * 60)
' Результат: #5/30/2000 12:06:56#
Помимо выполнения арифметических операций, значения типа Date можно сравнивать друг с другом. Например:
Dim dtmDate1, dtmDate2 Dim strRelation As String dtmDate1 = #5/30/1999# dtmDate2 = #6/30/1999# If dtmDate1 < dtmDate2 Then
strRelation = "Date1 Меньше Date2" Else
strRelation = " Date1 Больше Date2" End If ' Результат: "Date1 Меньше Date2"
При работе с переменными типа Date используется большое количество функций, которые можно разделить на несколько основных категорий.
Определение текущей даты и времени. В этом случае функции используются без каких-либо параметров и отображают те или иные значения даты и времени, которые содержатся в системе на момент их вызова в программе (см. табл. 6.15).
454
Листинг 6.5. Определение текущей даты и времени
Dim dtmCurrent As Date
dtmCurrent = Now 'Результат: #5/30/2000 12:J1:56#
dtmCurrent = Date 'Результат: #5/30/2000#
dtmCurrent = Time 'Результат: #12:11:56#
Характеристики заданной даты и времени. В качестве параметра употребляемых функций указывается значение или имя переменной типа Date. При этом результатом их вызова являются различные характеристики используемой переменной (или заданного значения) (см. табл. 6.16).
455
Листинг 6.6. Характеристики заданной даты и времени
Dim dtmCurrent As Date
Dim intDate dtmCurrent = Now 'Результат: #5/30/2000 12:11:56#
intDate = Second(dtmCurrent) ' Результат: 56
intDate = Minute(dtmCurrent) ' Результат: 11
intDate = Hour(dtmCurrent) ' Результат: 12
intDate = Day(dtmCurrent) ' Результат: 30
intDate = Weekday(dtmCurrent) ' Результат: 3
intDate = WeekdayName(Weekday(dtmCurrent)) 'Результат: "среда"
intDate = Month(dtmCurrent) ' Результат: 5
intDate = MonthName(Month(dtmCurrent)) 'Результат: "Май"
intDate = Year(dtmCurrent) ' Результат: 2000
Работа с заданной датой и временем. Используемые в этом случае функции позволяют изменять заданную дату или время, определять ее отдельные характеристики, а также находить отношение двух дат (см. табл. 6.17).
Для изменения заданного значения даты или времени используется функция DateAdd, имеющая следующий формат:
DateAdd(uрmepвaл, число, дата)
Результатом вызова функции DateAdd будет дата с измененным на числовое значение интервалом, который является строкой и может принимать следующие значения (см. табл. 6.18):
456
При этом заданная дата с помощью параметра число может быть как увеличена, так и уменьшена.
Для определения отношения двух заданных значений дат следует использовать функцию DateDiff, которая имеет такой синтаксис:
DateDiff(интервал, дата1, дата2)
Число, полученное в результате вызова функции DateDiff, определяет разницу между значениями дата1 и дата2, которая измеряется в единицах указанного интервала (см. табл. 6.18).
Результатом может быть как положительное, так и отрицательное значение.
Для определения той или иной характеристики заданной даты используется функция DatePart, имеющая следующий формат:
DatePart(интервал, дата)
Результатом вызова функции DateDiff будет число, выражающее для заданной даты значение указанного интервала (см. табл. 6.18).
457
Листинг 6.7. Работа с заданной датой и временем
Dim dtmDate As Date, dtmCurrent As Date
Dim intDate As Integer
dtmCurrent = Now 'Результат: #5/30/2000 12:11:56#
dtmDate = DateAdd("m", 2, dtmCurrent) 'Результат: #7/30/2000 12:11:56#
dtmDate = DateAdd("d", -5, dtmCurrent) 'Результат: #5/25/2000 12:11:56#
intDate = DateDiff("w", #1/1/2000#, dtmCurrent) ' Результат: 21
intDate = DateDiff("d", #1/1/2000#, dtmCurrent) ' Результат: 150
intDate = DatePart("h", dtmCurrent) ' Результат: 12
intDate = DatePart("m", dtmCurrent) ' Результат: 11
Пользовательские процедуры и функции
Под процедурой или функцией понимается последовательность операций, которую нужно многократно выполнять в различных местах приложения. При этом требуемый блок команд записывается в коде только один раз, после чего к нему можно обращаться из любой части программы.
Существует несколько разновидностей описанных элементов программирования:
Процедуры обработки событий. Вызываются в том случае, если произошло какое-либо событие. При этом существенным является как имя элемента, так и вид события, который с ним произошел.
Пользовательские процедуры. Группы операторов, создаваемые разработчиком для выполнения определенных задач и не зависящие от текущего состояния приложения или произошедших в тот или иной момент событий.
Встроенные функции. Определенные наборы команд, имеющиеся в языке Visual Basic и предназначенные для вычисления тех или иных значений на основании исходных данных. Встроен-
458
ными являются, в частности как математические, так и строковые функции (Abs, Sin, Cos, Len, Mid и т. д.).
Пользовательские функции. Группы операторов, аналогичные пользовательским процедурам. Однако между ними есть ряд отличий, которые будут рассмотрены ниже.
Пользовательские процедуры или функции в языке Visual Basic объявляются следующим образом:
Sub название процедуры (параметры) операторы
End Sub
Function название функции (параметры) [As тип] операторы
End Function
В том случае, когда в программе выполняется вызов процедуры или функции, то в качестве параметров необходимо указать имена тех переменных, значения которых требуется в данный момент обработать.
Ниже приведен пример пользовательской функции, вычисляющей значение факториала для заданного числа.
Листинг 6.8. Программа с вычислением факториала
Private Sub ComniandButton1_Click ()
Dim bytN As Byte
Dim strInput
Dim intR As Integer
strlnput = InputBox( _ "Ввод факториала:", "Ввод")
bytN = CByte(strlnput)
intR = MsgBox(Fact(bytN), , "Вывод")
End Sub
Function Fact(bytA As Byte) As Integer
Dim bytl As Byte
Dim intFact As Integer
intFact = 1
For bytl = 1 To bytA
intFact = intFact * bytl
Next
Fact = intFact
End Function
459
В результате выполнения приведенного кода при нажатии на кнопку (объект CommandButton1, процедура обработки события CommandButton1_Click) пользователю будет предложено ввести число, для которого необходимо вычислить факториал. После ввода на экран выведется сообщение о полученном результате.
Следует отметить, что для объявляемой процедуры или функции, так же, как и для переменной, может быть задана область ее видимости при помощи служебных слов Private или Public.
Основные отличия функции от процедуры:
1. Функция имеет тип (аналогично переменной) и может возвращать в программу значение, которое присваивается функции при помощи следующего оператора:
название функция = значение
2. Вызов функции, как правило, осуществляется посредством указания в правой части какого-либо оператора ее имени и параметров. С другой стороны, процедуры вызываются при помощи отдельного оператора:
Call процедура (параметры) или
процедура ( параметры)
Если при вызове процедуры используется ключевое слово Call, то список ее параметров должен быть указан в скобках. Если же процедура вызывается без использования Call. то ее параметры перечисляются без скобок.
Необходимо отметить, что вызываемая процедура может не иметь параметров. В этом случае (если использовалось служебное слово Call) после имени процедуры следует ставить пустые скобки.
Пользовательские процедуры обычно используются при необходимости выполнения одной и той же последовательности операций. Например, в программе требуется неоднократно вводить в цикле значения массива аrrА, состоящего из пяти элементов. В этом случае заполнение массива лучше всего оформить в виде процедуры.
Листинг 6.9. Заполнение массива при помощи процедуры
Private arrA(1 То 5) As Integer
Option Explicit
460
Private Sub CommandButtonl_Click ()
Dim inti As Integer
Dim intR As Integer
Dim intMessage As Integer
Call InputArray
intR = 0
For inti = 1 To 5
intR = intR + arrA(intI)
Next
intR = intR / 5
intMessage = MsgBox(intR)
End Sub
Sub InputArray()
Dim strl
Dim intl As Integer
For intl = 1 To 5
strl = InputBox("Bвoд " & intl & " элемента:")
arrA(intI) = CInt(strI)
Next
End Sub
При запуске приведенной программы пользователю предлагается ввести поочередно 5 элементов массива аrrА. После этого вычисляется и выводится на экран среднее значение введенных элементов.
В данном примере у процедуры InputArray отсутствовали параметры, при этом массив, элементы которого вводились, был объявлен переменной уровня модуля (Private) в разделе Declarations. Такое описание было выполнено для того, чтобы в процедуре InputArray существовала возможность изменения его элементов. С другой стороны, если переменная описана в процедуре как локальная (Dim или Static), то доступ к ней из других процедур невозможен.
Параметры могут передаваться в процедуры или функции двумя способами:
1. Передача параметров по ссылке. Такие параметры еще называют параметрами-переменными. Данный режим в языке Visual Basic используется по умолчанию. При этом вызываемая процедура может изменить значения тех переменных, которые ей передаются в качестве параметров.
461
2. Передача параметров по значению. Эти параметры носят также название параметров-значений. При вызове процедуры в таком режиме, значения переменных, которые используются в качестве параметров, не изменятся. Т. е. в этом случае изменениям будут подвержены только "копии" переменных, передаваемых в процедуру.
Ниже приведен пример программы с процедурами, поясняющий возможные способы передачи параметров.
Листинг 6.10. Передача параметров по ссылке и по значению
Private Sub CommandButtonl_Click()
Dim x, у
x = 3
у = 5
Call ByReference(x, у) ' Результат: x = 4, у = 6
x = 3
у = 5
Call ByValue(x, у) ' Результат: x = 4, у = 5
End Sub
' Передача параметров по ссылке
Sub ByReference(a, b)
а = а + 1
b =b + 1
End Sub
' Передача параметров по значению
Sub ByValue(a, ByVal b)
a = a + 1
b = b + 1
End Sub
Вызов процедуры ByReference приводит к тому, что значения обеих переменных х и у, используемых в качестве параметров, увеличиваются на 1.
После вызова процедуры ByValue изменяется значение только переменной х, в противоположность которой переменная у остается без изменений. Использование при описании
462
параметра b служебного слова ByVal привело к тому, что в переменную у при выполнении процедуры ByValue не будет передано никакого значения.
Среди параметров процедуры или функции могут быть как обязательные, указание которых необходимо, так и необязательные, которые при вызове можно не задавать. Объявление необязательных параметров при описании процедуры осуществляется при помощи служебного слова Optional, указываемого перед именем соответствующего параметра. При этом во всплывающей подсказке для процедуры он будет изображаться в квадратных скобках (см. рис. 6.19).
Если необязательный параметр не указан при вызове процедуры или функции, то его значение принимается по умолчанию как нулевое для соответствующего типа, или как Error для типа Variant. В последнем случае для проверки на наличие параметра следует использовать функцию isMissing с указанием имени, результатом которой будет значение True, если параметр указан, иначе - значение False.
Ниже приведен пример с использованием необязательных параметров при вызове процедур.
463
Листинг 6.11. Использование необязательных параметров
Private vntA As Byte, vntB As Byte
Option Explicit
Private Sub ConunandButtonI Click ()
vntA =5
vntB = 10
Call Opt(vntA, vntB) ' Результат: vntA = 6, vntB =11
vntA = 5
vntB = 10
Call Opt(vntA) ' Результат: vntA = 6, vntB = 10
End Sub
Private Sub Opt(a As Byte, Optional b As Byte)
a = a + 1