Что значит private sub в visual basic

VBA-Урок 9. Процедуры и функции

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

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

Запуск процедуры с середины другой процедуры

Чтобы выполнить процедуру с середины другой процедуры, просто введите ее название.

Здесь есть очень простой пример:

Аргументы

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

К процедуре "warning" был добавлен аргумент, в данном случае это переменная "var_text" с типом "String" (строка):

Эта процедура требует аргумент, поэтому мы должны поставить значение после "warning", чтобы выполнить ее:

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

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

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

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

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

Аргументы должны быть введены в правильном порядке.

Чтобы протестировать, присутствует ли опциональный аргумент в процедуре, мы используем функцию IsMissing . Эта функция совместима только с некоторыми типами функций (типа Variant) и это является решающим, так как тип необязательно аргументов не был указан в объявлении (необъявленный тип = Variant).

Здесь есть пример, который использует два фрагмента кода, которые рассматривались выше:

См. рисунок ниже (пример 1):

ByRef — ByVal

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

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

Второй метод заключается в использовании ByVal .

В отличие от ByRef , который передает ссылки (ярлык), ByVal передает значение, которое означает, что значение передано как аргумент не было изменено.

Ниже вы можете увидеть как предыдущий код и ByVal работают:

Что вам нужно запомнить: используйте ByVal когда переменная не должна быть изменена .

Функции

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

Вот простой пример:

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

Например, чтобы получить квадрат значения, которое введенное в ячейку A1:

Объясните в чем разница

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

[Private | Public] [Static] Sub имя [(списокАргументов)]
[инструкции]
[Exit Sub]
[инструкции]
End Sub

Синтаксис инструкции Sub содержит следующие элементы:

ЭлементОписание

Public — Необязательный. Указывает, что процедура Sub доступна для всех других процедур во всех модулях. При использовании в личном модуле (модуле, который содержит инструкцию Option Private) такая процедура является недоступной вне проекта.

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

Static — Необязательный. Указывает, что локальные переменные процедуры Sub сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Sub, даже если они используются в процедуре.

имя — Обязательный. Имя процедуры Sub, удовлетворяющее стандартным правилам именования переменных.

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

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

Аргумент списокАргументов имеет следующий синтаксис и элементы:

[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )] [As тип] [= поУмолчанию]

ЭлементОписание

Optional — Необязательный. Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Все аргументы, описанные как Optional, должны иметь тип Variant. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray.

ByVal — Необязательный. Указывает, что этот аргумент передается по значению.

ByRef — Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.

ParamArray — Необязательный. Используется только в качестве последнего элемента в списке списокАргументов для указания, что конечным аргументом является описанный как Optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional.

имяПеременной — Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.

тип — Необязательный. Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип.

поУмолчанию — Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

Дополнительные сведения

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

Внимание! Допускаются рекурсивные процедуры Sub; т.е. они могут вызывать сами себя для выполнения определенных задач. Однако рекурсия может приводить к переполнению стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Sub

Все выполняемые команды должны содержаться в процедурах. Не допускается определение процедуры Sub внутри другой процедуры Sub, Function или Property.

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

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

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

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

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

Примечание. Для входа или выхода из процедуры Sub нельзя использовать инструкции GoSub, GoTo или Return.

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

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

Синтаксис

Компоненты

Необязательный элемент. См. список атрибутов.

Необязательный элемент. Указывает определение разделяемого метода. См. раздел разделяемые методы.

Необязательный элемент. Может применяться один из перечисленных ниже типов.

Необязательный элемент. Может применяться один из перечисленных ниже типов.

Необязательный элемент. См. раздел Shared.

Необязательный элемент. См. раздел Shadows.

Необязательный элемент. См. статью Async.

Обязательный элемент. Имя процедуры. См. раздел Declared Element Names. Чтобы создать процедуру конструктора для класса, задайте в качестве имени Sub процедуры New ключевое слово. Дополнительные сведения см. в разделе время существования объекта: как создаются и уничтожаются объекты.

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

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

Необязательный элемент. Указывает, что эта процедура реализует одну или несколько Sub процедур, каждая из которых определена в интерфейсе, реализованном классом или структурой этой процедуры. См. инструкцию Implements.

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

Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.

Необязательный элемент. Указывает, что эта процедура может управлять одним или несколькими конкретными событиями. См. раздел Handles.

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

Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.

Необязательный элемент. Блок инструкций для выполнения в рамках этой процедуры.

Завершает определение этой процедуры.

Комментарии

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

Определение подпроцедуры

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

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

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

Возврат из подпроцедуры

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

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

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

Вызов процедуры подпрограммы

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

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

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

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

Процедуры Async

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

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

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

Можно также пометить оператор Function с помощью Async модификатора. Async Функция может иметь тип возвращаемого значения Task<TResult> или Task . В примере далее в этом разделе показана Async функция, имеющая тип возвращаемого значения Task<TResult> .

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

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

Пример 1

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

Пример 2

В следующем примере DelayAsync — это, Async Function имеющий тип возвращаемого значения Task<TResult> . DelayAsync имеет инструкцию Return , которая возвращает целое число. Поэтому объявление функции DelayAsync должно иметь тип возвращаемого значения Task(Of Integer) . Так как тип возвращаемого значения — Task(Of Integer) , вычисление Await выражения в DoSomethingAsync создает целое число, как показано в следующей инструкции: Dim result As Integer = Await delayTask .

startButton_Click Процедура является примером Async Sub процедуры. Поскольку DoSomethingAsync является Async функцией, задача для вызова DoSomethingAsync должна быть ожидаемой, как показано в следующей инструкции: Await DoSomethingAsync() . startButton_Click Sub Процедура должна быть определена с Async модификатором, так как содержит Await выражение.

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

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