Вложенные процедуры (Visual Basic)
Процедура Sub — это ряд операторов Visual Basic, заключенных в операторы Sub и End Sub . Процедура Sub выполняет задачу, а затем возвращает управление вызывающему коду, но не возвращает значение вызывающему коду.
При каждом вызове процедуры выполняются ее инструкции, начиная с первого исполняемого оператора после Sub оператора и заканчивая первым End Sub встречным оператором , Exit Sub или Return .
Процедуру Sub можно определить в модулях, классах и структурах. По умолчанию он имеет значение Public , то есть его можно вызывать из любого места в приложении с доступом к модулю, классу или структуре, в которой они определены. Термин метод описывает процедуру Sub или Function , доступ к которому осуществляется извне своего модуля, класса или структуры. Дополнительные сведения см. в разделе Procedures in Visual Basic (Процедуры в Visual Basic).
Процедура Sub может принимать аргументы, такие как константы, переменные или выражения, которые передаются ей вызывающим кодом.
Синтаксис объявления
Синтаксис объявления Sub процедуры выглядит следующим образом:
[modifiers] Sub SubName[(parameterList)] ' Statements of the Sub procedure. End Sub
Может modifiers указать уровень доступа и сведения о перегрузке, переопределении, совместном использовании и теневом режиме. Дополнительные сведения см. в разделе Sub Statement.
Объявление параметра
Каждый параметр процедуры объявляется аналогично объявлению переменной, указывая имя параметра и тип данных. Можно также указать механизм передачи и указать, является ли параметр необязательным или массивом параметров.
Синтаксис каждого параметра в списке параметров выглядит следующим образом:
[Optional] [ByVal | ByRef] [ParamArray] parameterName As DataType
Если параметр является необязательным, необходимо также указать значение по умолчанию в его объявлении. Синтаксис для указания значения по умолчанию выглядит следующим образом:
Optional [ByVal | ByRef] parameterName As DataType = defaultValue
Параметры в качестве локальных переменных
Когда элемент управления передается процедуре, каждый параметр обрабатывается как локальная переменная. Это означает, что его время существования совпадает с временем существования процедуры, а его область является всей процедурой.
Синтаксис вызова
Процедура вызывается явным Sub образом с помощью изолированной вызывающей инструкции. Вы не можете вызвать его, используя его имя в выражении. Необходимо указать значения для всех аргументов, которые не являются необязательными, а также заключить список аргументов в круглые скобки. Если аргументы не указаны, при необходимости можно опустить круглые скобки. Использование Call ключевое слово является необязательным, но не рекомендуется.
Синтаксис вызова Sub процедуры выглядит следующим образом:
[Call] SubName[(argumentlist)]
Метод можно вызвать Sub извне класса, который его определяет. Сначала необходимо использовать New ключевое слово для создания экземпляра класса или вызвать метод, возвращающий экземпляр класса . Дополнительные сведения см. в разделе Новый оператор. Затем можно использовать следующий синтаксис для вызова Sub метода в объекте экземпляра :
object.MethodName[(argumentList)]
Иллюстрация объявления и вызова
Sub Следующая процедура сообщает оператору компьютера, какую задачу будет выполнять приложение, а также отображает метку времени. Вместо того, чтобы дублировать этот код в начале каждой задачи, приложение просто вызывает tellOperator из различных расположений. Каждый вызов передает строку в аргументе task , которая идентифицирует запускаемую задачу.
Sub tellOperator(ByVal task As String) Dim stamp As Date stamp = TimeOfDay() MsgBox("Starting " & task & " at " & CStr(stamp)) End Sub
В следующем примере показан типичный вызов метода tellOperator .
tellOperator("file update")
См. также раздел
- Процедуры
- Процедуры функций
- Процедуры свойств
- Процедуры операторов
- Параметры и аргументы процедуры
- Оператор Sub
- Практическое руководство. Вызов процедуры, которая не возвращает значение
- Практическое руководство. Вызов обработчика событий в Visual Basic
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Оператор Sub (Visual Basic)
Объявляет имя, параметры и код, определяющие процедуру Sub .
Синтаксис
[ ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ] Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ] [ statements ] [ Exit Sub ] [ statements ] End Sub
Компоненты
- attributelist Необязательный элемент. См. раздел Список атрибутов.
- Partial Необязательный элемент. Указывает определение разделяемого метода. См. раздел Разделяемые методы.
- accessmodifier Необязательный элемент. Может применяться один из перечисленных ниже типов.
- Public
- Защищены
- Друг
- Частная
- Protected Friend
- Частная защищенная
- Перегрузки
- Переопределения
- Overridable
- NotOverridable
- MustOverride
- MustOverride Overrides
- NotOverridable Overrides
Часть Описание interface Обязательный. Имя интерфейса, реализуемого классом или структурой этой процедуры. definedname Обязательный. Имя, под которым процедура определена в interface . Часть Описание eventvariable Обязательный. Переменная объекта, объявленная с типом данных класса или структуры, которая вызывает событие. event Обязательный. Имя события, обрабатываемого этой процедурой. Комментарии
Весь исполняемый код должен находиться внутри процедуры. Используйте процедуру Sub , если не хотите возвращать значение в вызывающий код. Используйте процедуру Function , если требуется вернуть значение.
Определение вложенной процедуры
Процедуру Sub можно определить только на уровне модуля. Таким образом, контекст объявления для вложенной процедуры должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Sub по умолчанию используется общий доступ. Уровни доступа можно настроить с помощью модификаторов доступа.
Если процедура использует Implements ключевое слово, содержащий класс или структуру должен иметь оператор, который сразу же следует за его Class оператором Implements или Structure . Инструкция Implements должна включать каждый интерфейс, указанный в implementslist . Однако имя, по которому интерфейс определяет Sub (в definedname ), не обязательно совпадает с именем этой процедуры (в name ).
Возврат из вложенной процедуры
Sub Когда процедура возвращается в вызывающий код, выполнение продолжается с оператором после оператора, который ее вызвал.
В следующем примере показан возврат из Sub процедуры.
Sub mySub(ByVal q As String) Return End SubОператоры Exit Sub и Return вызывают немедленный Sub выход из процедуры. Любое количество операторов Exit Sub и Return может отображаться в любом месте процедуры, и вы можете смешивать Exit Sub операторы и Return .
Вызов вложенной процедуры
Вы вызываете процедуру Sub , используя имя процедуры в операторе , а затем после этого имени и список аргументов в скобках. Круглые скобки можно опустить, только если аргументы не указаны. Однако код будет более удобочитаемым, если всегда включать круглые скобки.
Процедура Sub и Function процедура могут иметь параметры и выполнять ряд инструкций. Однако Function процедура возвращает значение, а Sub процедура — нет. Поэтому нельзя использовать процедуру Sub в выражении.
Вы можете использовать Call ключевое слово при вызове Sub процедуры, но это ключевое слово не рекомендуется для большинства применений. Дополнительные сведения см. в разделе Оператор вызова.
Visual Basic иногда переупорядочивает арифметические выражения для повышения внутренней эффективности. По этой причине, если список аргументов содержит выражения, вызывающие другие процедуры, не следует предполагать, что эти выражения будут вызываться в определенном порядке.
Асинхронные вложенные процедуры
С помощью асинхронной функции можно вызывать асинхронные функции, не используя явные обратные вызовы или вручную разделяя код между несколькими функциями или лямбда-выражениями.
Если вы помечаете процедуру модификатором Async , можно использовать оператор Await в процедуре. Когда элемент управления достигает Await выражения в процедуре Async , элемент управления возвращается вызывающей объекту, а ход выполнения процедуры приостанавливается до завершения ожидаемой задачи. После завершения задачи выполнение может возобновиться в процедуре.
Процедура Async возвращается вызывающей объекту при обнаружении первого объекта, который еще не завершен, или при достижении конца Async процедуры в зависимости от того, что произойдет первым.
Вы также можете пометить оператор function модификатором Async . Функция Async может иметь тип возвращаемого Task значения или Task. В следующем примере в этом разделе показана Async функция с типом возвращаемого значения Task .
Async Sub процедуры в основном используются для обработчиков событий, где значение не может быть возвращено. Не Async Sub удается ожидать процедуру, а вызывающий Async Sub объект процедуры не может перехватывать исключения, создаваемые процедурой Sub .
Процедура Async не может объявлять параметры ByRef .
Пример 1
В следующем примере оператор используется Sub для определения имени, параметров и кода, образующих тело Sub процедуры.
Sub ComputeArea(ByVal length As Double, ByVal width As Double) ' Declare local variable. Dim area As Double If length = 0 Or width = 0 Then ' If either argument = 0 then exit Sub immediately. Exit Sub End If ' Calculate area of rectangle. area = length * width ' Print area to Immediate window. Debug.WriteLine(area) End SubПример 2
Процедура startButton_Click является примером Async Sub процедуры. Так как DoSomethingAsync является функцией Async , необходимо ожидать задачу для вызова DoSomethingAsync , как показано в следующем операторе: Await DoSomethingAsync() . Процедура startButton_Click Sub должна быть определена с помощью модификатора Async , так как она имеет Await выражение .
' Imports System.Diagnostics ' Imports System.Threading.Tasks ' This Click event is marked with the Async modifier. Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click Await DoSomethingAsync() End Sub Private Async Function DoSomethingAsync() As Task Dim delayTask As Task(Of Integer) = DelayAsync() Dim result As Integer = Await delayTask ' The previous two statements may be combined into ' the following statement. ' Dim result As Integer = Await DelayAsync() Debug.WriteLine("Result: " & result) End Function Private Async Function DelayAsync() As Task(Of Integer) Await Task.Delay(100) Return 5 End Function ' Output: ' Result: 5См. также раздел
- Оператор Implements
- Оператор Function
- Список параметров
- Оператор Dim
- Оператор Call
- Из
- Массивы параметров
- Практическое руководство. Использование универсального класса
- Рекомендации по устранению неполадок
- Разделяемые методы
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Написание процедуры Sub
Процедура Sub — это ряд операторов Visual Basic, заключенных в операторах Sub и End Sub , которые выполняют действия, но не возвращают значение. Процедура Sub может принимать аргументы, такие как константы, переменные или выражения, которые передаются вызывающей процедурой. Если у процедуры Sub нет аргументов, оператор Sub должен включать пустой набор скобок.
Следующая процедура Sub содержит комментарии, объясняющие каждую строку.
' Declares a procedure named GetInfo ' This Sub procedure takes no arguments Sub GetInfo() ' Declares a string variable named answer Dim answer As String ' Assigns the return value of the InputBox function to answer answer = InputBox(Prompt:="What is your name?") ' Conditional If. Then. Else statement If answer = Empty Then ' Calls the MsgBox function MsgBox Prompt:="You did not enter a name." Else ' MsgBox function concatenated with the variable answer MsgBox Prompt:="Your name is " & answer ' Ends the If. Then. Else statement End If ' Ends the Sub procedure End SubСм. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Private sub vba что это
Активация окна. Вызывается в момент активации книги. Этот момент наступает в тот момент, когда из другой активной книги вы переходите к той, в которой обрабатывается событие. Например, при переключении книги в меню «Окно».
Private Sub Workbook_Activate() End Sub
Закрытие окна. Вызывается перед закрытием книги:
Private Sub Workbook_BeforeClose(Cancel As Boolean) End Sub
Деактивация книги. Вызывается в момент перехода к другой книге:
Private Sub Workbook_Deactivate() End Sub
Активация листа. Вызывается в момент смены листа:
Private Sub Workbook_SheetActivate(ByVal Sh As Object) End Sub
Деактивация листа. Вызывается в момент смены листа для того листа, с которого уходят:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) End Sub
Смена ячейки. Вызывается в момент смены диапазона или при редактировании ячейки:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) End Sub
Пересчет данных. Вызываться при пересчете данных, обычно пересчет связан с редактирование данных, поэтому ранее вызывается SheetChange практически всегда за исключением ручного пересчета.
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) End Sub
Переход к ячейке. Вызывается при переходе от одной ячейки к другой:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range) End Sub
Разрешение на печать. Вызывается при выборе меню «Печать»:
Private Sub Workbook_BeforePrint(Cancel As Boolean) End Sub
Разрешение на сохранение. Вызываеться перед сохранением документа:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) End Sub
Создание нового листа. Вызывается в момент создания нового листа. Обычно ведет за собой целую цепочку событий — Workbook_NewSheet, Workbook_SheetDeactivate, Workbook_SheetActivate:
Private Sub Workbook_NewSheet(ByVal Sh As Object) End Sub
Изменение размера листа. Вызывается в момент изменения размера листа:
Private Sub Workbook_WindowResize(ByVal Wn As Excel.Window) End Sub
Активизация окна. Вызывается в момент активизации окна книги, например, при переключении на книгу:
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window) End Sub
Щелчок правой кнопкой. Вызывается по нажатию правой кнопки мыши:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean) End Sub
Выводы. Часть событий связана в цепочки. То есть, например, событие Activate для одного объекта это событие Deactivate для другого объекта. Это работает для Окон, Книг и Листов. Часть событий вызывают за собой следующие события, например, ввод данных приведет к пересчету листа. Или вставка нового листа к событиям активизации. Знание событий может помочь в решении нетривиальных вопросов. Вот так можно запретить печать книги.
Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True End Sub