Vba вызов функции: Оператор Function (VBA) | Microsoft Learn

Содержание

Запуск пользовательских функций. VBA для чайников

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

Один из способов запустить функцию, — это, конечно же, использовать стандартную процедуру запуска в VBA, т.е. вызвать ее внутри процедуры Sub. Детально данная техника описана в главе 6.

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

=MemoryAvailable()

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

=MemoryAvailable() & «»сейчас доступно байт»

=IF(CheckForValue(Б8:В18,С8)),»Значение найдено»,»Значение не найдено»)

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


Можно добавить к функции описание, которое будет появляться в диалоговом окне Вставка функции при выборе функции. Для создания описания выберите команду Сервис=Макрос=Макросы и затем в поле Имя макроса введите имя функции (функции не отображаются в списке макросов). Теперь щелкните на кнопке Параметры для ввода описания функции в соответствующее поле.

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

=Примитивные фунции.xls!УмнаяФункция (C4:D6,M9)

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

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

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

Все что можно увидеть вместо этого, — это неясное сообщение об ошибке вроде

#ЗНАЧ! в ячейке, содержащей формулу. При построении пользовательской функции можно воспользоваться следующими приемами, которые помогут в тестировании и отладке функции.

Прежде чем поместить функцию в рабочий лист, протестируйте ее, вызвав через процедуру Sub. Такой способ вызова позволяет получить сообщение об ошибке VBA и доступ к инструментарию отладки. Если функция требует ссылки на ячейки, необходимо при вызове функции использовать объект Range, как показано в данном примере:

Sub FxTester()

ReturnVal = CheckForValue(Range(«B8:B13»),Range(«C8»))

MsgBox ReturnVal

End Sub

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

Профессиональное написание функций

Не стоит отказываться от возможности написания функции таким образом, чтобы выдаваемый се результат был именно таким, как вам того хотелось бы. Зачем поручать формуле выполнять то, что можно сделать в самой функции? Приведенная модификация функции CheckForValue (она приводилась в разделе «Написание пользовательских функций рабочего листа») вместо непонятных значений True и False возвращает строку поясняющего текста:

Function CheckForVaiue2(aRange, Value)

For Each objCell In aRange

CheckForValue2 = «искомое значение» 6 Value & _

«не найдено»

If objCell.Value = value Then

CheckForValue2 = «искомое значение» & Value & _

«находится в ячейке» & objCell.Address

Exit For

End If

Next objCell

End Function

Если модифицированной функции удается найти искомое значение где-либо внутри диапазона, она возвращает строчку вроде Искомое значение 3, 57 находится

Б ячейке SFS83; в противном случае возвращается строчка Искомое значение

3,57 не найдено.

Запуск с помощью системных функций Windows

Запуск с помощью системных функций Windows
Другим вариантом запуска модулей панели управления является использование специальных функций, находящихся в библиотечном файле shell32.dll. Хотя из сценариев нельзя напрямую вызывать системные функции Windows, для этой цели можно

2.3. UDP: протокол пользовательских дейтаграмм

2.3. UDP: протокол пользовательских дейтаграмм
UDP — это простой протокол транспортного уровня. Он описывается в документе RFC 768 [93]. Приложение записывает в сокет UDP дейтаграмму (datagram), которая инкапсулируется (encapsulate) или, иначе говоря, упаковывается либо в дейтаграмму IPv4, либо

Отображение пользовательских имен

Отображение пользовательских имен
На компьютере под управлением Linux, работающем независимо от других машин, за отображение пользовательских имен в числовые идентификаторы (UID) отвечает файл /etc/passwd. Аналогично, информация о соответствии имен групп и их идентификаторов

Накрутка пользовательских факторов

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

Создание пользовательских стилей

Создание пользовательских стилей
Несмотря на то что в каждой версии Word количество заготовленных стилей увеличивается, весьма вероятно, что вы не найдете среди них именно то, что нужно вам в данный момент. По этой причине в Microsoft Word предусмотрена также возможность

Создание пользовательских исключений, раз…

Создание пользовательских исключений, раз…
Всегда есть возможность генерировать экземпляр System. Exceptiоn, чтобы сигнализировать об ошибке времени выполнения (как показано в нашем первом примере), но часто бывает выгоднее построить строго типизированное исключение, которое

Создание пользовательских исключений, два…

Создание пользовательских исключений, два…
Тип CarIsDeadException переопределяет свойство System.Exception.Message, чтобы установить пользовательское сообщение об ошибке. Однако задачу можно упростить, установив родительское свойство Message через входной параметр конструктора. В

Создание пользовательских исключений, три!

Создание пользовательских исключений, три!
Если вы хотите построить «педантично точный» пользовательский класс исключения, то созданный вами тип должен соответствовать лучшим образцам, использующим исключения .NET. В частности, ваше пользовательское исключение должно

Создание пользовательских индексаторов

Создание пользовательских индексаторов
Как программисты, мы прекрасно знаем, что с помощью индексов можно получить доступ к отдельным элементам, содержащимся в стандартном массиве. // Объявление массива целых значений.int[] myInts = {10, 9, 100, 432, 9874};// Использование операции [] для

Создание пользовательских атрибутов

Создание пользовательских атрибутов
Первым шагом процесса построения пользовательского атрибута является создание нового класса, производного от System.Attribute. В продолжение автомобильной темы, используемой в этой книге, мы создадим новую библиотеку классов C# с именем

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

Определение пользовательских событий
Тип CarControl обеспечивает поддержку двух событий, отправляемых содержащей тип форме в зависимости от текущей скорости автомобиля. Первое событие, AboutToBlow, генерируется тогда, когда скорость CarControl приближается к верхнему пределу.

Совет 46. Передавайте алгоритмам объекты функций вместо функций

Совет 46. Передавайте алгоритмам объекты функций вместо функций
Часто говорят, что повышение уровня абстракции языков высокого уровня приводит к снижению эффективности сгенерированного кода. Александр Степанов, изобретатель STL, однажды разработал небольшой комплекс

12.3.5. Адаптеры функций для объектов-функций

12.3.5. Адаптеры функций для объектов-функций
В стандартной библиотеке имеется также ряд адаптеров функций, предназначенных для специализации и расширения как унарных, так и бинарных объектов-функций. Адаптеры – это специальные классы, разбитые на следующие две

19.11.2. Вызов функций из файла функций

19.11.2. Вызов функций из файла функций
Мы уже рассматривали, каким образом функции вызываются из командной строки. Эти типы функций обычно используются утилитами, создающими системные сообщения.А теперь воспользуемся снова описанной выше функцией, но в этом случае

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

    org/BreadcrumbList»>

  • Вы здесь:  
  • Главная
  • Программер
  • VBA
  • Пользовательские функции в VBA для Excel
Категория: VBA
Просмотров: 4580
  • vba

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

Содержание:

  • Определение функции
  • Синтаксис
  • Пример
  • Вызов функции

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

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

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

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

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

Прежде чем использовать функцию, нам нужно определить эту конкретную функцию. Наиболее распространенным способом определения функции в VBA является использование ключевого слова Function , за которым следует уникальное имя функции, и оно может содержать или не содержать список параметров и оператор с ключевым словом End Function , который указывает конец функции. Ниже приведен базовый синтаксис.

Синтаксис

Добавьте кнопку и добавьте следующую функцию.

Function Functionname(parameter-list)
   statement 1
   statement 2
   statement 3
   . ......
   statement n
End Function

Пример

Добавьте следующую функцию, которая возвращает область. Обратите внимание, что значение / значения могут быть возвращены с именем самой функции.

Function find_area(Length As Double, Optional Width As Variant)
   If IsMissing(Width) Then
      find_area = Length * Length
   Else
      find_area = Length * Width
   End If
End Function

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

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

Вывод области, как показано ниже, будет отображаться пользователю.

 С уважением, авторы сайта Компьютерапия

Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

Вызов процедур Sub и Function (VBA)

Редактировать

Твиттер

LinkedIn

Фейсбук

Электронная почта

  • Статья

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

Используйте процедуру Sub для организации других процедур, чтобы их было легче понять и отладить. В следующем примере процедура Sub Main вызывает процедуру Sub MultiBeep , передавая значение 56 в качестве аргумента.

После запуска MultiBeep управление возвращается к Main , а Main вызывает процедуру Sub Message . Сообщение отображает окно сообщения; когда пользователь нажимает OK , управление возвращается к Main , и Main завершается.

 Подосновной()
 Мультибип 56
 Сообщение
Конец сабвуфера
 
Sub MultiBeep (количество звуковых сигналов)
 Для счетчика = 1
 Звуковой сигнал
 Следующий счетчик
Конец сабвуфера
 
Подсообщение ()
 MsgBox "Пора сделать перерыв!"
Конец сабвуфера
 

Примечание

Заинтересованы в разработке решений, расширяющих возможности Office на различных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любые технологии веб-программирования, такие как HTML5, JavaScript, CSS3 и XML.

Вызов процедуры Sub с более чем одним аргументом

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

 Подосновной()
 HouseCalc 99800, 43100
 Позвоните в HouseCalc(380950, 49500)
Конец сабвуфера
 
Sub HouseCalc (цена как одиночная, заработная плата как одиночная)
 Если 2,5 * заработная плата <= 0,8 * цена Тогда
 MsgBox "Вы не можете позволить себе этот дом. "
 Еще
 MsgBox "Этот дом доступен по цене."
 Конец, если
Конец сабвуфера
 

Используйте круглые скобки при вызове функциональных процедур

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

 Answer3 = MsgBox("Довольны ли вы своей зарплатой?", 4, "Вопрос 3")
 

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

 MsgBox «Задача выполнена!», 0, «Поле задач»
 

Если вы включите круглые скобки в предыдущем примере, оператор вызовет синтаксическую ошибку.

Передача именованных аргументов

Оператор в процедуре Sub или Function может передавать значения вызываемым процедурам с использованием именованных аргументов. Вы можете перечислять именованные аргументы в любом порядке. Именованный аргумент состоит из имени аргумента, за которым следуют двоеточие и знак равенства ( := ), а также значение, присвоенное аргументу.

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

 MsgBox Title:="Ящик задач", Подсказка:="Задача выполнена!"
 

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

 answer3 = MsgBox(Title:="Вопрос 3", _
Подсказка:="Довольны ли вы своей зарплатой?", Кнопки:=4)
 

См. также

  • Использование скобок в коде
  • Концептуальные темы Visual Basic

Поддержка и отзывы

Есть вопросы или отзывы об Office VBA или этой документации? См. раздел Поддержка и отзывы Office VBA, чтобы узнать, как вы можете получить поддержку и оставить отзыв.

Вызов функции или подпроцедуры в VBA

При написании кода процедуры VBA выглядит так:

 ПодпримерCallFunction()
    Dim dtToday как дата
    'вызов пользовательской функции завтра'
    dtToday = Завтра
    'вызов встроенного Sub MsgBox - внутри подсказки вызывается встроенная функция FormatDateTime'
    MsgBox Prompt:="Завтра будет " & FormatDateTime(Expression:=dtToday, NamedFormat:=vbGeneralDate), Buttons:=vbOKOnly + vbInformation
Конец сабвуфера

Функция Завтра() как Дата
    Завтра = DateAdd(Интервал:="d", Число:=1, Дата:=Дата)
Завершить функцию 

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

Примечание
Меню справа показывает завершенные вызовы функций с фрагментами (надстройка Code VBA)
  • Вызов подпрограммы
  • Процедура вызова функции:
  • присвоить значение переменной, которая не является объектом
  • Присвоить объектной переменной
  • использовать в выражении «> s
  • Вызов функции с аргументами позиции
  • Вызов функции с использованием явных аргументов
  • Преобразование типов (приведение)
  • Возврат нескольких значений

Не имеет значения, вызываете ли вы встроенную или пользовательскую процедуру.

Вызов абонента

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

  • Обратите внимание пользователя: Звуковой сигнал
  • Запись в таблицу журнала: ErrorHandle Err, Erl(), "Module1.Test"

Первый саб является встроенным, второй будет написанным вами пользовательским сабвуфером.

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

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

 Dim dtToday как дата
dtToday = Дата 

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

 Dim rngActiveCell как диапазон
Установите rngActiveCell = ActiveCell 

Вы также можете вызывать функцию в аргументах функции. В приведенном ниже фрагменте (сделайте первый символ прописным) Len используется внутри IFF , среди прочего.

 Dim str As String: str =IIf(Len(str) > 0, UCase(Left(str, 1)) & Mid(str, 2), "") 

Другое использование функции — это позиция в условном выражении, например:

 Если rngActiveCell не является ничем, то 

Преобразование типов во время присвоения

Одна из особенностей VB, упрощающая его использование, заключается в том, что в нем нет строгих ограничений по типам.
VB автоматически попытается интерпретировать то, что вы назначаете, чтобы продолжить работу.
В приведенном ниже примере, несмотря на то, что типы не совпадают, VB будет интерпретировать: Строка «True» преобразуется в True, целое число 0 преобразуется в False.

 Dim boo Как логическое значение
бу = "Правда"
бу = 0 

Возврат нескольких значений

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

  1. Используйте аргументы для возврата одного или нескольких значений
  2. Создайте пользовательский тип данных и используйте его в качестве возвращаемого типа функций
Используйте аргументы для возврата одного или нескольких значений
 Sub TopLeft (длина X, длина Y)
    Х = 5
    Y = 6
Конец сабвуфера

Sub TopLeftDemo ()
    Dim lngX As Long
    Dim lngY As Long
    Верхний левый lngX, lngY
    Подсказка MsgBox:="X=" & lngX & ";" & "Y=" & lngY, Кнопки:=vbOKOnly + vbInformation
Конец суб 
Создайте пользовательский тип данных и используйте его в качестве возвращаемого типа функций

Примечание: если вы хотите попробовать приведенный ниже код, по крайней мере, определение типа должно быть в стандартном модуле ot a class or form or other module.»> .

 Публичные координаты типа
    Х как долго
    Y как долго
Конечный тип

Функция TopLeft() как координаты
    С верхним левым
        .Х = 5
        .Y = 6
    Конец с
Конечная функция

Sub TopLeftDemo2()
    Dim crds как координаты
    crds = верхний левый
    Подсказка MsgBox:="X=" & crds.X & ";" & "Y=" & crds.Y, Кнопки:=vbOKOnly + vbInformation
Конец суб 
Вызов функции с использованием позиции аргументов

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

 Dim strReplaced As String
strReplaced = Replace(strTableName, "ab", strReplaced) 

Если вы видите такой код или вам нужно его написать, возникает постоянный вопрос, что он на самом деле делает. Хорошо, вы знаете, что это замена.
Но какая строка заменяется где чем? И заменит ли он «aB» на «ac»? Чтобы увидеть, что к чему, вы можете поместить курсор внутри вызова функции и вставить пробел, который открывает всплывающую подсказку, см.