Разное

Вызов vba функции: Вызов процедур Sub и Function (VBA)

Содержание

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

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

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

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

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

Sub Main() MultiBeep 56 Message End Sub Sub MultiBeep(numbeeps) For counter = 1 To numbeeps Beep Next counter End Sub Sub Message() MsgBox "Time to take a break!" End Sub

Примечание

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

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

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

Sub Main() 
 HouseCalc 99800, 43100 
 Call HouseCalc(380950, 49500) 
End Sub 
 
Sub HouseCalc(price As Single, wage As Single) 
 If 2.5 * wage <= 0.8 * price Then 
 MsgBox "You cannot afford this house." 
 Else 
 MsgBox "This house is affordable." 
 End If 
End Sub

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

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

Answer3 = MsgBox("Are you happy with your salary?", 4, "Question 3") 

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

MsgBox "Task Completed!", 0, "Task Box" 

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

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

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

:=), а затем следует присвоенное аргументу значение.

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

MsgBox Title:="Task Box", Prompt:="Task Completed!" 

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

answer3 = MsgBox(Title:="Question 3", _ 
Prompt:="Are you happy with your salary?", Buttons:=4) 

См. также

  • Использование круглых скобок в коде
  • Темы по основам Visual Basic

Поддержка и обратная связь

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

Использование функций листов Excel в Visual Basic

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

В операторах Visual Basic можно использовать большинство функций листов Microsoft Excel. Список функций листов, которые можно использовать, см. в статье Список функций листов, доступных для Visual Basic.

Примечание

Некоторые функции листов не используются в Visual Basic. Например, не требуется функция Concatenate, так как в Visual Basic можно использовать оператор & для объединения нескольких текстовых значений.

Вызов функции листа из Visual Basic

В Visual Basic функции листов Excel доступны через объект WorksheetFunction.

В следующей процедуре Sub используется функция листа

Min для определения наименьшего значения в диапазоне ячеек. Сначала переменная myRange объявляется как объект Range, а затем ей присваивается диапазон A1:C10 на листе Sheet1. Другой переменной, answer, назначается результат применения функции Min к myRange. В конце значение answer отображается в окне сообщения.

Sub UseFunction() 
 Dim myRange As Range 
 Set myRange = Worksheets("Sheet1").Range("A1:C10") 
 answer = Application.WorksheetFunction.Min(myRange) 
 MsgBox answer 
End Sub

Если вы используете функцию листа, для которой требуется ссылка на диапазон в качестве аргумента, необходимо указать объект Range. Например, можно использовать функцию листа Match (ПОИСКПОЗ) для поиска диапазона ячеек. В ячейке листа потребовалось бы ввести формулу, например =ПОИСКПОЗ (9;A1:A10;0). Однако в процедуре Visual Basic необходимо указать объект

Range, чтобы получить такой же результат.

Sub FindFirst() 
 myVar = Application.WorksheetFunction _ 
 .Match(9, Worksheets(1).Range("A1:A10"), 0) 
 MsgBox myVar 
End Sub

Примечание

Функции Visual Basic не используют квалификатор WorksheetFunction. Функция может иметь такое же имя, что и функция Microsoft Excel, но работать по-другому. Например, Application. WorksheetFunction.Log и Log возвращают разные значения.

Вставка функции листа в ячейку

Чтобы вставить функцию листа в ячейку, укажите функцию в качестве значения свойства Formula соответствующего объекта Range. В следующем примере функция листа RAND (создающая случайное число), назначается свойству Formula диапазона A1:B3 на листе Sheet1 в активной книге.

Sub InsertFormula() 
 Worksheets("Sheet1").Range("A1:B3").Formula = "=RAND()" 
End Sub

Пример

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

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")

См. также

  • Функции Excel (по категориям)

Поддержка и обратная связь

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

VBA Excel. Вызов процедуры Sub из другой подпрограммы VBA

Вызов процедур Sub (подпрограмм) из кода других процедур, расположенных в одном или разных модулях, в одной или разных книгах Excel (проектах VBA), с аргументами или без. Примеры.

1. Вызов процедур Sub в пределах одной книги

1.1. Синтаксис вызова подпрограмм в пределах одной книги

1.2. Вызов подпрограмм без аргументов в пределах одного модуля

1.3. Вызов подпрограмм с аргументами в пределах одного модуля

1.4. Вызов подпрограмм из разных модулей одной книги

1.4.1. Вызываемая подпрограмма расположена в Стандартном модуле

1.4.2. Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы

2. Вызов процедур Sub из модулей разных книг

2.1. Синтаксис метода Application. Run

2.2. Полный адрес вызываемой процедуры

2.3. Пример вызова подпрограмм из другой книги

3. Заключение

Вызов процедур Sub в пределах одной книги

Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.

Синтаксис вызова подпрограмм в пределах одной книги

[ Call ] ИмяПроцедуры [ (Аргументы) ]

  • Call — необязательное ключевое слово;
  • ИмяПроцедуры — обязательный компонент, имя вызываемой подпрограммы;
  • Аргументы — необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.

Вызов подпрограмм без аргументов в пределах одного модуля

Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:

1

2

3

4

5

6

7

8

9

10

11

12

Private Sub test1()

  Call test2

  test3

End Sub

 

Private Sub test2()

  MsgBox «Процедура test2 (Private) вызвана с ключевым словом Call!»

End Sub

 

Public Sub test3()

  MsgBox «Процедура test3 (Public) вызвана без ключевого слова Call!»

End Sub

Вы можете скопировать приведенный код в свой модуль и посмотреть, запустив процедуру test1, как она последовательно запускает процедуры test2 и test3.

Вызов подпрограмм с аргументами в пределах одного модуля

При вызове процедур Sub с аргументами и ключевым словом Call, аргументы заключаются в скобки, без ключевого слова Call — аргументы не заключаются в скобки:

1

2

3

4

5

6

7

8

9

10

11

12

Private Sub test4()

  Call test5(15, 25)

  test6 256, 312, 4. 52

End Sub

 

Sub test5(a As Single, b As Single)

  MsgBox a + b

End Sub

 

Sub test6(c As Single, d As Single, e As Single)

  MsgBox c + d + e

End Sub

Вы можете разместить этот код в своем модуле и протестировать его.

Вызов подпрограмм из разных модулей одной книги

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

Вызываемая подпрограмма расположена в Стандартном модуле

1

2

3

4

5

6

7

‘Процедура Sub с уникальным именем —

‘возможны два варианта:

УникальноеИмяПроцедуры

ИмяМодуля.УникальноеИмяПроцедуры

‘Процедура Sub с неуникальным именем —

‘возможен только один вариант:

ИмяМодуля. НеуникальноеИмяПроцедуры

  • ИмяМодуля — уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.

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

Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы

1

2

3

4

5

6

7

‘В модуле книги:

ЭтаКнига.ИмяПроцедуры

‘В модуле листа:

ИмяЛиста.ИмяПроцедуры

Worksheets(«Имя ярлычка листа»).ИмяПроцедуры

‘В модуле формы:

ИмяФормы.ИмяПроцедуры

  • ЭтаКнига — так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
  • ИмяЛиста — уникальное имя листа, которое в проводнике проекта VBA указано без скобок (по умолчанию: Лист1, Лист2, Лист3 и т.д.).
  • Имя ярлычка листа — дублирующее имя листа, которое в проводнике проекта VBA указано в скобках.
  • ИмяФормы — уникальное имя пользовательской формы, отображаемое в проводнике проекта VBA.

Вызов процедур Sub из модулей разных книг

Если вызываемая подпрограмма расположена в другой книге, она должна быть объявлена как Public, а книга открыта. Запустить такую процедуру Sub можно с помощью метода Application.Run (протестировано в Excel 2016).

Синтаксис метода Application.Run

Application.Run «ИмяКниги!ИмяМодуля.ИмяПроцедуры», Арг1, Арг2, …, Арг30

  1. ИмяКниги!ИмяМодуля.ИмяПроцедуры — обязательный компонент, полный адрес подпрограммы, заключен в двойные кавычки.
    • ИмяКниги — имя рабочей книги Excel с расширением, в которой находится вызываемая подпрограмма, если имя содержит пробелы, оно заключается в одинарные кавычки — апострофы (‘Имя Книги’).
    • ИмяМодуля — имя модуля для стандартного модуля (для уникальных имен вызываемых подпрограмм может не указываться), имя листа для модуля листа, словосочетание «ЭтаКнига» (без кавычек) для модуля книги.
    • ИмяПроцедуры — имя вызываемой процедуры Sub.
  2. Арг1, Арг2, …, Арг30 — необязательные компоненты, аргументы вызываемой подпрограммы, максимальное количество которых ограничено 30 элементами.

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

Полный адрес вызываемой процедуры

Может показаться сложным составить полный адрес вызываемой подпрограммы, но на самом деле все очень просто — Excel уже сделал это за нас.

1. Откройте окно со списком макросов.

Список макросов во всех открытых книгах

2. Найдите в списке вызываемую подпрограмму и кликните по ней. Ее полный адрес отобразится в поле «Имя макроса».

3. Скопируйте полное имя вызываемой процедуры Sub и вставьте ее в метод Application.Run, заключив в двойные кавычки.

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

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

Пример вызова подпрограмм из другой книги

Допустим, у нас есть рабочая книга Excel под именем «Книга1.xlsm» (или «Книга1.xls» в ранних версиях программы). В ней находятся вызываемые из другой книги процедуры Sub, перечисленные ниже.

В стандартном модуле «Module1»:

Sub Vyzov1()

  MsgBox «Запущена процедура в стандартном модуле!»

End Sub

В модуле листа «Лист1»:

Sub Vyzov2()

  MsgBox «Запущена процедура в модуле листа!»

End Sub

В модуле книги «ЭтаКнига»:

Sub Vyzov3(a As Variant, b As Variant)

  MsgBox «Запущена процедура в модуле книги!» _

  & vbNewLine & «Сумма равна: » & a + b

End Sub

Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:

1

2

3

4

5

6

Sub ProverkaVyzova()

  Application. Run «Книга1.xlsm!Vyzov1»

  Application.Run «Книга1.xlsm!Module1.Vyzov1»

  Application.Run «Книга1.xlsm!Лист1.Vyzov2»

  Application.Run «Книга1.xlsm!ЭтаКнига.Vyzov3», 555, 445

End Sub

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

И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):

Application.Run «‘Новая Книга 1.xlsm’!Процедура1»

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

Заключение

В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.

Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» — «References…». В открывшемся окне «References — VBAProject» все открытые книги будут отображены одним словом — «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse…», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

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

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

Твиттер LinkedIn Фейсбук Эл. адрес

  • Статья
  • 2 минуты на чтение

Чтобы вызвать процедуру Sub из другой процедуры, введите имя процедуры и включите значения для всех необходимых аргументов. 9Оператор 0019 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»? Чтобы увидеть, что к чему, вы можете поместить курсор внутри вызова функции и вставить пробел, который открывает всплывающую подсказку, см. ниже. Однако более определенным способом является использование явных аргументов.

Вызов функции с использованием явных аргументов

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

Пример вызова функции с явными аргументами:

 strReplaced = Заменить(Выражение:="AaBb", Найти:="ab", Заменить:="ac", Начало:=1, Счетчик:=-1, Сравнить:=vbBinaryCompare) 

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

Функция VBA — вызов, возвращаемое значение и параметры

В этой статье

  • Создание функции без аргументов
  • Вызов функции из подпроцедуры
  • Создание функций
    • Один аргумент
    • Несколько аргументов
    • Необязательные аргументы
    • вам создавать и использовать функции с параметрами и без параметров в VBA

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

      Создание функции без аргументов

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

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

       Функция GetValue() как целое число
         ПолучитьЗначение = 50
      End Function 

      Если бы вы запускали функцию, она всегда возвращала бы значение 50.

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

       Функция GetRange() как диапазон
        Установить GetRange = Диапазон ("A1: G4")
      Завершить функцию 

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

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

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

      Всегда будет возвращаться значение 50.

      Вы также можете вызвать функцию GetRange из подпроцедуры.

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

      Создание функций

      Один аргумент

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

       Функция ConvertKilosToPounds (dblKilo as Double) as Double
         ConvertKiloToPounds = дблкило*2,2
      Завершить функцию 

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

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

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

      Множественные аргументы

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

       Функция CalculateDayDiff(Date1 as Date, Date2 as Date) as Double
         ВычислитьDayDiff = Date2-Date1
      End Function 

      Затем мы можем вызвать функцию для вычисления количества дней между двумя датами.

      Необязательные аргументы

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

       Функция CalculateDayDiff(Date1 as Date, опционально Date2 as Date) as Double
      'проверить вторую дату и, если ее нет, сделать Date2 равной сегодняшней дате.
         Если Дата2=0, то Дата2 = Дата
      'рассчитать разницу
         ВычислитьDayDiff = Date2-Date1
      End Function 

      Кодирование VBA стало проще

      Прекратите искать код VBA в Интернете. Узнайте больше об AutoMacro — конструкторе кода VBA, который позволяет новичкам создавать процедуры с нуля с минимальными знаниями в области программирования и множеством функций, позволяющих сэкономить время для всех пользователей!

      Узнать больше!!

      Значение аргумента по умолчанию

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

       Функция CalculateDayDiff(Date1 as Date, необязательная Date2 as Date="02/06/2020") as Double
      'рассчитать разницу
         ВычислитьDayDiff = Date2-Date1
      Конечная функция 

      ByVal и ByRef

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

      ByVal означает, что вы передаете в функцию копию переменной, тогда как ByRef означает, что вы ссылаетесь на исходное значение переменной. Когда вы передаете копию переменной ( ByVal ), исходное значение переменной НЕ изменяется на , но когда вы ссылаетесь на переменную, функция изменяет исходное значение переменной.

       Функция GetValue(ByRef intA As Integer) Как Integer
         интервал = интервал * 4
         ПолучитьЗначение = intA
      End Function 

      В приведенной выше функции ByRef можно было бы опустить, и функция работала бы так же.

       Функция GetValue(intA как целое число) как целое число
         интервал = интервал * 4
         ПолучитьЗначение = intA
      End Function 

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

       Подтестовые значения()
         Dim intVal как целое число
      'заполнить переменную значением 10
         Интервал = 10
      'запустить функцию GetValue и показать значение в непосредственном окне
         Debug. Print GetValue (intVal)
      'показать значение переменной intVal в непосредственном окне
         Debug.Print intVal
      Конец суб 

      Обратите внимание, что окна отладки оба раза показывают значение 40. Когда вы передаете в функцию переменную IntVal, в функцию передается значение 10, которое умножается на 4. Использование ключевого слова ByRef (или полное его отсутствие) ИСПРАВЛЯЕТ значение переменной IntVal. Это проявляется, когда вы сначала показываете результат функции в непосредственном окне (40), а затем значение переменной IntVal в окне отладки (тоже 40).

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

       Функция GetValue(ByVal intA As Integer) Как Integer
      интервал = интервал * 4
      ПолучитьЗначение = intA
      End Function 

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

      Exit Function

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

       Функция FindNumber(strSearch As String) Как целое число
         Dim i как целое число
      'перебрать каждую букву в строке
         Для i = 1 To Len(strSearch)
         'если буква числовая, вернуть значение функции
            Если IsNumeric(Mid(strSearch, i, 1)) Тогда
               FindNumber= Mid(strSearch, i, 1)
         'затем выйдите из функции
               Выход из функции
            Конец, если
         Следующий
         НайтиЧисло= 0
      End Function 

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

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

       Sub CheckForNumber()
         Dim NumIs как целое число
      'передать текстовую строку в функцию поиска числа
         NumIs = FindNumber("Верхний этаж, 8 Оук Лейн, Техас")
      'показать результат в ближайшем окне
         Debug. Print NumIs
      End Sub 

      Программирование VBA | Генератор кода работает на вас!

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

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

      Нажмите на fx , чтобы открыть диалоговое окно «Вставить функцию».

      Выберите Определяется пользователем из списка категорий

      Выберите нужную функцию из доступных Пользовательские функции (UDF).

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

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

Добавить комментарий

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