Основы VBA: встроенные и пользовательские функции. Функции в vba


VBA Подпрограмма-функция - Mini-Soft.ru

VBA содержит встроенные или стандартные функции, например, sqr, cos или chr. Кроме того, с помощью оператора Function можно писать собственные процедуры Function. Эти функции называют нестандартные или пользовательскими.

Синтаксис процедуры Function таков:

[Private|Public][Static]Function <имя процедуры> (<аргументы>) [As type <имя типа>] <операторы> End Function

Приведем конкретный пример:

Funcstion toint(b As String) As Integer Dim i As Integer, l As Integer, k As Integer, j As Integer l = Len(b): i = 0 For k = l To 1 Step -1 j = CInt(Mid(b, k, 1)) i = i + j * 2 ^ (l - k) Next toint = i End Function

Как и процедура Sub, процедура Function является самостоятельной и может принимать параметры, выполнять ряд операторов и изменять значения своих параметров. В отличие от процедуры Sub, имя процедуры Function может возвращать значение в вызывающую процедуру. Существуют три различия между процедурами Sub и Function:

 Возвращаемое процедурой Function значение присваивается самому имени процедуры. Возвращаемое процедурой Function значение можно использовать в выражениях в программе.  Как и переменные процедуры Function имеют тип, который определяет тип возвращаемого значения. (В отсутствие ключевого слова As в операторе определения процедуры ей назначается по умолчанию тип variant.)  Вызов процедуры Function, или просто функции, в основном осуществляется заданием ее имени и параметров в правой части большого оператора или в составе выражения.

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

Function Hypotenuse (A As Integer, В As Integer) As String

Hypotenuse = Sqr(A^2 + В^2)

End Function

В VBA процедура Function вызывается точно так же, как и любая встроенная функция:

strX = Hypotenuse(Width, Height)

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

Если функция не имеет аргументов, скобки после имени функции можно не ставить:

'Все эти операторы вызывают не имеющую аргументов процедуру Function ToDec.

Debug.Print 10 * ToDec X = ToDec If ToDec =10 Then Debug. Print "Out of Range" X = AnotherFunction(10 * ToDec)

Обычно вызов пользовательской функции (нестандартной функции, написанной программистом) аналогичен вызову встроенной (стандартной) функции VBA, например Abs.

Функцию можно вызывать так же, как и процедуру sub.

'Следующие операторы вызывают одну и ту же функцию:

Call Year(Now)

Year Now

Значение функции при ее вызове подобным образом игнорируется.

Механизмы передачи параметров.

Обычно процедуре для выполнения требуются некоторые исходные данные. Эти данные могут передаваться процедуре при помощи параметров процедуры. При этом различают формальные параметры, то есть описанные в заголовке процедуры и используемые в ее теле, и фактические - те, что были указаны при ее вызове. Заметим, что имена формальных и фактических параметров не обязаны совпадать.

Типы данных параметров

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

Передача параметров по значению

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

Для передачи параметров по значению используется ключевое слово ByVal,. например:

Sub PostAccounts(ByVal intAcctNum as Integer) <операторы тела процедуры> End Sub

Фактические параметры, заданные константами, всегда передаются по значению.

Передача параметров по ссылке

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

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

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

Private Sub Form_Load() Dim intX As Integer intX = 12 * 3 ВызываемаяПроцедура(intX) End Sub Sub ВызываемаяПроцедура (Bar As String) MsgBox Bar 'Значение переменной Bar - строка "36" End Sub Необязательные параметры С помощью ключевого слова Optional в списке параметров можно задавать необязательные параметры (optional arguments) процедуры. Если какой-то аргумент задан как необязательный, то и все последующие аргументы в списке аргументов должны быть необязательными и объявляются с ключевым словом optional. В этом коде все аргументы не являются обязательными: Dim strИмя As String Dim strАдрес As String Sub Text(Optional x As String, Optional y As String) MsgBox x MsgBox y End Sub Private Sub Exec() strИмя = "ВашеИмя" strАдрес = 12345 ' Передаются два параметра. Call Text(strИмя, strАдрес) End Sub В этом коде некоторые аргументы обязательны: Dim strИмя As String Dim varАдрес As Variant Sub Text(x As String, Optional у As Variant) MsgBox x If Not IsMissing(y) Then MsgBox y End If End Sub Private Sub Exec() strИмя = "ВашеИмя" ' Второй параметр не передается. Call Text(strИмя) End Sub

Если необязательный параметр отсутствует, то он рассматривается как параметр с типом variant, имеющий значение Empty. В предыдущем при мере показано, как с помощью функции IsMissing проверять необязательные параметры.

Значения по умолчанию для необязательных параметров

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

Sub ListText (x As String, Optional у As Integer = 12345) MsgBox x MsgBox y End Sub Private Sub Exec() strName = "yourname" ' Второй параметр не передается. Call Text (strName) ' Добавляет "yourname" and "12345". End Sub

Неизвестное число параметров

Обычно при вызове процедуры число ее параметров должно быть точно таким же, как и при ее объявлении. Ключевое слово РaramArray "разрешает" процедуре принимать произвольное число параметров. Приведем пример:

Dim x As Integer Dim у As Integer Dim intSum As Integer Sub Sum(ParamArray intNums()) For Each x In intNums у = у + x Next x intSum = у End Sub Private Sub Exec() Sum 1, 3, 5, 7, 8 MsgBox intSum End Sub

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

Function RunOut(Maximum) RunOut = RunOut(Maximum) End Function

Эта ошибка менее очевидна, если две процедуры бесконечное число раз вызывают друг друга, или некоторое условие, ограничивающее рекурсию, никогда не выполняется. Рекурсия имеет свои области применения. Например, следующая процедура использует рекурсию для вычисления факториалов:

Function Factorial (N) If N <= 1 Then ' Достигнут конец рекурсивных вызовов. Factorial = 1 ' (N = 0) завершение вызовов. Else ' Повторный вызов функции, если N > 0. Factorial = Factorial(N - 1) * N End If End Function

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

 устранения ненужных переменных;  использования типов данных , отличных от Variant;  переосмысления логики процедуры. Часто вместо рекурсии можно воспользоваться вложенными циклами.

Создание пользовательской функции на VBA в среде EXCEL. Любая процедура и функция, содержащиеся в общем модуле (но не в модуле формы и не в модуле класса), могут быть использована на рабочем листе Excel. Для выполнения процедур используется команда меню Сервис/Макрос/Макросы, а для вставки функций применяется команда меню Вставка/Функция или кнопка стандартной панели инструментов Вставка функции. При вставке функции запускается мастер функций, и если в проекте VBA имеется хотя бы одна функция, то в правом окне мастера функций появляется категория Определенные пользователем. При выборе этой категории в левом окне мастера функций отображается перечень функций проекта VBA. После выбора необходимой функции из списка, мастер функций предлагает ввести ее параметры, количество которых определено в ее заголовке. Если функция имеет необязательные параметры, или их число не определено, то мастер функций будет открывать окна для их ввода последовательно, по мере заполнения ранее открытых, как это происходит, например, при вставке функции рабочего листа СУММ. Значения параметров можно ввести с клавиатуры, либо можно ввести адрес ячейки, содержащей значение, либо можно указать ячейку с параметром, щелкнув по ней правой кнопкой мыши. Заметим, что ввод в качестве параметра диапазона ячеек допустим лишь в том случае, когда функция имеет неопределенное количество параметров, либо вводимый параметр представляет собой массив, либо он имеет объектовый тип данных Range.

В качестве примера перепишем в виде функции процедуру замены букв "А", "Б", "В" на цифры 1, 2, 3 соответственно (пример 6):

Function пример11(s As String) Dim sn As String, t As String Dim l As Integer, i As Integer l = Len(s) For i = 1 To l t = Mid(s, i, 1) Select Case t Case "А": sn = sn + "1" Case "Б": sn = sn + "2" Case "В": sn = sn + "3" Case Else: sn = sn + t End Select Next i пример11 = sn End Function

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

www.mini-soft.ru

Процедуры и функции из вызовов в VBA

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

[private|public]static]sub имя ([список_аргументов])

[AS < тип данных >]

<тело_процедуры>

[exit sub]

<тело_процедуры>

End Sub

Значение:

Sub – основное ключевое слово процедуры (идущение за ним - тело процедуры)

Public – объявленнная константа доступна для любой процедуры

Private – для процедур внутри модуля

Static – локальные переменные сохраняются в промежутках времени между вызовами этой процедуры

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

Процедуры-подпрограммы sub

Процедуры-фукнции function

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

Операторы в VBA

Логические операторы

Стандартные логические операции (>,<,>=,<=,<>)

OR – логическое ИЛИ

AND – логическое И

Not – логическое отрицание

Простейшие операторы

Let – оператор присвоения обозначается знаком =

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

Оператор условного перехода IF передаёт управление ходом выполнения программы в зависимости от истинности некоторого условия

Оператор выбора одной из нескольких альтернатив Select Case

Операторы для организации циклических процессов предзначены для выполнения последовательности операторов цикла (for… Next,for Each… Next, While… Wend, Do… Loop.)

Операторы цикла с параметром for… Next выполняет операторы тела цикла заданное число раз.

Цикл с неизвестным числом повторений While… wend используется для выполнения операторов в теле цикла до тех пор, пока условие сохраняет значение «истина».

 

Использование функций в VBA

Математические и логические функции и операторы

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

+ - сложение;

- - вычитание;

/ - деление;

*- умножение

Математические функции:

Функция Описание
SQR(x) Возвращает квадратный корень числа
X^n Возвращает значение числа в степени n
Sin(x) Возвращает синус угла в радианах
Cos (x) Возвращает косинус угла в радианах
Abs(x) Возвращает модуль числа
Tan(x) Возвращает тангенс угла в радианах
Atn(x) Возвращает арктангенс угла в радианах
Exp(x) Возвращает значение числа е в степени х
Log(x) Возвращает натуральный логарифм числа

Для целых чисел используют оператор MOD. Он возвращает остаток при целом делении двух чисел (значение по модулю).

Синтаксис:

Результат = число1 Mod число2

Логические операторы:

Стандартные логические операции (>,<,>=,<=,<>)

Оператор OR. Выполняет операцию логического ИЛИ (сложения) для двух выражений. Синтаксис: результат=выражение1 Or выражение2

Оператор AND. Возвращает результат конъюнкции (логического И) для двух выражений. Синтаксис: результат=выражение1 And выражение2

Оператор Not. Выполняет над выражением операцию логического отрицания. Синтаксис: результат=Not выражение

 

46 Область определения переменных и констант в VBA

Константы, их объявление.Как и переменные, константы имеют имя, но не изменяют своего значения во время выполнения программы. Для определения констант в Visual Basic используется оператор Constтакого формата:

[Public | Private] Const {имя константы [AS <тип данных>] =

<константное выражение>}…

Поясним значение ключевых слов:

Public — объявленная константа доступна для любой процедуры из всех модулей базы данных;

Private — объявленная константа доступна для процедур только внутри своего модуля;

AS <тип данных> - объявление типа данных константы.

Примеры объявления констант.

Const Max = 100000

Public Const strVolume = «Maximum»

Private Const Max AS Integer = 100 000

Private Const PI AS Double = 3.14159

Значение переменной изменяется в процессе выполнения программы. Если переменная доступна многим программам, то какая-то программа может изменить значение переменной; чтобы избежать этого, ограничивают доступ к переменным. Для этого пользователь-программист определяет, какие процедуры будут иметь доступ к переменной, — определяет область действия (область видимости) переменной.

 

Область действия Способ объявления константы
Отдельная процедура В процедуре или функции
Отдельный модуль Перед первой процедурой в модуле
Все модули Перед первой процедурой в модуле с ключевым словом Public

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

 

Соглашение по синтаксису в VBA, по идентификации

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

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

Правила присвоения переменным имен:

· длина имени не может превышать 255 символов;

· первым символом в имени переменной должна быть буква;

· в имени можно использовать прописные или строчные буквы, числа и знак подчеркивания;

· запрещены ключевые слова (имена функций и операторов VBA) и символы @, $, #, &, %, !.

Имя объекта может начинаться с префикса типа данных (три латинские буквы) объявляемого объекта. Например: intСтипендия (int — целое число), strProzvisca (str — символьное число), bitПроверка (bit — логический тип).

Инструкция Const в VBA

Описывает константы, используемые вместо констант в явном представлении (литералов).

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

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

имяКонстанты -Обязательный. Имя константы, удовлетворяющее стандартным правилам именования переменных.тип-Необязательный. Один из поддерживаемых типов данных: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String или Variant. Для каждой описываемой константы следует использовать отдельное предложение As тип.выражение-Обязательный. Литерал, другая константа или любое сочетание, которое включает все арифметические или логические операторы за исключением Is.

ЗамечанияКонстанты по умолчанию являются личными. Внутри процедур константы всегда являются личными; их видимость не может быть изменена. В стандартных модулях видимость, которую по умолчанию имеют константы на уровне модуля, может быть изменена с помощью ключевого слова Public. В модулях класса, однако, константы могут быть только личными, и их видимость не может быть изменена с помощью ключевого слова Public.Имеется возможность объединять несколько описаний констант на одной строке, разделяя инструкцию присвоения каждой константы с помощью запятой. Если описания констант объединяются таким образом, используемое ключевое слово Public или Private применяется ко всем константам на строке.Не допускается использование переменных, определяемых пользователем функций или внутренних функций языка Visual Basic (типа Chr) в выражениях, присваиваемых константам.Константы помогают сделать программы самодокументируемыми и легко доступными для исправлений. В отличие от переменных константы не могут непредсказуемым образом изменяться при выполнении программы.Если тип константы не задается явным образом (с помощью предложения As тип), константа приобретает тип, наиболее подходящий заданному выражению.Константы, описанные в процедурах Sub, Function или Property являются локальными для этих процедур. Областью определения константы, описанной вне процедуры, является модуль, в котором она описана. В любом месте, в котором возможно использование выражений, допускается использование и констант.

ПримерВ данном примере инструкция Const используется для описания констант, используемых вместо текстовых значений. Общие (Public) константы размещаются в общем разделе стандартного модуля, но не модуля класса. Личные (Private) константы могут быть описаны в общем разделе модуля любого типа.

' По умолчанию константы являются личными (Private).Const MyVar = 459 ' Объявляет общую (Public) константу.Public Const MyString = "СПРАВКА" ' Объявляет личную (Private) целую (Integer) константу.Private Const MyInt As Integer = 5 ' Объявляет несколько констант в одной строке.Const MyStr = "Привет", MyDouble As Double = 3.4567

Массивы в VBA. Основные понятия

Массив – это n-мерная совокупность индексированных переменных одного типа. Массиву присваивается имя – имя переменной, за которым в круглых скобках указано одно (для одномерных) или два (для двухмерных) натуральных положительных числа. Элементы из которых состоит массив называют переменными, которые в памяти размещаются последовательно. Все элементы массива имеют одно имя, но различные номера в массиве. Число элементов в массиве задается при его объявлении в операторе Dim и во время выполнения программы не изменяется.

Объявление массива – это задание имени массиву, а также определение типа и количества его элементов. С элементами массива можно работать также как и при использовании обычной переменной. Массивы могут быть как числовыми так и символьными.

Общий вид объявления массива:

Dim <имя массива> (<размер массива>) AS <тип данных>

Пример:

Dim mass(23) AS Integer -одномерный массив

Dim MASS(5 TO 8) AS Integer –двумерный массив

 

 



infopedia.su

Использование функций в вычислениях в vba

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

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

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

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

Функции рабочего листа Excel, частично описанные в главе 4, также можно использовать в программе на VBA.

        1. Использование функций из надстроек

Прежде чем пользоваться в программе на VBAфункциями, входящими в состав надстройки, следует установить ссылку на надстройку. Находясь внутри активного модуляVBA, надо выполнить командуReferencesиз менюTools. Необходимо активировать флажок около имени файла с расширениемxla, соответствующего надстройке. Если такого файла нет среди спискаAvailableReferences, то следует найти (Browse) и открыть нужный файл с расширением.xlaв соответствующей поддиректории.

        1. Функции, подготовленные в языках программирования

Помимо встроенных функций и функций, созданных с помощью VBA, в Excel можно использовать функции, написанные на С++. Для этого необходим компилятор, который может создавать динамически связываемые библиотеки (DLL).

Текст процедуры на С++ имеет некоторые особенности. Заголовок программы должен иметь флажки export, pascal, far. В программе нельзя использовать глобальные переменные и общие блоки данных.

Кроме текста самой программы необходимо создать файл объявления для объявления внешних переменных функции. В этом файле должна содержаться процедура выхода, необходимая для удаления библиотеки из памяти по завершении работы с ней.

И, наконец, функцию следует объявить в Excel.

Для этого следует использовать инструкцию DeclareизVBA.

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

        1. Применение объекта WorksheetFunction для использования функций рабочего листа

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

Следует использовать свойство WorksheetFunction объекта Application чтобы получить объект WorksheetFunction. Этот объект служит контейнером всех тех функций листа, которые можно вызвать из VBA.

Предположим, вы хотите использовать не функцию Pmt из Visual Basic, а функцию листа ПЛТ (так ExcelXP, ранее вExcel97 ППЛАТ), но в макросе все равно следует использовать английское название Pmt.

Static loanAmt

Static loanInt

Static loanTerm

loanAmt = Application.InputBox _

(Prompt:="Loan amount (100,000 for example)", _

Default:=loanAmt, Type:=1)

loanInt = Application.InputBox _

(Prompt:="Annual interest rate (8.75 for example)", _

Default:=loanInt, Type:=1)

loanTerm = Application.InputBox _

(Prompt:="Term in years (30 for example)", _

Default:=loanTerm, Type:=1)

payment = Application.WorksheetFunction _

.Pmt(loanInt / 1200, loanTerm * 12, loanAmt)

MsgBox "Monthly payment is " & Format(payment, _

"Currency")

Рис. 8.10. Excel макрос для использования функции листа ППЛАТ

Рассмотрим еще один пример.

Пусть имеется надстройка SimpleFunctions. Пусть в этой надстройке имеется функция ArrInvSq, которая для диапазона аргумента вычисляет диапазон результат, заполненный квадратами обратных значений. Добавим надстройку к списку надстроек. Теперь функцией ArrInvSq можно пользоваться как функциями листа, см. Рис.8.11.

Рис. 8.11. Использования функции ArrInvSq

Напишем макрос для суммирования квадратов получаемых величин. Конечно, сначала выполним команду Referencesиз менюToolsвнутри активного модуляVBA. В макросе применим функцию листа СУММКВ, используя ее английское наименование SumSq.

Function SimpleSum(XArr As Variant) As Variant

SimpleSum = Application.WorksheetFunction.SumSq(ArrInvSq(XArr))

End Function

Рис. 8.12. Excel макрос для использования функции ArrInvSq

Теперь функцией SimpleSum можно пользоваться как функциями листа, см. Рис.8.13.

Рис. 8.13. Использования функции SimpleSum

studfiles.net

Пользовательские функции в Excel на VBA (+ видео)

Все, кто работает с Excel, сталкивались со встроенными функциями, например ВПР, ЕСЛИ и т.д. Из этих функций в Excel строятся различные формулы позволяющие, посчитать, обработать или принять решение. Эти функции находятся в мастере функций и разделены по группам. Мастер же позволяет упростить ввод аргументов функции. Набор функций в Excel достаточно обширный и для большинства задач можно найти нужную функцию или составить формулу из нескольких вложенных функций. Но что, если для решения задачи требуются особые вычисления!? В этом нам поможет встроенный язык VB, который позволяет написать собственные процедуры и функции обработки данных, при этом функции могут быть добавлены в мастер функций и использоваться как обычные встроенные функции (пользовательские функции).

Итак, что такое функция в Excel и VBA?Функция - это набор команд, которые обрабатывают данные заданным образом и возвращают результат. Функция имеет входные данные, используемые при расчетах (аргументы функции). По сути, функция это та же процедура, с которыми мы уже сталкивались неоднократно при написании макросов, только функция еще и возвращает результат. Функции могут использоваться в следующих ситуациях:

  • Как часть в процедуре VBA;
  • В формулах, создаваемых на листах Excel.

Область видимости функций аналогична области действия переменных т.е. Public, Private, Static. Описание функции начинается с ключевого слова Function и заканчивается End Function.Требования к именам функций такие же, как и к именам переменных в VBA.Рассмотрим простейший пример функции:

Function Test (a as integer, b as integer) as integer   Test = a*bend function

Мы создали функцию Test, которая имеет два аргумента a и b целого типа. Функция Test возвращает только целый результат. Наша функция находит произведение a и b. Обратите внимание, что результат мы присваиваем в Test т.е. это завершающая стадия работы функции. Если этого не сделать, то функция не вернет никакого результата. end function – указывает, что вычисления функции закончились.Эту функцию мы можем использовать в других процедурах и функциях vba как вспомогательную или в формулах листа Excel. Хочу обратить ваше внимание, если Вы пишите функции для использования в формулах, то описание функции должно располагаться в модуле (Module) и начинаться только со слова Function. Описание типа Private сделает функцию невидимой в мастере. Поэтому, если использование функции не планируется в формулах, то Вы можете ограничить ее область видимости: Private Function Test (a as integer, b as integer) as integer .....

Остановимся теперь более подробно на создании пользовательских функций, которые будут использоваться в формулах для вычислений.Мы уже создали функцию Test. Добавьте ее в созданный Module.

Переходим теперь на лист и вводим в ячейки A1 и B1 целые числа, выделяем ячейку C1 и жмем вставка функции. В мастере функций необходимо выбрать категорию "Определенные пользователем" и в списке функций найдите "Test":Далее, вставляйте как обычную функцию, указав аргументы.

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

Определение категории функции

По умолчанию функции находятся в категории "Определенные пользователем". Каким образом можно пользовательской функции переназначить категорию!?

С помощью команды: Application.MacroOptions Macro:="Test", Category:=10где Macro:="Test" это название нашего макроса, Category:=10 номер категории, куда разместить функцию. Всего категорий в Excel - 15. Ниже приведен список:

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

Sub InstallFunc()   Application.MacroOptions Macro:="Test", Category:=10End Sub 

Описание пользовательской функции

Как Вы заметили, наша функция не имеет никакого описания, для пользователей это будет неудобно, а те, кто впервые увидят эту функцию, вообще не поймут для чего она. Поэтому добавим некоторое описание нашей функции. По аналогии с определением категории, нам необходимо один раз выполнить команду Application.MacroOptions. Расширим наш InstallFunc:

Sub InstallFunc()   Application.MacroOptions Macro:="Test", Category:=10, _         Description:="Находит произведение аргументов A и B"End Sub

Собственно описание находится в Description. Выполните процедуру InstallFunc. Готово. Смотрим результат:

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

На этом пока все. Видео по созданию пользовательской функции и готовый пример Вы можете скачать ниже.

Прикрепленный файл: Видеопример создания функции в Excel.zip

 

www.programm-school.ru

Урок 17 по VBA - математические функции

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

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

ABS(num) – Функция возвращает значение числа по модулю.

Exp(num) – Функция позволяет получить значение экспоненты, передаваемый параметр (максимальное значение ровно 709 782712893) является степенью, в которую нужно возвести экспоненту. Соответственно, если параметр равен 1, то мы получить чистое значение экспоненты.

Fix(num) – Функция возвращает целую часть от переданного дробного значения. Если переданное значение является отрицательным, то возвращается ближайшее отрицательное целое число, большее, либо равное указанному.

Int(num) – Математическая функция vba возвращает целую часть от переданного дробного значения. Если переданное значение является отрицательным, то возвращается ближайшее отрицательное целое число, меньшее, либо равное указанному.

Rnd(random) – Функция вернет число, входящее в диапазон от 0 до 1 в случайном порядке, при этом, само число 1 не входит в диапазон, а 0 – входит. Перед вызовом функции надо прописывать конструкцию Randomize, которая отвечает за включение генератора случайных чисел.

В зависимости от значения переданного параметра random, данная математическая функция vba работает следующим образом:

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

Round(num, [accr])  - Округление заданного числа (num) до заданной точности (accr).

Sgn(num) – Данная математическая функция vba позволяет узнать знак числа, переданного как аргумент. Функция vba вернет следующие значения:

  • 0 – Число равно 0
  • -1 – Число является отрицательным
  • 1 – Число является положительным.

Sql(num) – Квадратный корень из переданного числового параметра num.

Следующие математические функции vba являются тригонометрическими. В качестве параметра для большинства указывается значение угла в радианах. Для перевода градусов в радианы используется формула:

Угол (в радианах) = угол (в градусах) * pi / 180, где pi = 3.14159265358979

Atn(par) – Арктангенс переданного числа (угол в радианах), функция вернет значение в диапазоне от -pi/2 до pi/2 радиан

Cos(par)  - Косинус переданного числа (угол в радианах), функция вернет значение в диапазоне от -1 до 1.

Sin(par)  - Синус переданного числа (угол в радианах), функция вернет значение в диапазоне от -1 до 1.

Tan(par)  - Тангенс переданного числа (угол в радианах).

Log(par)  – Натуральный логарифм переданного числа.

Я не буду приводить примеры для всех приведенных выше математических функций VBA, а приведу только один пример кода для функций sin и cos. Откройте редактор VBA (комбинация клавиш Alt + F11), добавьте в проект новый модуль (меню Insert/Module). В моем случае имя модуля – module3, в редакторе кода для заданного модуля пропишите следующие строки:

Sub Module3()   Dim oWord As Object, oDoc As Object, oSel As Object, oFont As Object Dim i As Integer, j As Integer i = 0: j = 0 Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add Set oSel = oWord.Selection oWord.Visible = True Set oFont = oSel.Font With oFont     .Size = 15     .Name = "Times New Roman"     .Bold = True     .ColorIndex = 2 End With   oSel.TypeText "Синус угла: от 0 до 360 с шагом 10"                                                                                                                          ' математические функции vba With oFont     .Size = 12     .Bold = False     .Bold = True     .ColorIndex = 0 End With   oSel.TypeParagraph oSel.TypeParagraph   Do While i <= 360 Dim my_var As String my_var = Radianus(i)     oSel.TypeText Sin(my_var) & vbTab & vbTab & "(" & i & ")"     oSel.TypeParagraph     i = i + 10 Loop With oFont     .Size = 15     .Name = "Times New Roman"     .Bold = True     .ColorIndex = 2 End With oSel.TypeParagraph oSel.TypeParagraph   oSel.TypeText "Косинус угла: от 0 до 360 с шагом 10"                                                                                                                ' математические функции vba With oFont     .Size = 12     .Bold = False     .Bold = True     .ColorIndex = 0 End With   oSel.TypeParagraph oSel.TypeParagraph   Do While j <= 360 my_var = Radianus(j)     oSel.TypeText Cos(my_var) & vbTab & vbTab & "(" & j & ")"     oSel.TypeParagraph     j = j + 10 Loop   End Sub Function Radianus(c)     Dim m_rad, m_pi     m_pi = 3.14159265358979     Radianus = c * m_pi / 180 End Function

В данном случае мы создаем новый документ Word, добавляем в него форматированный (объект Font) текст, содержащий параметры значений для синуса и косинуса. Я выбрал диапазон значений от 0 до 360 градусов, используя цикл vba do…loop.

scriptcoding.ru

Логические операции в Excel и vba. Процедуры и функции. Встроенные функции Excel и vba

А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 9. Семестр 1

Логические операции в Excel и VBA. Процедуры и функции. Встроенные функции Excel и VBA

Содержание Логические операции в Excel и VBA. Процедуры и функции. Встроенные функции Excel и VBA 1

Логические операции VBA 1

Процедуры и функции VBA 2

Вызов одной подпрограммы из другой 3

Передача данных при вызове программы 4

Передача данных по ссылке и по значению 4

Математические функции VBA 5

^

Sub r()

Dim v As Boolean

v = 2 * 2 = 4

MsgBox v

End Sub

^

Dim v As Boolean

v = 2 * 2 = 5

MsgBox v

End Sub

^

Dim Z, A, B, c, d As Boolean

A = True

B = False

c = True

d = False

Z = (A Or Not B) Xor (c And d)

MsgBox Z

End Sub

^

Dim Z, A, B, c, d As Boolean

A = True

B = False

c = True

d = True

Z = (A Or Not B) Xor (c And d)

MsgBox Z

End Sub

Запись в математической форме:

Соответствующая ей запись в форме программы:

If (A = True Or Not B = True) Xor (C = True And D = True) Then Z = True

Worksheets(1).Cells(8, 10).Value = Z^ До сих пор мы программировали в форме процедур (подпрограмм): которые начинаются со служебного слова Sub() с обязательным списком параметров, даже если он пустой и кончаются служебным словом End Sub. Кроме процедур допускается использование функций (Function)

Функции и подпрограммы имеют всего три основных отличия.

  • Функция начинается ключевым словом Function и заканчивается ключевыми словами End Function.
  • Функцию можно вызывать из формулы, введенной в ячейку.
  • Функция может возвращать значение в вызывающую программу или формулу.
      Рассмотрим пример функции Multiply, вычисляющей произведение двух чисел.

      Sub Chap02dProc42_CallFunction()      Dim Var1 As Integer      Dim Var2 As Integer      Dim Var3 As Integer      Var1 = 5      Var2 = 10      Var3 = Multiply(Var1, Var2)      MsgBox Var3 End Sub      Function Multiply(ByVal Var1, ByVal Var2)      Multiply = Var1 * Var2       End Function

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

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

      Function Multiply (ByVal Var1 As Integer,      ByVal Var2 As Integer) As Integer

Если Вы не укажете тип функции и ее аргументов, им будет присвоен тип по умолчанию (Variant).

      Вы, вероятно, обратили внимание на любопытную особенность вызова функции Multiply в примере 42 — он указан в правой части оператора присваивания, в левой части которого помещена переменная Var3. При этом список аргументов — Var1 и Var2 — заключен в круглые скобки. Эти переменные передаются в функцию Multiply, а возвращаемое ею значение присваивается переменной Var3. Взгляните на предыдущие примеры: при вызове подпрограммы передаваемые в нее аргументы в скобки не заключаются. Запомните следующие основные правила передачи аргументов в подпрограммы и функции.
Правило 1       Поскольку функция возвращает в вызывающую программу значение, ее можно применять в выражениях, то есть там, где Бы используете обычные переменные и значения. Помещая функцию в правой части оператора присваивания или в вызове другой программы, Вы должны заключить список ее аргументов в круглые скобки.
Правило 2       Для вызова функции и подпрограммы Вы вправе использовать ключевое слово Call (о нем читайте в справочной системе VBA). В этом случае список аргументов также заключается в круглые скобки.
Правило 3       Если функция вызывается сама по себе — не в составе выражения и без ключевого слова Call, — Вы не должны заключать список аргументов в круглые скобки.
^       

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

      =Multiply(50,100)

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

      =Multiply(A1,B1)

Этот вызов возвращает произведение содержимого ячеек А1 и В1.Excel вызовет функцию Multiply только при изменении содержимого ячеек А1 и В1. Чтобы изменить этот порядок и вызывать функцию при изменении любых ячеек рабочего листа, добавьте следующую инструкцию в начало функции:

      Function Multiply(ByVal Var1, ByVal Var2)      Application.Volatile True      Multiply = Var1 * Var2       End Function

Вызвав метод Volatile объекта Application, Вы «помечаете» функцию как вычисляемую по правилам для встроенных функций Excel. Если метод Volatile не вызван (или вызван без ключевого слова True), функция Multiply вызывается только при изменении исходных данных (то есть содержимого ячеек А1 и В1).

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

  • Если вам нужно несколько раз выполнить одну и ту же последовательность действий, Вы вправе задать ее всего один раз, оформив в виде подпрограммы, а затем по мере необходимости вызывать из других программ. При этом облегчается и ее редактирование, поскольку все изменения Вы вносите только однажды.
  • Код VBA , разделенный на подпрограммы, обретает четкую логическую структуру; его легче разрабатывать, отлаживать и обслуживать.
В следующем примере, в программе РгосЗ6, для вывода на экран сообщения о вводе данных мы используем подпрограмму DisplayMessage.

Sub Chap02dProc36_CallSecondProc()

Dim Range1 As Range

Set Range1 = Worksheets(1).Range("A1")

Range1.Value = 500

DisplayMessage

End Sub

Sub DisplayMessage()

MsgBox "Data has been entered"

End Sub

Proc36 вводит данные в ячейку А1 первого рабочего листа и вызывает в строке 5 программу DisplayMessage, которая выводит на экран сообщение и возвращает управление РгосЗ6.^

Вызывая подпрограмму, Вы вправе передать в нее переменные или значения. Эта возможность еще более расширяет область применения подпрограмм, позволяя выполнять одни и те же действия с различными исходными данными. Рассмотрим в качестве примера подпрограмму DisplayMessage. Сейчас она выводит сообщение «Data has been entered» (Были введены данные). Предположим, что кроме этого мы хотим знать, какое именно значение было введено, например «Было введено число 500». Проще всего передать в подпрограмму DisplayMessage аргумент (это можно сделать двумя способами; см. следующий пример). Как это сделать, показано в примере 37.

Sub Chap02dProc37_PassArgumentToProc()

Dim Range1 As Range

Set Range1 = Worksheets(1).Range("A1")

Range1.Value = 500

DisplayMessage2 Range1.Value

End Sub

Sub DisplayMessage2(Value1)

MsgBox "The value " & Value1 & " has been entered."

End Sub

Здесь есть два интересных момента. Во-первых, обращение к подпрограмме DisplayMessage2 в Ргос37 содержит аргумент Range1.Value. Во-вторых, в первой строке DisplayMessage2 в круглых скобках задано имя переменной Value1. Она принимает значение аргумента, указанного в вызове подпрограммы DisplayMessage2, и затем используется для вывода соответствующего значения в информационном окне.

^

Передача аргументов из одной программы в другую осуществляется двумя способами — по ссылке (by reference) и по значению (by value). В первом случае передается сама переменная, поэтому ее значение в подпрограмме можно изменить. Во втором случае — только значение переменной, а не она сама, и изменить ее в вызванной подпрограмме нельзя.      Выбор способа передачи осуществляется ключевыми словами ByRef и ByVal, которые в круглых скобках указываются в описании вызываемой подпрограммы.

Примечание       При отсутствии в описании аргументов ключевых слов ByRef и ByVal передача осуществляется по ссылке.
      В программе Ргос39 переменная UserName передается в подпрограмму ChangeName по ссылке.

      Sub Chap02dProc39_PassArgumentByReference()      Dim UserName As String      UserName = Jeff      ChangeName UserName      MsgBox UserName       End Sub

      Sub ChangeName(ByRef UserName)      UserName = Dave       End Sub

      В первой строке подпрограммы ChangeName в круглых скобках набраны ключевое слово ByRef и имя переменной UserName, указывая, что аргумент UserName будет передан в подпрограмму по ссылке. Это означает, что в подпрограмме используется сама переданная в нее переменная. В частности, в ChangeName переменной UserName присваивается новое значение "Dave", которое затем возвращается в Ргос39 и выводится на экран.

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

      Sub Chap02dProc41_PassArgumentByValue()      Dim UserName As String      UserName = "Jeff      ChangeName3 UserName      MsgBox Yet remains as " & UserName & " in the original proc."       End Sub

      Sub ChangeName3(ByVal UserName)      MsgBox "The original name is " & UserName & "."      UserName = "Dave"      MsgBox "The name is changed to " & UserName &      " in the called proc."       End Sub

      Исходное значение UserName передано в подпрограмму ChangeName3 и выведено на экран. Затем оно изменяется и снова выводится на экран во втором информационном окне. Поскольку аргумент был передан в ChangeName3 по значению, исходная переменная UserName после возвращения управления в Ргос41 не изменяется, о чем и свидетельствует окно, выводимое на экран в последней строке Ргос41.^

Abs(N) возвращает абсолютное значение аргумента

Atn(N) возвращает значение (в радианах) арктангенса аргумента

Cos(N) возвращает значение косинуса аргумента, заданного в радианах

Exp(N) возвращает значение экспоненты аргумента (число 2.718282…в степени N)

Fix(N) возвращает значение целой части аргумента, Fix(-8.4) даст -8

Int(N) аналогично Fix, но в сторону меньшего целого значения аргумента, Int(-8.4) даст -9

Log(N) возвращает значение натурального логарифма

Rnd(N) возвращает значение случайное число типа Single в диапазоне от 0 до 1

Для получения целого случайного число в диапазоне от lowerbound до upperbound использовать формулу:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

Sgn(N) возвращает значение 1 если N>0, 0 если N=0, -1 если N

Sin(N) возвращает значение синуса аргумента, заданного в радианах

Sqr(N) возвращает значение квадратного корня аргумента

Tan(N) возвращает значение тангенса аргумента, заданного в радианах

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

edu.znate.ru

НОУ ИНТУИТ | Лекция | Основы VBA: встроенные и пользовательские функции

Аннотация: Лекция посвящена описанию основных конструкций и принципов VBA. Подробно обсуждаются стандартные встроенные функции VBA и пользовательские процедуры и функции.

6.1. Встроенные математические функции

06-01-Математика.docm - пример к п. 6.1.

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

Таблица 6.1. Встроенные математические функции Функция Описание
Abs Абсолютное значение
Atn Арктангенс
Cos Косинус числа
Exp Возвращает число e (2.718282), возведенное в степень аргумента функции.
Fix Отбрасывает дробную часть числа и возвращает целую. В результате для положительных чисел получается число меньшее, чем входное (Fix(2.5) возвратит 2), для отрицательных - большее (Fix(-2.5) возвратит -2)
Int Отбрасывает дробную часть числа и возвращает целую. Для положительных получается число меньшее введенного (Int(2.5) возвратит 2), для отрицательных - так же меньшее (Int(-2.5) возвратит -3).
Log Возвращает натуральный логарифм числа
Rnd Возвращает случайное число типа Single, причем, это число находится между 0 и 1. Для инициализации генератора случайных чисел используйте директиву Randomize - ее надо вызвать до вызова Rnd.
Sgn Функция предназначена для определения знака числа. Если число положительное - она возвращает 1. Для нуля функция возвратит 0, для отрицательного числа -1.
Sin Синус
Sqr Квадратный корень
Tan Тангенс

Давайте рассмотрим пример. Добавим в документ Microsoft Word кнопку, назовем ее cmd_Calc, надпишем ее как Вычисления и добавим следующий код (листинг 6.1.), иллюстрирующий работу рассмотренных функций.

Dim dblNumber As Double 'Переменная, используемая в вычислениях Dim varResult 'Переменная типа Variant dblNumber = Val(InputBox("Введите число")) 'Вычисляем абсолютное значение введенного числа 'Сначала присвоим результат переменной varResult 'Далее - выведем подписанный результат в окне 'сообщения, воспользуемся знаком "+" для 'конкатенации строк, в других случаях 'будем вызывать функции непосредственно 'в MsgBox'e 'Обратите внимание на то, что мы конвертируем 'числовые значения в строки с помощью функции Str varResult = Abs(dblNumber) MsgBox ("Абсолютное значение " + _ Str(dblNumber) + " равняется " + Str(varResult)) 'Арктангенс MsgBox ("Арктангенс " + _ Str(dblNumber) + " равняется " + _ Str(Atn(dblNumber))) 'Косинус MsgBox ("Косинус " + _ Str(dblNumber) + " равняется " + _ Str(Cos(dblNumber))) 'e в степени введенного числа MsgBox ("Число e в степени " + _ Str(dblNumber) + " равняется " + _ Str(Exp(dblNumber))) 'Функция Fix MsgBox ("Результат работы функции Fiх для " + _ Str(dblNumber) + " равняется " + _ Str(Fix(dblNumber))) 'Функция Int MsgBox ("Результат работы функции Int для " + _ Str(dblNumber) + " равняется " + _ Str(Int(dblNumber))) 'Натуральный логарифм MsgBox ("Натуральный логарифм " + _ Str(dblNumber) + " равняется " + _ Str(Log(dblNumber))) 'Получим несколько случайных чисел 'первое число - от 0 до 1 'второе - от 0 до 10. 'Третье - от 25 до 100 'Четвертое - целое от 0 до 34 Randomize MsgBox ("Группа случайных чисел: " + _ Str(Rnd()) + ", " + _ Str(Rnd() * 10) + ", " + _ Str(Rnd() * 75 + 25) + ", " + _ Str(Int(Rnd() * 34))) 'Функция Sgn MsgBox ("Результат работы Sgn для " + _ Str(dblNumber) + " равняется " + _ Str(Sgn(dblNumber))) 'Cинус MsgBox ("Синус " + _ Str(dblNumber) + " равняется " + _ Str(Sin(dblNumber))) 'Квадратный корень MsgBox ("Квадратный корень " + _ Str(dblNumber) + " равняется " + _ Str(Sqr(dblNumber))) 'Тангенс MsgBox ("Тангенс " + _ Str(dblNumber) + " равняется " + _ Str(Tan(dblNumber))) Листинг 6.1. Обработчик события Click кнопки cmd_Calc

Обратите внимание на алгоритм получения случайного числа, находящегося в определенном диапазоне, с помощью функции Rnd. Предположим, нам нужно получить случайное число от 15 до 40. Получим, для начала, число от 0 до 40. Очевидно, что для этого нам понадобится такой вызов: Rnd()*40.

Чтобы "поднять" уровень наименьшего случайного числа, возвращаемого выражением, до 15, сделаем следующее.

Во-первых, вычислим разность 40 и 15 - у нас получится 25. Значит, чтобы получить случайное число от 0 до 25, можно использовать вызов Rnd()*25.

Во-вторых, прибавим к полученному случайному числу 15. Теперь выражение для получения случайного числа от 15 до 40 выглядит так: Rnd()*25+15.

Проверим это высказывание на правильность. Функция Rnd, как известно, возвращает случайные числа от 0 до 1. Если функция возвратит 0 - результат вычисления выражения будет равен 15 (0*25+15). Если функция возвратит 1 - результат будет равен 40 (25*1+15). Промежуточные значения Rnd дадут искомые случайные числа между 15 и 40.

На рис. 6.1. вы можете видеть окно сообщения, содержащее результаты вызовов функции Rnd.

Рис. 6.1. Окно сообщения, выводящее случайные числа

Выше мы работали, в основном, с числами, теперь поговорим о строковых переменных.

6.2. Строковые функции

06-02-Строковые функции.docm - пример к п. 6.2.

В табл. 6.2. вы можете найти информацию об основных строковых функциях VBA.

Таблица 6.2. Строковые функции Функция Описание
Len(string) Возвращает длину строки. Например, длина строки "Добрый день" составляет 11 символов - учитывая пробел. Выходное значение имеет тип Long
LCase(string) Возвращает строку, все символы которой записаны в нижнем регистре. Например, строка "Привет" превратится в "привет"
UCase(string) Возвращает строку, все символы которой записаны в верхнем регистре. Например, для "Привет" мы получим "ПРИВЕТ"
String(number, character) Возвращает строку, состоящую из number символов character
Left(string, length) Возвращает length символов, начиная с первого левого символа строки string
Right(string, length) Возвращает length символов, начиная с самого правого символа строки string
LTrim(string) Возвращает строку, в которой вырезаны все пробелы слева
RTrim(string) Вырезает из строки все пробелы справа
Trim(string) Вырезает из строки все пробелы слева и справа
Mid(string, start[, length]) Вырезает из строки string с позиции start length символов
Asc(string) Возвращает ASCII-код первого символа строки
Chr(charcode) Возвращает символ, соответствующий коду символа

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

Создадим документ Microsoft Word и добавим на него следующие кнопки табл. 6.3.

Обработчик нажатия кнопки cmd_Len (листинг 6.2.) будет содержать решение следующей задачи: сообщить пользователю длину введенного текста. Очевидно, для решения этой задачи нам понадобится функция Len.

'Переменная для хранения входной строки Dim str_InpStr As String 'Переменная для хранения найденной длины строки Dim lng_StrLen As Long str_InpStr = InputBox("Введите строку") 'Вычисляем длину строки lng_StrLen = Len(str_InpStr) MsgBox ("Длина введенной строки: _" + _ str_InpStr + "_ равняется " + Str(lng_StrLen) + _ " символам") Листинг 6.2. Пример использования функции Len

На рис. 6.2. вы можете видеть результат вычисления длины строки.

Рис. 6.2. Результат вычисления длины строки

Теперь займемся конверсией символов - функциями LCase и UCase (листинг 6. 3.).

'Переменная для хранения входной строки Dim str_InpStr As String 'Переменная для хранения измененной строки Dim str_NewStr As String str_InpStr = InputBox("Введите текст") 'В str_NewStr окажется введеная строка 'в которой все прописные буквы заменены строчными str_NewStr = LCase(str_InpStr) MsgBox ("Измененная строка: " + str_NewStr) 'Теперь в str_NewStr будет та же строка 'в которой все буквы стали прописными str_NewStr = UCase(str_InpStr) MsgBox ("Измененная строка: " + str_NewStr) Листинг 6.3. Пример использования функций LCase и UCase

На очереди - вырезание символов - функции Mid, LTrim, Rtrim, Left, Right (листинг 6.4.) Среди этих функций наиболее мощной является Mid - используя ее, можно делать со строками очень много всего.

'Переменная для хранения входной строки Dim str_InpStr As String 'Переменная для хранения вырезанных символов Dim str_NewStr As String 'Зададим строку, с которой удобно будет работать str_InpStr = " Здравствуйте, Александр " 'Функции удаления пробелов 'При выводе строки ставим перед ее началом 'и концом символ "_" для того чтобы 'лучше было видно наличие 'или отсутствие пробелов MsgBox ("Мы работаем с такой строкой: " + _ "_" + str_InpStr + "_") 'LTrim - присваиваем результаты работы 'переменной и выводим информацию в MsgBox str_NewStr = LTrim(str_InpStr) MsgBox ("Результат работы LTrim: " + _ "_" + str_NewStr + "_") 'RTrim MsgBox ("Результат работы RTrim: " + _ "_" + RTrim(str_InpStr) + "_") 'Trim MsgBox ("Результат работы Trim: " + _ "_" + Trim(str_InpStr) + "_") 'Left - вырезаем из строки str_InpStr 12 'символов предварительно очистив ее 'от начальных пробелов str_NewStr = Left(LTrim(str_InpStr), 12) MsgBox ("Первые 12 символов слева: " + _ str_NewStr) 'Right - аналогично Вырезаем 9 символов справа str_NewStr = Right(RTrim(str_InpStr), 9) MsgBox ("Первые 9 символов справа: " + _ str_NewStr) 'Функция Mid - для начала выведем по одному символу 'со второй и пятнадцатой позиции строки 'преварительно очищенной от лишних пробелов 'в начале и в конце str_NewStr = Mid(Trim(str_InpStr), 2, 1) MsgBox ("Второй символ введенной строки: " + _ str_NewStr) str_NewStr = Mid(Trim(str_InpStr), 15, 1) MsgBox ("Пятнадцатый символ введенной строки: " + _ str_NewStr) 'Выведем 5 символов, начиная с 15 символа str_NewStr = Mid(Trim(str_InpStr), 15, 5) MsgBox ("Пять символов строки с 15-й позиции: " + _ str_NewStr) Листинг 6.4. Пример использования функций для вырезания символов

Теперь рассмотрим примеры работы функций Asc, Chr и функции String. Чтобы работать с функциями Asc и Chr нам нужно познакомиться с понятием таблицы символов ASCII.

ASCII расшифровывается как American Standard Code For Information Intercharge - американский стандартный код для обмена информацией. Каждый символ в ASCII закодирован восьмибитным кодом. В результате получается таблица, в которой каждому управляющему символу, цифре, букве латинского или национального алфавитов сопоставлен свой код. Коды записывают в различных представлениях - в основном - в шестнадцатеричном и десятичном. Мы будем пользоваться десятичной записью.

Мы не будем приводить здесь таблицу ASCII полностью, приведем лишь некоторые полезные коды и диапазоны кодов.

Коды в диапазоне 0-31 имеют управляющие символы. Символ возврата каретки (тот самый, который вставляется в документ при нажатии клавиши Enter ) имеет код 13.

Коды в диапазоне 32-127 имеют латинские символы, цифры, знаки препинания - эта часть таблицы остается постоянной для различных кодовых таблиц. Например, пробел имеет код 32, точка - 46. Диапазон 48-57 занимают цифры от 0 до 9, диапазон 65-90 занимают заглавные латинские буквы от A до Z, диапазон 97-122 - строчными буквы a-z.

В диапазоне 128-225 расположены символы национальной кодировки. В русифицированных версиях MS Windows обычно применяется кодовая страница MS Windows 1251. В ней коды 192-223 имеют заглавные буквы от А до Я, 224-255 - строчные буквы от а до я.

Используя коды символов можно вводить в документы (или записывать в файлы, создаваемые программно) символы, которые нельзя ввести с клавиатуры.

В коде обработчика Click для cmd_Asc создадим программу (листинг 6.5.), которая сначала запрашивает у пользователя ввод символа, после чего выводит его ASCII код, потом - ввод кода, после чего выводит соответствующий ему символ. Так же здесь мы посмотрим на то, как работает функция String:

'Переменная для хранения кода символа Dim num_AscNumber 'Переменная для хранения символа Dim str_Char 'Начало блока перевода кода в символ num_AscNumber = Val(InputBox("Введите код символа")) 'В переменной str_Char теперь хранится символ 'с кодом num_AscNumber str_Char = Chr(num_AscNumber) MsgBox (str_Char + " - символ с кодом " + _ Str(num_AscNumber)) 'Начало блока перевода символа в код str_Char = InputBox("Введите символ") 'Теперь в переменной num_AscNumber хранится 'Код символа, введенного в str_Char num_AscNumber = Asc(str_Char) MsgBox ("Символу " + str_Char + " соответствует код" + _ Str(num_AscNumber)) 'А теперь - пример функции String. 'выведем в окне сообщения 15 символов * MsgBox ("15 символов *: " + String(15, "*")) Листинг 6.5. Пример использования функций Chr, Asc, String

www.intuit.ru