private sub vba что это

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

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

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

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

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

Аргументы

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

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

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

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

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

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

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

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

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

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

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

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

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

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

Функции

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

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

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

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

Источник

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

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

1 ответ

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

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

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

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

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

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

Процедуры 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.

Источник

Оператор Private

Используется на уровне модуля для объявления частных переменных и выделения пространства для хранения.

Синтаксис

Синтаксис оператора Private состоит из следующих элементов.

PartОписание
WithEventsНеобязательное. Ключевое слово, указывающее, что varname — это объектная переменная, которая используется для ответа на события, запускаемые объектом ActiveX. Ключевое слово WithEvents можно использовать только в модулях классов. Вы можете объявить как можно больше отдельных переменных, как вам нравится с помощью WithEvents, но вы не можете создавать массивы с WithEvents, и вы не можете использовать New с WithEvents.
varnameОбязательный. Имя переменной; соответствует стандартным соглашениям об именовании переменных.
подскрипникиНеобязательное. Измерения переменной массива (поддерживается объявление до 60 измерений). В аргументе subscripts используется следующий синтаксис:

Примечания

Частные переменные доступны только в том модуле, где они объявлены.

Используйте оператор Private для объявления типа данных переменной. Например, следующий оператор объявляет переменную типа Integer.

Оператор Private можно использовать для объявления типа объекта переменной. Следующий оператор объявляет переменную для нового экземпляра листа.

Если ключевое слово New не используется при объявлении переменной объекта, переменная, которая относится к объекту, должна быть назначена существующему объекту с помощью утверждения Set, прежде чем он может быть использован. Пока объект не назначен, объявленная переменная объекта имеет специальное значение Nothing, которое указывает на то, что он не относится ни к одному конкретному экземпляру объекта.

Если вы не указываете тип данных или тип объекта, а в модуле нет заявления Deftype, переменная по умолчанию является Variant.

Оператор Private можно использовать с пустыми скобками, чтобы объявить динамический массив. Объявив динамический массив, используйте заявление ReDim в процедуре, чтобы определить количество измерений и элементов в массиве. Если вы пытаетесь перенастроить измерение для переменной массива, размер которой был явно указан в частном, публичном или дим-заявлении, возникает ошибка.

При инициализации переменных числовой переменной присваивается значение 0, строке переменной длины — строка нулевой длины («»), а строка фиксированной длины заполняется нулями. Переменные типа Variant при инициализации получают значение Empty. Каждый элемент переменной определяемого пользователем типа инициализируется как отдельная переменная.

Частное заявление нельзя использовать внутри процедуры; используйте заявление Dim для объявления локальных переменных.

Пример

В этом примере показано использование оператора Private на уровне модуля для объявления переменных частными, то есть доступными только в модуле, в котором они объявлены.

См. также

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

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

Источник

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

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

Синтаксис

Компоненты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ЧастьОписание
eventvariableОбязательный элемент. Объектная переменная, объявленная с типом данных класса или структуры, которая вызывает событие.
eventОбязательный элемент. Имя события, обрабатываемого этой процедурой.

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

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

Комментарии

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

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

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

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

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

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

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

Пример 1

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

Пример 2

Источник

В отличии от языка VBScript, VBA процедуры классифицируются не на два типа (процедура-функция и процедура-подпрограмма), а четырех типов: процедура-функция, процедура-подпрограмма, процедура свойств и обработка событий. Также существуют некоторые дополнения в плане передачи параметров (по значению или по ссылке). Третьим моментом является область видимости – в VBA вызов процедуры может осуществляться как в пределах текущего модуля (макроса), так и за его пределами – во всех проектах. Все это обусловлено тем, что VBA – это не столько язык программирования, сколько программный пакет, с возможностью создания форм и проектов.

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

Давайте сначала кратко рассмотрим типы VBA процедур:

Подпрограммы – блоки кода заключенные в конструкцию Sub …. End Sub. Сама по себе подпрограмма не возвращает никакого значения, а просто выполняет прописанные в ней команды.

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

Помимо этого, стоит упомянуть про обработку событий (нажатие кнопки клавиатуры или перемещение мыши) и доступ к объектам, но это отдельная тема.

VBA процедуры типа Sub – подпрограммы

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

Sub ИмяПодпрограмм([аргументы])
Операторы
[Exit Sub]
операторы
End Sub

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

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

Давайте напишем простой пример: добавьте в проект новую форму и новый модуль. На поверхность формы добавьте два текстовых поля (TextBox), одну метку (Label) и одну кнопку (CommandButton). Создайте связь между формой и модулем, прописав в редакторе кода для модуля:

Sub SubModule() SubForm.Show End Sub

Я назвал форму SubForm, а модуль – SubModule, за имя отвечает свойство Name.

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

Теперь в редакторе кода для формы пропишите:

‘************************************ ‘ Вычисление гипотенузы ‘************************************ ‘ процедура VBA принимает два параметра Sub Hipotenuze(a, b) Dim c ‘ Проверка, если значения равны нулю If TextBox1.Text = 0 Or TextBox2.Text = 0 Then a = 1: b = 1 End If ‘ вычисление гипотенузы c = Sqr(a ^ 2 + b ^ 2) Label1.Caption = «Гипотенуза: » & c End Sub ‘ Обработка нажатия на кнопку Private Sub CommandButton1_Click() Dim Ta, Tb Ta = TextBox1.Text Tb = TextBox2.Text ‘ vba вызов процедуры Hipotenuze Call Hipotenuze(Ta, Tb) End Sub ‘ Настройка свойств при запуске формы Private Sub UserForm_Initialize() Label1.Caption = «» Label1.FontSize = 15 Label1.ForeColor = vbBlue CommandButton1.Caption = «Найти» TextBox1.Text = 5 TextBox2.Text = 5 End Sub

Тут все предельно просто, вначале мы объявили процедуру Hipotenuze, которой будут передаваться два аргумента, далее происходит проверка на нулевые значения. Вызов происходит при нажатии на кнопку, находящуюся на форме, параметрами будут значения, хранящиеся в текстовых полях TextBox1 и TextBox2. Результат отображается в метке Label1.

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

Sub MySub (a As Integer, b As String) … End Sub

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

ParamArray – данное ключевое слово позволяет передавать процедуре переменное количество параметров, оно может использоваться только для последнего элемента в списке аргументов.

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

ParamArray нельзя использовать вместе со словами ByRef, ByVal или Optional, например:

‘************************************ ‘ Передача параметров ‘************************************ ‘ процедура VBA принимает два параметра Sub MyArguments(a As Integer, ParamArray b()) Dim elem, s As String Label1.Caption = a For Each elem In b s = s & elem & » » Next Label2.Caption = s End Sub ‘ Обработка нажатия на кнопку Private Sub CommandButton1_Click() MyArguments 1, 5, 6, 100, «строка» End Sub ‘ Настройка свойств при запуске формы Private Sub UserForm_Initialize() Label1.Caption = «» Label1.FontSize = 15 Label1.ForeColor = vbBlue Label2.Caption = «» Label2.FontSize = 15 Label2.ForeColor = vbRed CommandButton1.Caption = «Вывести» End Sub

Как видим, мы фактически с помощью ParamArray показываем, что передаем массив, для его обработки мы использовали оператор For …. Each. Тут мы передали при вызове VBA процедуры пять параметров, при этом, первый будет храниться в аргументе a, а остальные в аргументе b, который обрабатывается как массив.

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

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

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

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

private sub vba что это. Смотреть фото private sub vba что это. Смотреть картинку private sub vba что это. Картинка про private sub vba что это. Фото private sub vba что это

Что бы все стало понятно, рассмотрим следующий пример:

‘************************************ ‘ Передача параметров ‘************************************ Sub MySub1() Dim MyVar MyVar = 100 Call MySumm1(MyVar) Label1.Caption = «Передача по ссылке » & MyVar End Sub Sub MySub2() Dim MyVar MyVar = 100 Call MySumm2(MyVar) Label2.Caption = «Передача по значению » & MyVar End Sub Sub MySumm1(ByRef a) a = a + 100 End Sub Sub MySumm2(ByVal a) a = a + 100 End Sub Private Sub CommandButton1_Click() MySub1 MySub2 End Sub Private Sub UserForm_Initialize() Label1.Caption = «» Label1.FontSize = 15 Label1.ForeColor = vbBlue Label2.Caption = «» Label2.FontSize = 15 Label2.ForeColor = vbRed CommandButton1.Caption = «Проверить» End Sub

MySub1 – тут происходит объявление переменной MyVar и присвоение ей значения 100, далее в теле происходит вызов VBA процедуры MySumm1, ей в качестве параметры мы передаем значение переменной MyVar – 100. Сама процедура MySumm принимает значение по ссылке, на что указывает ключевое слово ByRef, к принятому значению прибавляется число 100. Стоит обратить внимание, что ByRef можно было и не писать. После VBA вызова процедуры MySumm1 происходит запись значения переменной MyVar в свойство Caption объекта Label1, в итоге, отобразится число 200.

MySub2 – аналог предыдущей процедуры, но тут происходит вызов MySumm2, в которой происходит передача параметров по значению, о чем говорит ключевое слово ByVal, в итоге, значение переменной MyVar не изменится.

VBA процедуры типа Function – функции

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

Function ИмяФункции ([аргументы]) [As ТипДанных]
Операторы
[Exit Function]
Операторы
[ИмяФункции=Выражение]
End Function

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

Function Summ(a As Integer, b As Integer) As Integer Summ = a + b End Function Private Sub CommandButton1_Click() Label1.Caption = «Сумма 10 и 20: » & Summ(10, 20) End Sub Private Sub UserForm_Initialize() Label1.Caption = «» Label1.FontSize = 15 Label1.ForeColor = vbBlue CommandButton1.Caption = «Сумма» End Sub

Спасибо за внимание. Автор блога Владимир Баталий

Источник

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

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