Visual basic for applications (vba)

Вид материалаДокументы

Содержание


Dim intA As Integer
Left(строка, количество)
Right(строка, количество)
Mid(строка, номер, [количество])
Dim strA As String
Работа с датой и временем
Dim dtmDate As Date dtmDate = #30-05-2000
Панели управления.
Результат: #5/30/2000 12:11:56
Dim dtmDate1, dtmDate2 Dim strRelation As String dtmDate1 = #5/30/1999# dtmDate2 = #6/30/1999# If dtmDate1 < dtmDate2 Then
DateAdd(uрmepвaл, число, дата)
DateDiff(интервал, дата1, дата2)
Пользовательские процедуры и функции
Sub название процедуры (параметры) операторы
Call процедура (параметры) или
Private Sub CommandButtonl_Click()
Подобный материал:
1   2   3   4   5

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 Ba­sic объявляются следующим образом:

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