Глобальная переменная в проекте VBA Excel. Объявление глобальной переменной в модуле проекта VBA и обращение к ней из других модулей того же проекта.
Объявление глобальной переменной
Глобальная переменная — это переменная, которая объявлена в одном из модулей проекта VBA и доступна для использования во всех остальных модулях.
Чтобы переменная стала глобальной, она должна быть объявлена в начале модуля перед первой процедурой (раздел Declarations) с помощью оператора Public. Этот способ работает во всех модулях проекта VBA Excel.
Допускается объявление глобальной переменной с помощью оператора Global, но такой способ считается устаревшим и на сайте разработчиков уже не упоминается. Объявить глобальную переменную с оператором Global можно только в стандартном модуле.
Пример объявления глобальных переменных в любом модуле проекта VBA:
Public myGlobVar1 ‘по умолчанию — As Variant Public myGlobVar2 As String Public myGlobVar3 As Double |
Объявление глобальных переменных
Обращение к глобальной переменной
Примеры обращения к глобальной переменной, объявленной в разных типах модулей проекта VBA Excel. Актуально для обращения из модуля любого типа данного проекта.
Переменная в стандартном модуле
Если глобальная переменная (myGlobVar) объявлена в стандартном модуле (Module1) с уникальным именем, не повторяющимся в других модулях, к ней можно обращаться из других модулей по одному имени (в примере — из модуля формы):
Private Sub CommandButton1_Click() myGlobVar = «Глобальная переменная» TextBox1.Text = myGlobVar End Sub |
Стандартное обращение с указанием имени модуля (Module1), в котором объявлена глобальная переменная (myGlobVar):
Private Sub CommandButton1_Click() Module1.myGlobVar = «Глобальная переменная» TextBox1.Text = Module1.myGlobVar End Sub |
Переменная в модуле книги
Глобальная переменная (myGlobVar), объявленная в модуле книги, доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:
Sub Primer1() ThisWorkbook.myGlobVar = «Глобальная переменная» MsgBox ThisWorkbook.myGlobVar End Sub |
Переменная в модуле листа
Обращение к глобальной переменной (myGlobVar), объявленной в модуле рабочего листа (Лист1), из других модулей по имени листа (в проводнике проекта находится без скобок слева от имени ярлыка):
Sub Primer2() Лист1.myGlobVar = «Глобальная переменная» MsgBox Лист1.myGlobVar End Sub |
По имени ярлыка (в проводнике проекта находится в полукруглых скобках справа от имени листа):
Sub Primer3() Worksheets(«Лист1»).myGlobVar = «Глобальная переменная» MsgBox Worksheets(«Лист1»).myGlobVar End Sub |
Переменная в модуле формы
Глобальная переменная (myGlobVar), объявленная в модуле формы (UserForm1), доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:
Sub Primer4() UserForm1.myGlobVar = «Глобальная переменная» MsgBox UserForm1.myGlobVar End Sub |
Переменная в личной книге макросов
Обращение к глобальной переменной (myGlobVar), объявленной в модуле ЭтаКнига
проекта VBAProject (PERSONAL.XLSB)
из модуля проекта VBA обычной книги Excel:
Sub Primer5() Workbooks(«PERSONAL.XLSB»).myGlobVar = «Глобальная переменная» MsgBox Workbooks(«PERSONAL.XLSB»).myGlobVar End Sub |
Мне не удалось получить доступ из проекта VBA текущей книги Excel к глобальной переменной, объявленной в стандартном модуле личной книги макросов.
В данной статье мы рассмотрим работу с локальными и глобальными переменными VBA языка, а именно: как ведут себя переменные, объявленные в блоке модуля и в блоке отдельной процедуры; познакомимся с ключевыми словами Public, Private и Static; Определим логику назначении типов данных при объявлении нескольких переменных в одной строке; напишем парочку примеров.
В прошлых статьях мы кратко рассмотрели переменные и типы данных, теперь настало время более подробно вникнуть во все тонкости…
Содержание
- Объявление нескольких переменных VBA
- Объявление переменных в VBA локальной и глобальной видимости
- Ключевые слова Private, Public и Static
Объявление нескольких переменных VBA
Рассмотрим такой пример: надо объявить три переменные разного типа, например, Byte, String и Long, это может выглядеть так:
dim A as Byte, B as String, C as Long
Но вот что делать, если все три переменные должны быть одного типа, такой код будет неверен:
Тут A и В будут типа Variant и только C – Long. Что бы все правильно сработало, нам нужно каждой переменной назначить заданный тип:
dim A as Long, B as Long, C as Long
Объявление переменных в VBA локальной и глобальной видимости
Если переменная VBA объявлена в начале модуля, то она сохраняется в памяти до тех пор, пока работает макрос, если объявление происходит в теле процедуры, то переменная будет удалена из памяти сразу, после выполнения блока кода заданной процедуры. Добавьте в редакторе Visual Basic новую форму и модуль.
Параметры формы: разместите на форме три компонента Label и три кнопки, как показано на рисунке. Имя формы (свойство Name) – VariableForm, имя модуля – VariableModule.
В редакторе кода для модуля пропишите:
Sub VariableModule() VariableForm.Show End Sub
Тут мы просто определяем, что при запуске макроса нужно запустить форму.
В редакторе кода для формы пропишите:
'************************************************** ' Объявление локальных и глобальных переменных в VBA '************************************************** ' Включаем проверку переменных VBA Option Explicit ' Глобальная переменная Dim GVar As Integer 'Нельзя присвоить значение вне процедуры!!! 'GVar = 10 Sub GetGlobal() ' Увеличиваем значение на 5 GVar = GVar + 5 Label1.Caption = "Глобальное значение " & GVar End Sub Sub GetLocal_1() Dim LVar As Integer ' Увеличиваем значение на 2 LVar = LVar + 2 Label2.Caption = "Локальное значение " & LVar End Sub Sub GetLocal_2() Dim LVar As Integer ' Увеличиваем значение на 3 LVar = LVar + 3 Label3.Caption = "Локальное значение " & LVar End Sub Private Sub CommandButton1_Click() Call GetGlobal End Sub Private Sub CommandButton2_Click() Call GetLocal_1 End Sub Private Sub CommandButton3_Click() Call GetLocal_2 End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() ' настройка первого текстового поля Label1.FontSize = 12 Label1.ForeColor = &HFF0000 Call GetGlobal ' настройка второго текстового поля Label2.FontSize = 12 Label2.ForeColor = &H6400 Call GetLocal_1 ' настройка третьего текстового поля Label3.FontSize = 12 Label3.ForeColor = &HFF Call GetLocal_2 End Sub
В самом начале мы объявляем глобальную переменную VBA – GVar типа Integer, в комментарии указано, что вне процедуры присвоить значение переменной нельзя. Далее следуют три процедуры, в первой процедуре происходит увеличение значение глобальной GVar на 5, результат будет записываться в свойство Caption первого компонента Label. Вторя и третья процедуры производят аналогичные действия, только для объявленных в них локальных переменных VBA, LVar, происходит увеличение значения на 2 и на 3, соответственно. События Click (нажатие кнопки мыши) для кнопок будет вызывать заданные процедуры.
При запуске макроса в полях будут отображаться значения 5, 2 и 3. При нажатии на “Кнопка 1” будет происходить вызов процедуры GetGlobal и увеличение значения переменной GVar на 5. Для “Кнопка 2” и “Кнопка 3” будут вызываться процедуры GetLocal_1 и GetLocal_2, однако ничего увеличиваться не будет, так как переменные LVar являются локальными и при каждом вызове заданных процедур их значение будет обнуляться.
Ключевые слова Private, Public и Static
Private – аналогично ключевому слову Dim, использование Private вместо Dim актуально в том случае, если вы хотите, что бы данное ключевое слово напоминало о том, что переменная доступна только в пределах данной процедуры или функции.
Public – позволяет сделать переменную VBA доступной из любой части проекта, однако, это будет актуальным лишь в том случае, если объявление переменных в VBA происходит в разделе Declarations (Объявления) самого модуля. Если же вы пропишите Public вместо Dim в теле процедуры, то видимость все ровно будет доступна только в данной процедуре.
Static – данное ключевое слово актуально использовать вместо Dim тогда, когда нужно сохранять значение переменной в теле процедуры. Для примера, мы перепишем предыдущий код таким образом:
Sub GetLocal_1() Static LVar As Integer ' Увеличиваем значение на 2 LVar = LVar + 2 Label2.Caption = "Локальное значение " & LVar End Sub Sub GetLocal_2() Static LVar As Integer ' Увеличиваем значение на 3 LVar = LVar + 3 Label3.Caption = "Локальное значение " & LVar End Sub
Мы просто изменили ключевое слово Dim на Static, и теперь переменные LVar не будут удаляться из памяти после выполнения процедур. Объявление переменных в VBA. Обратите внимание, что мы объявили переменные с одним именем, это можно, так как они находятся в отдельных процедурах.
Return to VBA Code Examples
We have already covered an introduction to variables, constants and VBA data types in an introductory tutorial. We are going to cover Public variables in this tutorial. The definition of a Public variable is a variable that any module, Sub Procedure, Function or Class can access and use within a certain workbook.
Declaring a Public Variable in VBA
There are five main keywords that you can use to declare a variable in VBA. These are:
- The Dim keyword
- The Static keyword
- The Global keyword
- The Public keyword
- The Private keyword
The Global variable and the Public variable are very similar.
In order to declare a Public variable, you have to place your variable in the Declarations section of your VBA code below the Option Explicit statement, outside of any of your Sub Procedures or Functions and you also have to use the Public keyword. This is shown below:
Public MyVariable as Integer
When you declare a variable as a public variable, you are also inferring to the scope of that variable. You determine the scope of a variable by the keyword you use to declare it and where you place it in your code.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
<<Return to VBA Examples
Здравствуйте, уважаемые эксперты. Нужно один раз объявить переменную (а можно и константу), присвоить ей значение и использовать во всех листах и модулях книги. До её закрытия. 1. Где её объявить ? В «Эта книга» ? Сделал так, неверно. Пробовал еще всякие комбинации. Не нашел решения. Изменено: Сергей Евдокимов — 11.04.2022 07:27:30 Компьютер никогда не заменит человека (©️ Hannibal Lecter) |
|
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#2 11.04.2022 07:37:27
в любом стандартном модуле. На событие открытия книги присваивать значение.
Что такое переменная и как правильно её объявить? Изменено: Дмитрий(The_Prist) Щербаков — 11.04.2022 07:38:36 Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||
БМВ Модератор Сообщений: 21376 Excel 2013, 2016 |
#3 11.04.2022 07:42:46
1. Константа — Ей нельзя присвоить что-то сложновычисляемое, и ссылкой на объект она быть точно не может. Изменено: БМВ — 15.04.2022 17:40:14 По вопросам из тем форума, личку не читаю. |
||
Общие сведения об области и видимости переменных VBA Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Сергей Евдокимов Пользователь Сообщений: 442 (Win’11-Excel’21/365) |
#5 11.04.2022 10:22:12 Дмитрий(The_Prist) Щербаков, Спасибо.
Здесь у меня точно была ошибка. Присваивать значение переменной можно только внутри процедуры ?
Спасибо. Теперь буду знать.
У меня получилось, что одно и то же 7 раз в разных процедурах присваиваю (Set ws = ThisWorkbook.Worksheets(«ИмяЛиста»)) Изменено: Сергей Евдокимов — 11.04.2022 10:57:10 Компьютер никогда не заменит человека (©️ Hannibal Lecter) |
|||||
Jack Famous Пользователь Сообщений: 10846 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#6 11.04.2022 10:25:21
вам прямо он был написан тут же первым ответом
у вас за строку в VBA надо деньги платить? Попробуйте и узнаете — больше времени на вопрос потратили, чем на такую проверку. Если переменная НЕ КОНСТАНТА (которой присваивать значение можно только при объявлении) и переменная ВИДНА, то менять её значение МОЖНО. Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||||||
Сергей Евдокимов Пользователь Сообщений: 442 (Win’11-Excel’21/365) |
#7 11.04.2022 10:41:39
Да. Спасибо. Я просто не знал, что Дмитрий внёс ясность. Изменено: Сергей Евдокимов — 11.04.2022 10:44:04 Компьютер никогда не заменит человека (©️ Hannibal Lecter) |
||
БМВ Модератор Сообщений: 21376 Excel 2013, 2016 |
#8 11.04.2022 11:43:53
Смотря для чего вы и что делаете. Если это результат вычислений или параметрическая таблица, которая потом используется много раз в других процедурах, то это позволяет не заботится о передаче её в процедуры, ну и инициализировать один раз. Если например нужно зафиксировать лист , который был при открытии, то тоже можно, но как я уже писал, при сбросе, переменная будет пустой что станет сюрпризом. По вопросам из тем форума, личку не читаю. |
||
или «ИмяЛиста» сделать глобальной константой Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
БМВ Модератор Сообщений: 21376 Excel 2013, 2016 |
#10 11.04.2022 12:58:30
Вполне применимо, но вдруг еще и книгу менять, тогда …. По вопросам из тем форума, личку не читаю. |
||
- Открытая переменная Excel VBA
Открытая переменная Excel VBA
Переменная является важной частью жизни программистов. Каждый раз, когда программист кодирует, он создает некоторый набор переменных. Переменную можно рассматривать как ваучер, который мы часто используем на сайтах онлайн-покупок, таких как Flipkart, Amazon и т. Д., Который позволяет получить определенную скидку на определенные товары заранее. То же самое в случае с переменной. Переменная может быть грамматически определена как заполнитель, который резервирует некоторую память в системе с определенным именем. Это пространство памяти может быть использовано в любое время с тем же именем.
Переменная VBA считается общедоступной переменной в двух случаях. Когда —
- Он может использоваться вместе со всеми кодами в модуле.
- Он может использоваться во всех кодах для разных модулей.
С точки зрения непрофессионала, переменная рассматривается как общедоступная переменная, когда она может использоваться в любом коде и в любом модуле. В этой статье мы увидим, как можно определить переменную. Как это можно определить публично в рамках VBA.
Прежде чем начать концепцию VBA Public Variable, мы должны понять, что переменные, которые используются в одной подпроцедуре, не могут использоваться в другой подпроцедуре (именно здесь мы начали чувствовать необходимость наличия общедоступной переменной который может использоваться в любом модуле, любой подпроцедуре).
Предположим, что мы создаем подпроцедуру в VBA и определяем новую переменную там, используя оператор Dim.
В этом коде var1 — это переменная, определенная в подпроцедуре Ex_Var .
Теперь я определю новую подпроцедуру, ирония в том, что я не могу использовать ранее определенную var1 в этой подпроцедуре . Смотрите скриншот ниже, где я пытаюсь присвоить значение 10 переменной var1 в рамках другой подпроцедуры. См. Также сообщение об ошибке после запуска кода.
Объявляя переменные в подпроцедурах, мы ограничиваем их использование только этой подпроцедурой. Это главный недостаток объявления переменной в подпроцедуре.
Это приводит к новой теории, которая включает объявление переменных вне подпроцедур. Это поможет программисту широко использовать определенные переменные в различных подпроцедурах.
Как объявить публичные переменные в VBA?
Давайте рассмотрим несколько примеров объявления открытых переменных в VBA.
Вы можете скачать этот шаблон VBA Public Variables Excel здесь — Шаблон VBA Public Variables Excel
Пример № 1 — Публичное определение переменной в модуле
Предположим, мы хотим определить переменную, к которой можно получить общий доступ ко всем кодам в одном модуле. Мы можем это сделать. Следуйте инструкциям ниже:
Шаг 1. Откройте редактор Visual Basic (VBE), нажав Alt + F11 или нажав кнопку Visual Basic на вкладке Разработчики в Excel. Выберите вкладку «Вставка», перейдите к «Модули» и нажмите на нее. Он добавит новый модуль в VBE для работы.
Шаг 2: В только что созданном модуле добавьте команду Option Explicit в начале кода VBA (перед созданием любой переменной). Опция Explicit помогает вам, если есть какая-либо опечатка при использовании определенной переменной. Если используемая переменная не определена в системе, эта опция выдает сообщение об ошибке о том, что переменная не определена.
Код:
Вариант Явный
Шаг 3: Используйте оператор Dim для создания новой переменной с именем my_name с типом данных как String.
Код:
Опция Явный Dim my_name As String
Если бы вы могли обратить внимание, мы определили эту переменную явно. То есть, это не часть конкретной подпроцедуры. Что автоматически делает эту переменную доступной для всех кодов в созданном модуле (Module1). Это называется определением переменной публично в модуле. Эта переменная может использоваться где угодно в нескольких подпроцедурах одного и того же модуля.
Предположим, что код приведен ниже, я присвоил значение переменной my_name как «Lalit Salunkhe».
Код:
Параметр Явный Dim my_name As String Sub Ex_1 () my_name = "Lalit Salunkhe" MsgBox "Меня зовут:" & my_name End Sub
Если я выполню этот код, я увижу окно сообщения, как показано на скриншоте ниже:
Мы также можем использовать эту переменную в разных подпроцессах в одном и том же модуле. Смотрите скриншот, приведенный ниже:
Код:
Опция Явное Dim my_name As String Sub Ex_1 () my_name = "Lalit Salunkhe" MsgBox "Меня зовут:" & my_name End Sub Sub Ex_2 () Dim my_age As Integer my_name = "Lalit Salunkhe" my_age = 28 MsgBox "Меня зовут: "& my_name &"; Мой возраст: "& my_age End Sub
Смотрите подпроцесс Ex_2. У него есть новая переменная, определенная my_age. Я использовал my_name, чтобы добавить свое имя, и my_age, чтобы добавить мой возраст. Вы можете видеть, что my_name все еще доступно во второй подпроцедуре. После запуска этого кода мы можем получить вывод в виде окна сообщения, показанного ниже:
Вот как мы можем определить переменную публично в модуле.
Пример № 2 — Определение переменной публично для всех модулей
Чтобы достичь этого навыка, вам нужно использовать ключевые слова как Public или Global вместо Dim, который устанавливает переменную как public для всех модулей, где бы вы ни работали.
Шаг 1: Создайте новый модуль. Перейдите на вкладку « Вставка », нажмите « Модуль», чтобы добавить новый модуль в VBE.
Шаг 2: Добавить опцию Явный в модуле.
Код:
Вариант Явный
Шаг 3: Определите новую переменную с именем var1 и var2 как целое число типа. Но на этот раз мы используем Public вместо Dim (который мы использовали ранее).
Код:
Опция Явный Public var1 As Integer Public Var2 As Integer
Шаг 4: Теперь эти две переменные можно использовать в нескольких модулях, если они созданы в одном VBE. Смотрите пример, приведенный ниже:
Код:
Опция Явный Public var1 As Integer Public var2 As Integer Sub Ex_3 () var1 = 10 var2 = 100 MsgBox "Значение для var1 равно:" & var1 & Chr (13) & "Значение для var2 равно:" & var2 End Sub
Мы присвоили значения обеим переменным, используя функцию MsgBox, пытаясь отобразить значения для этих двух переменных.
Шаг 5: Запустите код, нажав клавишу F5 или нажав кнопку Play, вы можете увидеть результат, как показано ниже:
Шаг 6: Мы будем использовать те же переменные в модуле Module1, которые мы использовали в первом примере, и попытаемся выяснить, доступны ли переменные там или нет.
Код:
Опция Явное Dim my_name As String Sub Ex_1 () my_name = "Lalit Salunkhe" MsgBox "Меня зовут:" & my_name End Sub Sub Ex_2 () Dim my_age As Integer my_name = "Lalit Salunkhe" my_age = 28 MsgBox "Меня зовут: "& my_name &"; Мой возраст: "& my_age End Sub Sub Ex_public () var1 = 1000 var2 = 999 MsgBox" Значение для var1 равно: "& var1 & Chr (13) &" Значение для var2 равно: "& var2 End Sub
Если вы могли видеть скриншот выше, мы использовали тот же набор переменных, определенных в Module2, и имели значения, такие как 1000 и 999 соответственно. Мы используем функцию MsgBox для представления значений этих двух переменных соответственно. Запустите код, и вы увидите результат, как показано ниже:
Вот как переменная может использоваться публично внутри модуля и между модулями.
То, что нужно запомнить
- Всегда предпочтительно определять переменные явно в VBA. Так что они не ограничены подпроцедурой, в которой они определены.
- Вы можете назначить общедоступную переменную двумя способами: один внутри модуля, используя обычный оператор Dim, и второй для всех модулей, представленных в VBE, используя оператор Public или Global.
Рекомендуемые статьи
Это руководство по VBA Public Variable. Здесь мы обсуждаем, как объявить общедоступную переменную в Excel, используя код VBA в Excel, вместе с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —
- VBA Global Variables
- Одна переменная таблица данных в Excel
- VBA FileSystemObject (FSO)
- Таблица двух переменных данных в Excel