|
| ||||||||||||
| ||||||||||||
|
Для передачи аргументов в процедуру может использоваться массив параметров. При описании процедуры не требуется указывать число элементов такого массива. Для обозначения массива параметров используется ключевое слово ParamArray. Такой массив описывается как массив типа Variant и всегда представляет последние элементы из списка аргументов в описании процедуры . Ниже приводится пример описания процедуры с массивом параметров. Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant) Dim intI As Integer Debug.Print strName; " Scores" ' Использует функцию UBound для определения верхней границы массива. For intI = 0 To UBound(intScores()) Debug.Print " "; intScores(intI) Next intI End Sub В следующих строках приведены примеры вызова этой процедуры. AnyNumberArgs "Иван", 10, 26, 32, 15, 22, 24, 16 AnyNumberArgs "Мария", "Высокий", "Низкий", "Средний", "Высокий" Область определения и видимость Область определения определяет доступность переменной, константы, или процедуры для других процедур. Имеется три уровня областей определения: уровень процедуры, личный уровень модуля и общий уровень модуля. Область определения переменной определяется при описании этой переменной. Рекомендуется явно описывать все переменные для предотвращения ошибок, связанных с конфликтами имен между переменными с различными областями определения. Область определения уровня процедуры Переменная или константа, определенная внутри процедуры, недоступна вне этой процедуры .Она может использоваться только процедурой, которая содержит описание этой переменной. В первой процедуре следующего примера в окне сообщения содержится строка. Во второй процедуре окно сообщения останется пустым, так как переменная strMsg является локальной в первой процедуре. Sub LocalVariable() Dim strMsg As String strMsg = "Эта переменная не может использоваться вне этой процедуры." MsgBox strMsg End Sub Sub OutsideScope() MsgBox strMsg End Sub Область определения уровня модуля Переменная или константа уровня модуля может быть определена в разделе описаний модуля. Переменная уровня модуля может быть общей или частной. Общие переменные доступны для всех процедур во всех модулях проекта; личные переменные доступны только для процедур данного модуля. Переменные, описанные с инструкцией Dim в разделе описаний, по умолчанию определяются как частные. Однако если переменной предшествует ключевое слово Private, область определения задается программой пользователя. В следующем примере строковая переменная strMsg доступна для всех процедур, описанных в модуле. При вызове второй процедуры в диалоговом окне выводится значение строковой переменной. ' Add following to Declarations section of module. Private strMsg sAs String Sub InitializePrivateVariable() strMsg = "Эта переменная не может использоваться вне этого модуля." End Sub Sub UsePrivateVariable() MsgBox strMsg End Sub Примечание. Общие процедуры в стандартном модуле или модуле класса доступны для любого адресующего проекта. Для ограничения области определения всех процедур в модуле текущего проекта в раздел описаний модуля помещается инструкция Option Private Module. Общие переменные и процедуры остаются доступными для других процедур текущего проекта, но не для адресующего проекта. Область определения общего уровня модуля Если переменная уровня модуля описана как общая, то она доступна для всех процедур проекта. В следующем примере строковая переменная strMsg может использоваться всеми процедурами во всех модулях проекта. ' Включает в раздел описаний модуля. Public strMsg As String Все процедуры являются общими, за исключением процедур обработки событий. Когда Visual Basic создает процедуру обработки события, перед ее описанием автоматически вставляется ключевое слово Private. Все другие процедуры, не являющиеся общими, должны быть описаны явным образом с ключевым словом Private. Общие процедуры, переменные и константы, описанные в стандартном модуле или в модуле класса, могут использоваться в адресующем проекте. Однако сначала надо задать ссылку на проект, в котором они описаны. Общие процедуры, переменные и константы, которые описаны не в стандартных модулях, и не в модулях класса, а например в модулях форм или отчетов, недоступны для адресующего проекта, так как эти модули являются личными для проекта, в котором они находятся. Если при описании константы, переменной, или аргумента не указан тип данных, им автоматически присваивается тип данных Variant. Переменные, описанные с типом данных Variant, могут содержать строку, дату, время, логические (Boolean) или числовые значения и могут автоматически преобразовываться к другому типу. Числовые значения Variant занимают 16 байт памяти (что существенно только в больших процедурах или в сложных модулях), и доступ к ним осуществляется медленнее, чем к переменным, которые описаны явным образом с любым другим типом. Тип данных Variant редко используется для констант. Строковое значение Variant занимает 22 байта памяти. Следующие инструкции создают переменные Variant: Dim myVar Dim yourVar As Variant theVar = "Это текст." В последней инструкции переменная theVar не описывается явно, она описывается неявно или же автоматически. Переменные, описанные неявно, получают тип данных Variant. Совет. Если для переменной или аргумента указан определенный тип данных, а затем используется неверный тип, то возникает ошибка. Чтобы избежать ошибок, связанных с типами данных, рекомендуется или использовать только неявно описанные переменные (тип данных Variant), или явно описывать все переменные с определенным типом данных. Последний способ предпочтительнее. В разделах Справочника Visual Basic по методам, инструкциям или функциям объясняются все элементы синтаксиса, необходимые для правильного использования методов, инструкций или функций. В этих разделах приводятся примеры интерпретации наиболее распространенных элементов синтаксиса. Синтаксис метода Activate объект.Activate В синтаксисе метода Activate слово объект представляет собой прототип для передаваемой информации - в данном случае это программа, возвращающая объект. Слова, выделенные полужирным шрифтом, должны набираться в точности так, как они написаны. Например, следующая процедура активизирует второе окно в активном документе. Sub MakeActive() Windows(2).Activate End Sub Синтаксис функции MsgBox MsgBox(prompt[, buttons] [, title] [, helpfile, context]) В синтаксисе функции MsgBox полужирные курсивные слова представляют собой именованные аргументы функции. Аргументы, заключенные в скобки, не обязательны (скобки не набираются в тексте программы на языке Visual Basic). Единственным аргументом, который пользователь должен задать для функции MsgBox, является текст подсказки. Аргументы функций и методов могут указываться в программе в соответствии с позицией или по имени. Чтобы указать аргумент в соответствии с позицией, следует придерживаться синтаксиса, т.е. отделять аргументы запятой, например: MsgBox "Ответ неверный!",0,"Заголовок окна" Указание аргумента по имени состоит из имени аргумента, за которым следуют двоеточие со знаком равенства (:=) и значение аргумента. Именованные аргументы можно указывать в любом порядке, например: MsgBox Title:="Заголовок окна", Prompt:="Ответ неверный!" Синтаксис функций и некоторых методов содержит аргументы, заключенные в скобки. Эти функции и методы возвращают значения, поэтому необходимо заключать аргументы в скобки, чтобы присвоить значение переменной. Если возвращаемое значение не используется, или аргументы вообще не передаются, скобки не нужны. Методы, которые не возвращают значения, не требуют заключения аргументов в скобки. Эти правила применимы как для позиционных, так и для именованных аргументов. В следующем примере значение, возвращаемое функцией MsgBox представляет собой число, обозначающее определенную кнопку, которое запоминается в переменной myVar. Поскольку используется возвращаемое значение, требуются скобки. Затем в другом окне сообщения появляется значение переменной. Sub Question() myVar = MsgBox(Prompt:="Я люблю свою работу.", _ Title:="Заголовок окна ", Buttons:="4") MsgBox myVar End Sub Синтаксис инструкции Option Option Compare В синтаксисе инструкции Option Compare фигурные скобки и вертикальная черта указывают на принудительный выбор между тремя элементами (фигурные скобки не набираются в инструкциях языка Visual Basic). Например, следующая инструкция означает, что строки в модуле будут сравниваться в порядке сортировки, т.е. без учета регистра букв. Option Compare Text Синтаксис инструкции Dim Dim имяПеременной[([индексы])] [As тип] [, имяПеременной[([индексы])] [As тип]] . . . В синтаксисе инструкции Dim слово Dim является обязательным ключевым словом. Единственным обязательным элементом является имяПеременной. Например, следующая инструкция создает три переменных: myVar, nextVar и thirdVar. Они автоматически получают тип Variant. Dim myVar, nextVar, thirdVar В следующем примере переменная описывается как String. Использование типа данных экономит память и облегчает поиск ошибок в программе. Dim myAnswer As String Чтобы описать несколько переменных с помощью одной инструкции, надо указывать тип каждой переменной. Переменные, описанные без типа, автоматически приобретают тип Variant. Dim x As Integer, y As Integer, z As Integer В следующем примере x и y описаны с типом Variant, а z описан с типом Integer. Dim x, y, z As Integer Если описывается массив, необходимо указывать скобки. Индексы не обязательны. Следующая инструкция описывает динамический массив myArray. Dim myArray() Имеется возможность описать массив для работы с набором значений одного типа данных. Массив представляет собой одну переменную с множеством ячеек памяти для хранения значений, тогда как обычная переменная имеет только одну ячейку, в которой может храниться только одно значение. При необходимости сослаться на все элементы массива можно ссылаться на массив как целое. Возможны также ссылки на его отдельные элементы. Например, для записи денежных затрат на каждый день календарного года можно описать один массив с 365 элементами, вместо того, чтобы описывать 365 переменных. Каждый элемент массива содержит одно значение. Следующая инструкция описывает массив curExpense с 365 элементами. По умолчанию индексация массива начинается с нуля, так что верхняя граница массива - 364, а не 365. Dim curExpense(364) As Currency Чтобы задать значение отдельного элемента, надо указать его индекс. В следующем примере всем элементам массива присваивается исходное значение 20. Sub FillArray() Dim curExpense(364) As Currency Dim intI As Integer For intI = 0 to 364 curExpense(intI) = 20 Next End Sub Изменение нижней границы индексов Для того, чтобы изменить индекс первого элемента массива, по умолчанию равный 0, на 1, можно использовать инструкцию Option Base в начале модуля. В следующем примере инструкция Option Base изменяет индекс первого элемента , а инструкция Dim описывает массив curExpense с 365 элементами. Option Base 1 Dim curExpense(365) As Currency Допускается также явное задание нижней границы индексов массива с помощью предложения To, как продемонстрировано в следующем примере. Dim curExpense(1 To 365) As Currency Dim strWeekday(7 To 13) As String Запоминание значений Variant в массивах Создать массив значений Variant можно двумя способами. Первый способ - это описание массива с типом данных Variant, как показано в следующем примере: Dim varData(3) As Variant varData(0) = "Мария Петрова" varData(1) = "Зеленая, 19" varData(2) = 38 varData(3) = Format("06-09-1952", "General Date") Другой способ - это присвоение массива, возвращаемого функцией Array, переменной Variant, как продемонстрировано в следующем примере. Dim varData As Variant varData = Array("Иван Петров", "Зеленая, 19", 38, _ Format("06-09-1952", "General Date")) Независимо от способа создания массива значений Variant его элементы нумеруются индексами. Например, следующая инструкция может быть добавлена к любому из предыдущих примеров. MsgBox "Записаны данные для " & varData(0) & "." Использование многомерных массивов В языке Visual Basic допускается описание массивов, имеющих до 60 размерностей. Например, следующая инструкция описывает двумерный массив 5 на 10. Dim sngMulti(1 To 5, 1 To 10) As Single Если рассматривать этот массив как матрицу, то его первый аргумент представляет строки, а второй - столбцы. Для обработки многомерных массивов используются вложенные инструкции For...Next. В следующей процедуре двумерный массив заполняется значениями типа данных Single. Sub FillArrayMulti() Dim intI As Integer, intJ As Integer Dim sngMulti(1 To 5, 1 To 10) As Single ' Заполнение массива. For intI = 1 To 5 For intJ = 1 To 10 sngMulti(intI, intJ) = intI * intJ Debug.Print sngMulti(intI, intJ) Next intJ Next intI End Sub Программа может содержать часто встречающиеся постоянные значения, или же она может зависеть от некоторых чисел, которые запоминаются с трудом и не имеют очевидного смысла. В этом случае процесс чтения и эксплуатации программы можно упростить с помощью использования констант. Константа представляет собой значащее имя для числа или строки, которые не изменяются. В отличие от переменной константу нельзя модифицировать или присвоить ей новое значение. Имеется три типа констант: Внутренние константы, или константы, определяемые системой. Значения таких констант берутся из приложений и элементов управления. В других приложениях, имеющих библиотеки объектов, таких как Microsoft Access, Microsoft Excel и Microsoft Project, также предоставляется список констант, которые могут использоваться с методами, объектами и свойствами этих приложений. Список констант, предоставляемых для индивидуальных библиотек объектов, можно найти в окне Просмотр объектов. Константы языка Visual Basic перечислены в библиотеках Visual Basic (VB), Visual Basic для приложений (VBA) и в библиотеке DAO (Data Access Object). Примечание. Язык Visual Basic распознает константы в приложениях, созданных с помощью предыдущих версий Visual Basic или Visual Basic для приложений. Пользователь может обновить свои константы, чтобы они соответствовали списку в окне просмотра объектов. Константы, перечисленные в окне просмотра объектов, не требуют описания в приложении пользователя. Символические константы, или константы, определяемые пользователем, описываются с помощью инструкции Const. Условные константы компилятора описываются с помощью инструкции #Const. В предыдущих версиях Visual Basic имена констант обычно изображались прописными буквами со знаком подчеркивания. Например: TILE_HORIZONTAL В данной версии внутренние константы именуются таким образом, чтобы избежать ситуаций, когда константам с одинаковыми именами в разных библиотеках объектов присваиваются различные значения. Имена констант задаются двумя способами: С помощью префиксов С помощью ссылок на библиотеку Определение констант с помощью префиксов Внутренние константы, определенные для любых объектами, записываются в формате со смешанным регистрами с двухбуквенным префиксом, означающим библиотеку объектов, которая описывает константу. Константы из библиотек объектов Visual Basic и Visual Basic для приложений имеют префикс "vb"; константы из библиотеки объектов Data Access Object имеют префикс "db"; а константы из библиотеки объектов Microsoft Excel имеют префикс "xl". В следующем примере проиллюстрировано, как меняются префиксы для специальных элементов управления, в зависимости от библиотеки типов. vbTileHorizontal dbAppendOnly xlDialogborder grdAlignCenter Определение констант по ссылке через библиотеку Допускается также ссылка на константу с помощью следующего синтаксиса: [библиотека.] [модуль.]константа Синтаксис для определения константы состоит из трех частей:
Например: Threed.LeftJustify Эффективное использование типов данных Если обратное не указано, неописанные переменные приобретают тип данных Variant . Этот тип данных упрощает написание программ, но его использование не всегда является наиболее эффективным. Следует предусмотреть применение других типов данных, если: Программа имеет большой размер и очень много переменных. Требуется как можно более быстрое выполнение программы. Выполняется прямая запись данных в файлы с произвольным доступом. Кроме типа Variant поддерживаются типы данных Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object и String. Для описания переменной определенного типа используется инструкция Dim, например: Dim X As Integer Эта инструкция описывает переменную X как Integer - целые числа от -32768 и до 32767. При попытке присвоить X число, выходящее за пределы этого диапазона, возникает ошибка. При присваивании X дробного числа, выполняется округление. Например: X = 32768' Вызывает ошибку. X = 5.9' Задает для x значение 6. Инструкция Do...Loop используется для выполнения наборов инструкций неопределенное число раз. Набор инструкций повторяется, пока условие имеет значение True, либо пока оно не примет значение True. Повторение инструкций, пока условие имеет значение True Имеется два способа проверки условия в инструкции Do...Loop с помощью ключевого слова While: условие проверяется до входа в цикл; условие проверяется после хотя бы однократного выполнения цикла. В следующей процедуре ChkFirstWhile условие проверяется до входа в цикл. Если myNum задать равным 9 вместо 20, инструкции внутри цикла выполняться не будут. В процедуре ChkLastWhile инструкции внутри цикла выполняются только один раз до того как условие примет значение False. Sub ChkFirstWhile() counter = 0 myNum = 20 Do While myNum > 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "Выполнено " & counter & " итераций цикла." End Sub Sub ChkLastWhile() counter = 0 myNum = 9 Do myNum = myNum - 1 counter = counter + 1 Loop While myNum > 10 MsgBox "В цикле выполнено " & counter & " итераций." End Sub Повторение инструкций, пока условие не примет значение True Имеется два способа проверки условия в инструкции Do...Loop с помощью ключевого слова Until: условие проверяется до входа в цикл (как продемонстрировано в процедуре ChkFirstUntil), или условие проверяется после хотя бы однократного выполнения цикла (как показано в процедуре ChkLastUntil). Итерации продолжаются, пока условие имеет значение False. Sub ChkFirstUntil() counter = 0 myNum = 20 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "В цикле выполнено " & counter & " итераций." End Sub Sub ChkLastUntil() counter = 0 myNum = 1 Do myNum = myNum + 1 counter = counter + 1 Loop Until myNum = 10 MsgBox "В цикле выполнено " & counter & " итераций." End Sub Выход из цикла Do...Loop Инструкцию Do...Loop можно завершить с помощью инструкции Exit Do. Например, для завершения бесконечного цикла используется инструкция Exit Do в блоке True инструкции If...Then...Else или инструкции Select Case. Если условие имеет значение False, цикл будет выполняться как обычно. В следующем примере переменной myNum присваивается значение, приводящее к бесконечному циклу. Инструкция If...Then...Else проверяет условие на myNum, а затем завершает инструкцию Do...Loop, предотвращая таким образом бесконечный цикл. Sub ExitExample() counter = 0 myNum = 9 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 If myNum < 10 Then Exit Do Loop MsgBox "В цикле выполнено " & counter & " итераций." End Sub Примечание. Для прекращения бесконечного цикла используются клавиши ESC или CTRL+BREAK. Инструкция For...Next используется для выполнения наборов инструкций указанное число раз. Циклы For используют в качестве счетчика переменную, значение которой увеличивается или уменьшается при каждом выполнении цикла. Следующая процедура заставляет компьютер подавать звуковой сигнал 50 раз. Инструкция For определяет счетчик x и его начальное и конечное значения. Инструкция Next изменяет счетчик с шагом 1. Sub Beeps() For x = 1 To 50 Beep Next x End Sub Имеется возможность увеличивать или уменьшать значение счетчика на указанную величину с помощью ключевого слова Step. В следующем примере счетчик j изменяется с шагом 2 при каждом выполнении цикла. По завершении цикла total равняется сумме 2, 4, 6, 8 и 10. Sub TwosTotal() For j = 2 To 10 Step 2 total = total + j Next j MsgBox "Сумма равна " & total End Sub Для уменьшения значения счетчика используется отрицательное значение Step. В этом случае указывается конечное значение, которое должно быть меньше начального значения. В следующем примере счетчик myNum уменьшается на 2 при каждом выполнении цикла. По окончании цикла total равняется сумме 16, 14, 12, 10, 8, 6, 4 и 2. Sub NewTotal() For myNum = 16 To 2 Step -2 total = total + myNum Next myNum MsgBox "Сумма равна " & total End Sub Примечание. Указание имени счетчика после инструкции Next не обязательно. В предыдущих примерах имя счетчика было указано для облегчения чтения программы. Инструкция Exit For дает возможность завершения инструкции For...Next до того, как счетчик достигнет своего конечного значения. Например, если возникает ошибка, для ее проверки можно использовать инструкцию Exit For в блоке True инструкции If...Then...Else или инструкции Select Case. Если ошибки нет, инструкция If...Then...Else имеет значение False, и выполнение цикла продолжается как ожидалось. Инструкция For Each...Next повторяет набор инструкций для всех объектов семейства или для всех элементов массива. Visual Basic автоматически задает переменную во время каждого выполнения цикла. Например, в следующей процедуре закрываются все формы, за исключением формы, содержащей текущую процедуру. Sub CloseForms() For Each frm In Application.Forms If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close Next End Sub В следующих строках программы выполняется цикл для всех элементов массива, и их значения присваиваются индексной переменной I. Dim TestArray(10) As Integer, I As Variant For Each I In TestArray TestArray(I) = I Next I Циклы по диапазонам ячеек Инструкция For Each...Next используется также для организации циклов по диапазонам ячеек. Следующая процедура выполняет цикл по диапазону A1:D10 на листе Sheet1 и присваивает любому числу, имеющему абсолютное значение меньше 0.01, значение 0 (ноль). Sub RoundToZero() For Each myObject in myCollection If Abs(myObject.Value) < 0.01 Then myObject.Value = 0 Next End Sub Выход из цикла For Each...Next до его завершения Допускается выход из цикла For Each...Next с помощью инструкции Exit For. Например, если возникает ошибка, для ее проверки можно использовать инструкцию Exit For в блоке True инструкции If...Then...Else или инструкции Select Case. Если ошибки нет, инструкция If...Then...Else имеет значение False, и выполнение цикла продолжается как ожидалось. В следующем примере проверяется первая ячейка диапазона A1:B5, которая не содержит числового значения. Когда такая ячейка найдена, на экран выводится сообщение, и Exit For завершает цикл. Sub TestForNumbers() For Each myObject In MyCollection If IsNumeric(myObject.Value) = False Then MsgBox "Объект не содержит числового значения." Exit For End If Next c End Sub Назад | Содержание | Вперед
|
|
CITForum © 1997–2025