Программа vba для вычисления значения функции

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

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.), иллюстрирующий работу рассмотренных функций.

Вычисление значения функции с помощью VBA


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 .

Создание сложных функций в Microsoft Excel, часть 1

Чтобы «поднять» уровень наименьшего случайного числа, возвращаемого выражением, до 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. Строковые функции

В табл. 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.

Таблица 6.3. Кнопки на листе Имя кнопки Надпись Номер листинга
cmd_Len Длина строки листинг 6.1.
cmd_Conv Конверсия листинг 6.2.
cmd_Mid Вырезание листинг 6.3.
cmd_Asc Коды листинг 6.5.

Обработчик нажатия кнопки 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 закодирован восьмибитным кодом. В результате получается таблица , в которой каждому управляющему символу, цифре, букве латинского или национального алфавитов сопоставлен свой код. Коды записывают в различных представлениях — в основном — в шестнадцатеричном и десятичном. Мы будем пользоваться десятичной записью.

Оператор Function (Visual Basic)

Объявляет имя, параметры и код, определяющие процедуру Function .

Синтаксис

[ ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ] Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ] [ statements ] [ Exit Function ] [ statements ] End Function

Компоненты

  • attributelist Необязательный элемент. См. раздел Список атрибутов.
  • accessmodifier Необязательный элемент. Может применяться один из перечисленных ниже типов.
  • Public
  • Защищены
  • Друг
  • Частная
  • Protected Friend
  • Частная защищенная
  • Перегрузки
  • Переопределения
  • Overridable
  • NotOverridable
  • MustOverride
  • MustOverride Overrides
  • NotOverridable Overrides

Комментарии

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

Чтобы вернуть значение в вызывающий код, используйте процедуру Function ; в противном случае — процедуру Sub .

Определение функции

Процедуру Function можно определить только на уровне модуля. Таким образом, контекст объявления для функции должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.

Function по умолчанию используется общий доступ. Уровни доступа можно настроить с помощью модификаторов доступа.

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

Если в этой процедуре Implements используется ключевое слово, содержащий класс или структуру также должен иметь оператор, который сразу же следует за его Class оператором Implements или Structure . Инструкция Implements должна включать каждый интерфейс, указанный в implementslist . Однако имя, по которому интерфейс определяет Function (в definedname ), не обязательно совпадает с именем этой процедуры (в name ).

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

Возврат из функции

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

Чтобы вернуть значение из функции, можно присвоить значение имени функции или включить его в инструкцию Return .

Оператор Return одновременно присваивает возвращаемое значение и завершает функцию, как показано в следующем примере.

Function MyFunction(ByVal j As Integer) As Double Return 3.87 * j End Function

В следующем примере возвращается значение имени myFunction функции, а затем используется Exit Function оператор для возврата.

Function MyFunction(ByVal j As Integer) As Double MyFunction = 3.87 * j Exit Function End Function

Операторы Exit Function и Return вызывают немедленный Function выход из процедуры. Любое количество операторов Exit Function и Return может отображаться в любом месте процедуры, и вы можете смешивать Exit Function операторы и Return .

Если вы используете Exit Function без присвоения значения name , процедура возвращает значение по умолчанию для типа данных, указанного в returntype . Если returntype параметр не указан, процедура возвращает Nothing значение , которое является значением по умолчанию для Object .

Вызов функции

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

Процедура вызывается Function так же, как и любая функция библиотеки, например Sqrt , Cos или ChrW .

Функцию также можно вызвать с помощью Call ключевое слово. В этом случае возвращаемое значение игнорируется. Call В большинстве случаев использовать ключевое слово не рекомендуется. Дополнительные сведения см. в разделе Оператор вызова.

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

Читайте также:
Электронный документооборот какая программа

Асинхронные функции

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

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

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

Функция Async может иметь тип возвращаемого Task значения или Task. Ниже приведен пример Async функции с типом возвращаемого Task значения .

Функция Async не может объявлять параметры ByRef .

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

Функции итератора

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

Вызов итератора из клиентского кода с помощью параметра For Each. Следующая инструкция.

Тип возвращаемого значения функции итератора может быть IEnumerable, IEnumerable , IEnumeratorили IEnumerator .

Дополнительные сведения см. в разделе Итераторы.

Пример 1

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

Public Function CalcSum(ByVal ParamArray args() As Double) As Double CalcSum = 0 If args.Length

Пример 2

В следующем примере вызывается функция, объявленная в предыдущем примере.

Module Module1 Sub Main() ‘ In the following function call, CalcSum’s local variables ‘ are assigned the following values: args(0) = 4, args(1) = 3, ‘ and so on. The displayed sum is 10. Dim returnedValue As Double = CalcSum(4, 3, 2, 1) Console.WriteLine(«Sum: » Sum: » Result: » https://learn.microsoft.com/ru-ru/dotnet/visual-basic/language-reference/statements/function-statement» target=»_blank»]learn.microsoft.com[/mask_link]

Урок 20. Создание и вызов пользовательских функций

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

Основные отличия функции от процедуры:

  1. Функция имеет тип (аналогично переменной) и вычисляет некоторое значение, которое возвращается в место вызова функции.
  2. Функция имеет только входные параметры, может возвращать только одно значение.
  3. Вызов функции осуществляется посредством указания ее имени правой части оператора присваивания. В отличие от функции, процедура вызывается при помощи отдельного оператора

Объявление (создание) функции

Функцию, как и процедуру, можно объявить как локальную (Private) так и глобальную (Public).

Пользовательские функции объявляются с помощью ключевого слова Function:

[Private] Function () As End Function

— список входных формальных параметров (выходных параметров в этом списке нет).

Return — это новый оператор Visual Basic .NET. Он позволяет указать, когда нужно выйти из блока кода функции, чтобы возвратить значение в вызывающую программу, и каково это возвращаемое значение.

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

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

Вызов функции

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

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

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

Проект «Подпрограмма функция»

Private Function Fact(ByVal a As Byte) as Integer Dim i As Byte p = 1 For i = 1 To a p = p * i Next
Return p End Sub
Private Sub Button1_Click ( . . . Dim n As Byte Dim f As Integer n = Val(InputBox(«Введите заданное число:», «Ввод»)) f = fact(5) MsgBox(Str(n) != » Вывод») End Sub

Теперь вы можете писать собственные функции, вызывать их и передавать им информацию.

Источник: gospodaretsva.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru