Глобальная переменная в проекте 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. Обратите внимание, что мы объявили переменные с одним именем, это можно, так как они находятся в отдельных процедурах.
This is a question about scope.
If you only want the variables to last the lifetime of the function, use Dim
(short for Dimension) inside the function or sub to declare the variables:
Function AddSomeNumbers() As Integer
Dim intA As Integer
Dim intB As Integer
intA = 2
intB = 3
AddSomeNumbers = intA + intB
End Function
'intA and intB are no longer available since the function ended
A global variable (as SLaks pointed out) is declared outside of the function using the Public
keyword. This variable will be available during the life of your running application. In the case of Excel, this means the variables will be available as long as that particular Excel workbook is open.
Public intA As Integer
Private intB As Integer
Function AddSomeNumbers() As Integer
intA = 2
intB = 3
AddSomeNumbers = intA + intB
End Function
'intA and intB are still both available. However, because intA is public, '
'it can also be referenced from code in other modules. Because intB is private,'
'it will be hidden from other modules.
You can also have variables that are only accessible within a particular module (or class) by declaring them with the Private
keyword.
If you’re building a big application and feel a need to use global variables, I would recommend creating a separate module just for your global variables. This should help you keep track of them in one place.
Home / VBA / Declare Global Variable (Public) in VBA
In VBA, when you declare a variable as a global variable you can use it in any procedure in any module. As the name suggests you can use it globally means its availability is everywhere.
So if you have a global variable in the “module1” and now you want to use it in the module2, you can use it.
- First, you need to use the keyword “Global”
- After that, declare the name of the variable.
- Next, type “as” to get the list of data types.
- In the end, select the data type that you want to declare for the variable.
Notes
- When you are declaring a global variable, you need to declare it before writing any procedure into the module as you can see in the above example.
- You can also use the keyword “Public” to declare a variable as global.
Understand Scope of Variables
But to have a clear understanding of a global variable you need to understand the scope of the variables. There are three ways of defining scopes to variables:
- Procedure-Level: You can only use a variable in the same procedure where you declare it.
- Module-Level (Private): Makes a variable accessible from all the procedures in a module.
- Global Level (Public): Makes a variable accessible from all the procedures in all the modules.
Let me share something from the real world with you to make you understand this. I work from a co-working space and the place where I sit is on the first floor in the three-floor building, I mostly sit on the same seat every day.
When you declare a variable with the procedure-level scope you can only use it in the same procedure.
Just like I sit on the same seat on the same floor every day. But let me tell you more: Even though I sit on the first floor, I can use any seat on other floors too.
And in the below snapshot, we have declared the variable “iCon” at the top of the module using the keyword Private before starting any procedure and I have used it in all three codes.
Think of this module as a building where you have different floors (Procedures) and as you have already declared the variable at the starting of the module you can use any of the procedures in that module. It is called private module-level scope.
Now here is the last thing: My office has branches in different cities all over the country and if I go there, I can go to those offices and use any of the seats if I want. So, if you have different modules in your workbook, you can use a variable in all those modules by declaring it as Public/Global.
Excel VBA Global Variables
We usually declare any variable by using the word DIM and this is the best direct method of doing this. But the variables declared using DIM can only be used within the same module. If we try to use this variable defined by using DIM, it will be applicable for the module under which it is being declared. What if we want to use a variable in any module or project? Which cannot be possible if we keep on using DIM to define that variable?
In that case, we have a secondary option by defining the variable by word Global or Public in VBA. VBA Global or Public variables are those variables which are declared at the beginning of subcategory with the help of Option Explicit. Whatever things which we don’t or can’t do under subcategories, they are done before that under Option Explicit.
How to Declare Global Variables in VBA?
Below are the different examples to declare a global variable in Excel using VBA code.
You can download this VBA Global Variables Excel Template here – VBA Global Variables Excel Template
VBA Global Variables – Example #1
In this example, we will see how different subcategories can be used as a single module without using Global or Public word for defining any variable. For this, we would need a module.
- Go to Insert menu and click on Module as shown below.
- Now type the subcategory in any name as shown below.
Code:
Sub Global_Variable() End Sub
- Now use DIM to define any kind of variable. Here we have chosen alphabet A as String.
Code:
Sub Global_Variable() Dim A As String End Sub
- Now create another subcategory in the same module as shown below.
Code:
Sub Global_Variable() Dim A As String End Sub Sub Global_Variable6() End Sub
- Now in the second subcategory define another variable B using DIM as String.
Code:
Sub Global_Variable() Dim A As String End Sub Sub Global_Variable6() Dim B As String End Sub
As shown above, both the variables A and B defined in both subcategories cannot be used in each other’s region. Those will be applicable in their own subcategory only.
- Now to make this work, write Option Explicit above the first subcategory as shown below.
Code:
Option Explicit Sub Global_Variable() End Sub Sub Global_Variable6() End Sub
- Now we can define our variable which will be used in both of the subcategories of which we have below. So now consider writing any variable say A as String using DIM.
Code:
Option Explicit Dim A As String Sub Global_Variable() End Sub Sub Global_Variable6() End Sub
As we have defined the variable all the sub-categories will be in that module and this would be applicable to all the code of that module only. And if we try to call the variables defined in this module to some other module, then it would give us the error.
VBA Global Variables – Example #2
In this example, we will see how to use Global or Public word for defining any variable in excel VBA. For this, we will use the code which we have seen in example-1.
We will use below portion of code for Global or Public variable declaration.
Code:
Option Explicit Sub Global_Variable() End Sub Sub Global_Variable6() End Sub
As we did in example-1 where we have declared the common variable which would be used in both the subcategories, below the Option Explicit. In the example, we will declare the Global Variable below the Option Explicit as well.
As we already have our code ready so we can directly go on declaring variables using Global. Now in the below Option Explicit write Global the same we used to with DIM and select a variable of choice. Here we are choosing alphabet A as shown below.
Code:
Option Explicit Global A Sub Global_Variable() Dim A As String End Sub Sub Global_Variable6() Dim B As String End Sub
Now we choose any type of variable to be it. As we have already used String in the above example, so we would use the same here as well.
Code:
Option Explicit Global A As String Sub Global_Variable() Dim A As String End Sub Sub Global_Variable6() Dim B As String End Sub
This completes our Global variable declaration process. Now we can use this in any module, any project as String only. Before we use it, delete the previously declared variable, then the code would look like as shown below.
Code:
Option Explicit Global A As String Sub Global_Variable() End Sub Sub Global_Variable6() End Sub
Now let’s assign some text to defined variable A in both subcategories. We are choosing “Test1” and “Test2” for variable A in both subcategories as shown below. And also we have chosen MsgBox to show the values stored in variable A.
Code:
Option Explicit Global A As String Sub Global_Variable() A = "Test1" MsgBox A End Sub Sub Global_Variable6() A = "Test2" MsgBox A End Sub
Now run the code by pressing the F5 key or by clicking on the play button to see the result.
We will get the message as “Test1” as shown above. It is because we had kept our cursor in the first subcategory.
Now put the cursor anywhere in the second subcategory and run the code again. We will now get the message box with message “Test2” as shown below.
This is how we can create and define a variable once with the help of Global and that can be used in any module, any class and in any project. We can use Public as well in place of Global as shown below. And this will give the same result as we got in using Global.
Code:
Option Explicit Public A As String Sub Global_Variable() A = "Test1" MsgBox A End Sub Sub Global_Variable6() A = "Test2" MsgBox A End Sub
Pros of VBA Global Variable
- It saves time in declaring the multiple variables when we know, we may need to define the same type of variable again in different modules or subcategories.
- By using Global or Public in defining a variable process, our code becomes smaller saving time and spaces.
- It reduces the complexity when we are writing the huge code and may get confused among the use of different variables in different modules or subcategories.
Cons of VBA Global Variable
- If we do any changes to the Global variable then that changes will get implemented in all where it is used causing the problem in the functionality of written code.
Things to Remember
- Global and Public can be used interchangeably with the same functionality.
- If we don’t want to use Global variable then we can follow the process as shown in example-1 for defining the variable. But that would be limited to the same module.
- Global variables can be used in any module, any subcategory, any class or in any project.
- A Global variable gives the output of the code where we have kept the cursor. It will not run the complete code at one go giving all the output one by one.
Recommended Articles
This is a guide to VBA Global Variables. Here we discuss how to declare Global Variables in Excel using VBA code along with some practical examples and downloadable excel template. You can also go through our other suggested articles –
- VBA UserForm
- VBA Get Cell Value
- VBA Activate Sheet
- VBA RGB
Some functions defined inside a function used within the functions. Also, some variables defined outside the functions used by all the functions. Such variables used are global variables. For example, the variables declared under the sub-function are known as “global variables.”
Table of contents
- Global Variable in Excel VBA
- What are Global Variables in Excel VBA?
- How to Declare Global Variable in VBA?
- #1 – Module Variables can be used in any Sub Procedure in the Same Module
- #2 – Global Variables can be used in any Sub Procedure and also in any Module
- Things to Remember
- Recommended Articles
Global Variable in Excel VBA
Declaring a variable seems pretty simple. But to have good hands-on experience, we need to understand the scope of those variables. We often declare the variables for each macro inside the subprocedure. But by declaring one variable, we can use it in all the macros in the same module and the other modules of the current VBA project. This article will show you how to declare global variables in Excel VBA.
What are Global Variables in Excel VBA?
VBA global variables are variables declared before any macro in the module starts. When the variables are declared using either “Public” or “Global,” it becomes a global variable.
Sub Procedure Variables Cannot Use Anywhere.
We usually declare the variable inside the subroutine in VBASUB in VBA is a procedure which contains all the code which automatically gives the statement of end sub and the middle portion is used for coding. Sub statement can be both public and private and the name of the subprocedure is mandatory in VBA.read more by using the word “Dim.”
Look at the above image. We have declared the variable “k” as an integer inside the Sub procedure Global_Example1.
Suppose we use this variable inside this Sub procedure at any time. However, we cannot use this variable in another Sub procedure either in the same class module in VBAUsers have the ability to construct their own VBA Objects in VBA Class Modules. The objects created in this module can be used in any VBA project.read more or another module.
As shown in the above image, the variable “k,” declared in the Sub procedure Global_Example1, cannot be used in the Sub procedure Global_Example2.
Similarly, variable “j” declared in the Sub procedure Global_Example2 cannot be used in the Sub procedure Global_Example1 even though both are in the same module.
How to Declare a Global Variable in VBA?
The following are the ways to declare a global variable in Excel VBA.
#1 – Module Variables can be used in any Sub Procedure in the Same Module
As we have seen, we cannot use the Sub procedure variables in any of the modules. Therefore, to make them available for all the Sub procedures in the same module, we need to declare the variables at the top of the module.
In the above image, we have declared the variable at the start of the module only. I have expressed the variable “MyNumber” as an Integer in Module 1.
Once declared the variable at the top of the module, we can use the same variable for all the other Sub procedures in the same module. In this case, we can use the variable “MyNumber” for all the Sub procedures in Module 1.
We cannot use them in any of the other modules. In this case, the variable “MyNumber,” declared in Module 1, cannot be used in Module 2.
#2 – Global Variables can be used in any Sub Procedure and also in any Module
We have seen two kinds of variable declaration and their scope while using. The exciting thing is we can declare the variable in any one of the modules and use it for all the Sub procedures in all the modules of the same VBA Project.
To make the variable available for all the Sub procedures across all the modules, we need to declare the variable at the top of the module not by using the word “Dim” but by using the name “Public” or “Global.”
In the above image, we have used the word “Public” to declare the variable instead of our veteran word “Dim.”
In the above screenshot, we have declared the variable in Module 1. However, we have two more modules, Module 2 and Module 3.
Since we have declared the variable using the word “Public” at the top of the module, now we can access these variables in any Sub procedure across any module of the same workbook.
Not only “Public,” but we can also use the word “Global” to declare the variable.
“Global” and “Public” are the keywords to declare the variable and make them available across modules in VBA.
Things to Remember
- Once the excel macroA macro in excel is a series of instructions in the form of code that helps automate manual tasks, thereby saving time. Excel executes those instructions in a step-by-step manner on the given data. For example, it can be used to automate repetitive tasks such as summation, cell formatting, information copying, etc. thereby rapidly replacing repetitious operations with a few clicks.
read more runs with a global variable’s value, the variable is the same across all the Sub procedures. - It is better to maintain a particular module to declare global variables in VBA and have all the variables in one module.
- The only way we can reset the variable’s value is by resetting the macro code by pressing the stop button.
Recommended Articles
This article has been a guide to VBA Global Variables. Here, we learn how to declare global variables in Excel VBA, practical examples, and a downloadable template. Below you can find some useful Excel VBA articles: –
- VBA Exit Sub
- VBA ByRef Argument Type Mismatch
- VBA Option Explicit
- VBA Long Data Type
Return to VBA Code Examples
In this tutorial we will cover VBA Global Variables.
In VBA, variables can be declared with different scopes. The scope determines where the variable can be used.
Procedure-level Variable
Typically, you will see variables declared at the procedure-level within Sub Procedures or Functions. Procedure-level variables must be declared using the Dim keyword within the procedure where they will be used.
This example declares someNumber as an integer variable within the procedure.
Sub DeclaringAProcedureLevelVariable()
Dim someNumber As Integer
someNumber = 5
MsgBox someNumber
End Sub
You can only use this variable within this Sub Procedure. If you call the variable from another Sub Procedure you would get the following Compile Error:
Module Level Variable
A Module-level variable can be used by any Sub Procedure or Function within that module. You need to place the variable declaration at the top of the module in the Declarations section, under the Option Explicit statement, and use the Dim keyword:
Now the variable someNumber can be used in both sub procedures.
Global Level Variable
A global-level variable can be used anywhere within your code, within Modules, Functions, Sub Procedures and Classes. Global variables are declared in the Declarations Section, under the Options Explicit statement and using the keyword Global. The way you declare a Global level variable is shown below. Both of the Sub Procedures in Module1 can use this variable.
Since this variable is a Global level variable, you can also use it in Module2:
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!
- Глобальные переменные Excel VBA
Глобальные переменные Excel VBA
Мы обычно объявляем любую переменную, используя слово DIM, и это лучший прямой способ сделать это. Но переменные, объявленные с использованием DIM, могут использоваться только в одном модуле. Если мы попытаемся использовать эту переменную, определенную с помощью DIM, она будет применима для модуля, в котором она объявлена. Что если мы хотим использовать переменную в любом модуле или проекте? Что не может быть возможным, если мы продолжаем использовать DIM для определения этой переменной?
В этом случае у нас есть вторичная опция, определяющая переменную по слову Global или Public в VBA. Глобальные или публичные переменные VBA — это те переменные, которые объявлены в начале подкатегории с помощью Option Explicit. Что бы мы ни делали или не могли делать в подкатегориях, они выполняются до этого в Option Explicit.
Как объявить глобальные переменные в VBA?
Ниже приведены различные примеры объявления глобальной переменной в Excel с использованием кода VBA.
Вы можете скачать этот шаблон Excel для глобальных переменных VBA здесь — Шаблон Excel для глобальных переменных VBA
VBA Global Variables — Пример № 1
В этом примере мы увидим, как различные подкатегории могут использоваться как один модуль без использования глобального или открытого слова для определения какой-либо переменной. Для этого нам понадобится модуль.
- Перейдите в меню « Вставка» и нажмите « Модуль», как показано ниже.
- Теперь введите подкатегорию под любым именем, как показано ниже.
Код:
Sub Global_Variable () End Sub
- Теперь используйте DIM для определения любой переменной. Здесь мы выбрали алфавит A в качестве строки .
Код:
Sub Global_Variable () Dim A As String End Sub
- Теперь создайте другую подкатегорию в том же модуле, как показано ниже.
Код:
Sub Global_Variable () Dim A As String Конец Sub Sub Sub Global_Variable6 () Конец Sub
- Теперь во второй подкатегории определите другую переменную B, используя DIM в качестве String.
Код:
Sub Global_Variable () Dim A As Sub конца строки Sub Sub Global_Variable6 () Dim B As конца строки Sub
Как показано выше, обе переменные A и B, определенные в обеих подкатегориях, не могут использоваться в области друг друга. Они будут применимы только в своей подкатегории.
- Теперь, чтобы сделать это, напишите Option Explicit над первой подкатегорией, как показано ниже.
Код:
Опция Явный Sub Global_Variable () End Sub Sub Global_Variable6 () End Sub
- Теперь мы можем определить нашу переменную, которая будет использоваться в обеих подкатегориях, которые у нас есть ниже. Итак, теперь рассмотрим запись любой переменной, скажем, A как String, используя DIM.
Код:
Опция Явный Dim A As String Sub Global_Variable () End Sub Sub Global_Variable6 () End Sub
Поскольку мы определили переменную, все подкатегории будут в этом модуле, и это будет применимо только ко всему коду этого модуля. И если мы попытаемся вызвать переменные, определенные в этом модуле, в каком-либо другом модуле, то это даст нам ошибку.
VBA Global Variables — Пример № 2
В этом примере мы увидим, как использовать Global или Public word для определения любой переменной в Excel VBA. Для этого мы будем использовать код, который мы видели в примере-1.
Мы будем использовать нижнюю часть кода для объявления глобальной или публичной переменной.
Код:
Опция Явный Sub Global_Variable () End Sub Sub Global_Variable6 () End Sub
Как мы это делали в примере 1, где мы объявили общую переменную, которая будет использоваться в обеих подкатегориях, под Option Explicit. В этом примере мы также объявим глобальную переменную под явным вариантом.
Поскольку у нас уже есть готовый код, мы можем напрямую объявить переменные, используя Global . Теперь в приведенном ниже параметре Explicit напишите Global так же, как мы использовали для DIM, и выберите переменную по выбору. Здесь мы выбираем алфавит A, как показано ниже.
Код:
Опция Явный Глобальный A Sub Sub_ Global_Variable () Dim A As Sub String End Sub Global_Variable6 () Dim B As String End Sub
Теперь мы выбираем переменную любого типа. Как мы уже использовали String в приведенном выше примере, мы бы тоже использовали это здесь.
Код:
Параметр Явный Глобальный A в виде строкового Sub Sub Global_Variable () Dim A В качестве строкового конца Sub Sub Global_Variable6 () Dim B В качестве строкового конца Sub
Это завершает наш процесс объявления глобальной переменной. Теперь мы можем использовать это в любом модуле, любом проекте только как String. Прежде чем использовать его, удалите ранее объявленную переменную, тогда код будет выглядеть так, как показано ниже.
Код:
Параметр Явный Глобальный A в виде строки Sub Global_Variable () End Sub Sub Global_Variable6 () End Sub
Теперь давайте назначим некоторый текст определенной переменной A в обеих подкатегориях. Мы выбираем «Test1» и «Test2» для переменной A в обеих подкатегориях, как показано ниже. А также мы выбрали MsgBox, чтобы показать значения, хранящиеся в переменной A.
Код:
Параметр Явный Глобальный A в виде строки Sub Global_Variable () A = "Test1" MsgBox A End Sub Sub Global_Variable6 () A = "Test2" MsgBox A End Sub
Теперь запустите код, нажав клавишу F5 или нажав кнопку воспроизведения, чтобы увидеть результат.
Мы получим сообщение как «Test1», как показано выше. Это потому, что мы сохранили наш курсор в первой подкатегории.
Теперь поместите курсор в любую вторую подкатегорию и снова запустите код. Теперь мы получим окно сообщения с сообщением «Test2», как показано ниже.
Вот как мы можем создать и определить переменную один раз с помощью Global, и это можно использовать в любом модуле, любом классе и в любом проекте. Мы также можем использовать Public вместо Global, как показано ниже. И это даст тот же результат, который мы получили при использовании Global.
Код:
Параметр Явный Открытый A В виде строки Sub Global_Variable () A = "Test1" MsgBox A End Sub Sub Global_Variable6 () A = "Test2" MsgBox A End Sub
Плюсы VBA Global Variable
- Это экономит время при объявлении нескольких переменных, когда мы знаем, что нам может потребоваться снова определить переменные одного и того же типа в разных модулях или подкатегориях.
- Используя Global или Public в определении переменной процесса, наш код становится меньше, экономя время и пространство.
- Это уменьшает сложность, когда мы пишем огромный код, и может запутаться в использовании разных переменных в разных модулях или подкатегориях.
Минусы VBA Global Variable
- Если мы внесем какие-либо изменения в глобальную переменную, то эти изменения будут реализованы во всех местах ее использования, что приведет к проблеме в функциональности написанного кода.
То, что нужно запомнить
- Global и Public могут использоваться взаимозаменяемо с одинаковыми функциями.
- Если мы не хотим использовать глобальную переменную, мы можем следовать процессу, как показано в примере 1, для определения переменной. Но это будет ограничено тем же модулем.
- Глобальные переменные могут использоваться в любом модуле, любой подкатегории, любом классе или в любом проекте.
- Глобальная переменная дает вывод кода, в котором мы сохранили курсор. Он не будет запускать полный код за один раз, передавая все выходные по одному.
Рекомендуемые статьи
Это руководство по глобальным переменным VBA. Здесь мы обсудим, как объявлять глобальные переменные в Excel, используя код VBA, а также некоторые практические примеры и загружаемый шаблон Excel. Вы также можете просмотреть наши другие предлагаемые статьи —
- VBA UserForm
- Решить уравнение в Excel
- VBA Activate Sheet
- Как редактировать выпадающий список в Excel?
Хитрости »
1 Май 2011 225623 просмотров
Что такое переменная и как правильно её объявить?
Переменная — это некий контейнер, в котором VBA хранит данные. Если подробнее, то это как коробочка, в которую Вы можете положить что-то на хранение, а затем по мере необходимости достать. Только в данном случае в переменной мы храним число, строку или иные данные, которые затем можем извлекать из неё и использовать в коде по мере необходимости.
Для чего нужна переменная? Чтобы хранить значение и применить его позже в любой момент. Например, в ячейке А1 записана сумма, а нажатием на кнопку запускается обновление отчета. После обновления отчета сумма в А1 изменится. Необходимо сверить сумму до обновления с суммой после и в зависимости от этого сделать какое-либо действие. Переменная как раз позволит запомнить значение ячейки до того, как она обновится и использовать именно это значение после обновления.
- Требования к переменным
- Типы данных, хранимых в переменных
- Как объявлять переменные
- Как правильно назвать переменную
- Пример использования переменных
- Константы
В качестве имен переменных можно использовать символы букв и числа, но первой в имени переменной всегда должна быть буква. Не допускается использование точки, запятой, пробела и иных знаков препинания, кроме нижнего подчеркивания. Длина имени не должна превышать 254 символов. Так же нельзя использовать в качестве имен для переменных зарезервированные константы редактора VBA(например Sub, Msgbox, ubound, Date и т.п.). Так же для переменных неважен регистр букв.
Теперь рассмотрим основные декларированные в VBA
типы данных, которые можно хранить в переменных:
Тип данных | Занимает байт в памяти | Пределы значений |
---|---|---|
Byte | 1 | Целые числа от 0 до 255 |
Boolean | 2 | True или False |
Integer | 2 | Целые числа от (-32768) до 32767 |
Long | 4 | Целые числа от (-2147483648) до 2147483647 |
Single | 4 | От (–3.402823Е+38) до (–1.401298Е-45) и от 1.401298Е-45 до 3.402823Е+38 |
Double | 8 | От ±1.79769313486232Е+308 до ±4.94065645841247Е-324 |
Decimal | 12 | От ±79228162514264337593543950335 без десятичных знаков до ±7,9228162514264337593543950335 с 28-ю знаками после запятой |
Currency | 8 | От (–922337203685477.5808) до 922337203685477.5807 |
Date | 8 | От 01.01.100 до 31.12.9999(не надо путать с датами в Excel — 01.01.1900 до 31.12.9999) |
String | 10(+длина строки) | От 0 до 65400 символов для фиксированных строк и чуть более 2 млрд. для строк переменной длины |
Object | 4 | Любой объект |
Array | Определяется кол-вом и размером элементов | — |
Variant | от 16-ти | Любой из встроенных типов данных |
Как видно из таблицы больше всего памяти занимает Variant. Притом это если он хранит числовые данные. Если же такая переменная будет хранить данные строкового типа(текст), то размер занимаемой памяти будет измеряться уже начиная с 22 байт + длина строки, хранящейся в переменной. Чем больше памяти занимает переменная, тем дольше она инициализируется в памяти и тем медленнее код будет выполняться. Вот поэтому и важно явно задавать тип данных, хранимых в переменной — это называется объявить переменную.
Тип данных Decimal больше не используется, поэтому объявить переменную данного типа в VBA не получится — подобная попытка приведет к синтаксической ошибке. Для работы с данными типа Decimal переменную необходимо изначально объявить как Variant или вообще без типа (например Dim a), т.к. тип данных Variant используется в VBA по умолчанию и принимает любой тип данных.
Так же переменным можно назначать и другие типы данных, которых нет в таблице выше — это типы, которые поддерживаются объектной моделью приложений, к которым «подключен» VBA. Например, если зайти в VBA из Excel, то библиотека типов объектной модели Excel подключена по умолчанию и для переменных становится доступно множество типов этой объектной модели. Многие из них знакомы всем: Workbook, Worksheet, Range, Cells, Chart и т.д. Т.е. это книги, листы, ячейки, диаграммы. Типов много, почти на каждый объект и коллекцию. Рассматривать здесь все бессмысленно. Могу лишь привести пару строк кода:
Dim rRange as Range 'назначили переменной тип ячейка/диапазон Set rRange = Range("A1") 'присвоили ссылку на ячейку A1 текущего листа
Про объявление переменных подробно написано чуть ниже.
А более подробно про обращение к диапазонам из VBA можно почитать в этой статье: Как обратиться к диапазону из VBA
На самом деле все очень просто. Это делается при помощи операторов области действия: Dim, Public,Static и оператора присвоения типа As. Самый распространенный оператор — Dim. Его и возьмем в качестве примера. Синтаксис объявления:
[оператор области действия] Имя_переменной As [тип данных]
Очень частая ошибка при объявлении переменных, совершаемая начинающими изучать VBA:
Dim MyVar1, MyVar2, MyVar3 As Integer
Вроде бы исходя из логики всем переменным присвоен тип данных Integer. Но это ошибочное суждение. Тип Integer присвоен только последней переменной, к которой он «привязан» оператором As — MyVar3. Все остальные переменные имеют тип данных Variant. Т.е. если Вы не задаете каждой переменной свой тип хранимых данных явно(т.е. не указываете для неё тип данных через As), то VBA сам присваивает для такой переменной тип данных Variant, т.к. он может хранить любой тип данных. А вот так выглядит правильное присвоение типа данных:
Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer
Это и есть объявление переменных. Т.е. сначала идет оператор области действия (Dim, Public,Static), сразу за ним имя переменной, затем оператор As и тип.
Но это не все. Некоторые типы переменным можно присваивать еще короче — даже без оператора As:
Dim MyVar1%, MyVar2%, MyVar3%
Всего шесть типов, которые можно объявить подобным методом:
! — Single
# — Double
$ — String
% — Integer
& — Long
@ — Currency
На что стоит обратить внимание, при объявлении переменных подобным образом: между именем переменной и знаком типа не должно быть пробелов.
Я лично в большинстве статей предпочитаю использовать первый метод, т.е. полное указание типа. Это читабельнее и понятнее. В каких-то проектах могу использовать краткое указание, в общих(разработка в команде) — полное. В своих кодах Вы вправе использовать удобный Вам метод — ошибки не будет.
Теперь разберемся с операторами области действия(Dim, Public и Static):
- Dim — данный оператор используется для объявления переменной, значение которой будет храниться только в той процедуре, внутри которой данная переменная объявлена. Во время запуска процедуры такая переменная инициализируется в памяти и использовать её значение можно внутри только этой процедуры, а по завершению процедуры переменная выгружается из памяти(обнуляется) и данные по ней теряются. Переменную, объявленную подобным образом еще называют локальной переменной. Однако с помощью данного оператора можно объявить переменную, которая будет доступна в любой процедуре модуля. Необходимо объявить переменную вне процедуры — в области объявлений(читать как первой строкой в модуле, после строк объявлений типа — Option Explicit). Тогда значение переменной будет доступно в любой процедуре лишь того модуля, в котором данная переменная была объявлена. Такие переменные называются переменными уровня модуля. Также для использования переменных во всех процедурах и функциях одного конкретного модуля можно использовать оператор Private. Но он в данном случае ничем не отличается от Dim, а пишется длиннее Плюс, Private нельзя использовать внутри процедуры или функции(только в области объявлений), что еще больше сужает её применимость. По сути чаще этот оператор применяется к функциям и процедурам(об этом см.ниже)
- Static — данный оператор используется для объявления переменной, значение которой предполагается использовать внутри конкретной процедуры, но не теряя значения данной переменной по завершении процедуры. Переменные данного типа обычно используют в качестве накопительных счетчиков. Такая переменная инициализируется в памяти при первом запуске процедуры, в которой она объявлена. По завершении процедуры данные по переменной не выгружаются из памяти, но однако они не доступны в других процедурах. Как только Вы запустите процедуру с этой переменной еще раз — данные по такой переменной будут доступны в том виде, в котором были до завершения процедуры. Выгружается из памяти такая переменная только после закрытия проекта(книги с кодом).
- Public — данный оператор используется для объявления переменной, значение которой будет доступно в любой процедуре проекта(в обычных модулях, модулях класса, модулях форм, модулях листов и книг). Переменная, объявленная подобным образом, должна быть объявлена вне процедуры — в области объявлений. Такая переменная загружается в память во время загрузки проекта(при открытии книги) и хранит значение до выгрузки проекта(закрытия книги). Использовать её можно в любом модуле и любой процедуре проекта. Важно: объявлять подобным образом переменную необходимо строго в стандартном модуле. Такие переменные называются переменными уровня проекта. В простонародье такие переменные еще называют глобальными(возможно из-за того, что раньше подобные переменные объявлялись при помощи оператора Global, который в настоящее время устарел и не используется).
Для большего понимания того, где и как объявлять переменные уровня проекта два небольших примера.
Неправильное объявлениеOption Explicit Sub main() Public MyVariable As String MyVariable = "Глобальная переменная" 'показываем текущее значение переменной MsgBox MyVariable 'пробуем изменить значение переменной Call sub_main 'показываем измененное значение переменной MsgBox MyVariable End Sub 'доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub
переменные не будут видны во всех модулях всех процедур и функций проекта, потому что:
1. Оператор Public недопустим внутри процедуры(между Sub и End Sub), поэтому VBA при попытке выполнения такой процедуры обязательно выдаст ошибку — Invalid Attribut in Sub or Function.
2. Даже если Public заменить на Dim — это уже будет переменная уровня процедуры и для других процедур будет недоступна.
3. Т.к. объявление неверное — вторая процедура(ChangeMyVariable) ничего не знает о переменной MyVariable и естественно, не сможет изменить именно её.
Правильное объявление'выше глобальных переменных и констант могут быть только декларации: Option Explicit 'принудительное объявление переменных Option Base 1 'нижняя граница объявляемых массивов начинается с 1 Option Compare Text 'сравнение текста без учета регистра 'глобальная переменная - первой строкой, выше всех процедур Public MyVariable As String 'далее процедуры и функции Sub main() MyVariable = "Глобальная переменная" 'показываем текущее значение переменной MsgBox MyVariable, vbInformation, "www.excel-vba.ru" 'пробуем изменить значение переменной Call ChangeMyVariable 'показываем измененное значение переменной MsgBox MyVariable, vbInformation, "www.excel-vba.ru" End Sub 'доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub
Если при этом вместо Public записать Dim, то эта переменная будет доступна из всех функций и процедур того модуля, в котором записана, но недоступна для функций и процедур других модулей.
Переменные уровня проекта невозможно объявить внутри модулей классов(ClassModule, ЭтаКнига(ThisWorkbook), модулей листов, модулей форм(UserForm) — подробнее про типы модулей: Что такое модуль? Какие бывают модули?) - Операторы области действия так же могут применяться и к процедурам. Для процедур доступен еще один оператор области действия — Private. Объявленная подобным образом процедура доступна только из того модуля, в котором записана и такая процедура не видна в диалоговом окне вызова макросов(Alt+F8)
'процедура записана в Module1 'эта процедура будет доступна для вызова исключительно из процедур в этом же модуле 'но не будет доступна при вызове из других модулей Private Sub PrivateMain() MsgBox "Процедура может быть вызвана только из модуля, в котором записана", vbInformation, "www.excel-vba.ru" End Sub 'другая процедура, записанная в этом же модуле Sub CallPrivate() Call PrivateMain End Sub
'эта процедура записана в другом модуле - Module2 'при попытке вызова этой процедурой получим ошибку ' Sub or Function not defined ' потому что процедура PrivateMain объявлена только для Module1 Sub CallPrivate_FromModule1() Call PrivateMain End Sub
При этом, если из Excel нажать сочетание клавиш Alt+F8, то в окне будут доступны только CallPrivate_FromModule1 и CallPrivate. Процедура PrivateMain будет недоступна.
«Что самое сложное в работе программиста? — выдумывать имена переменным.» :-)А ведь придумать имя переменной тоже не так-то просто. Можно, конечно, давать им имена типа: a, d, f, x, y и т.д.(я сам иногда так делаю, но либо в простых кодах, либо для специального запутывания кода). Но стоит задуматься: а как Вы с ними будете управляться в большом коде? Код строк на 10 еще потерпит такие имена, а вот более крупные проекты — не советовал бы я в них оперировать такими переменными. Вы сами запутаетесь какая переменная как объявлена и какой тип данных может хранить и что за значение ей присвоено. Поэтому лучше всего давать переменным осмысленные имена и следовать соглашению об именовании переменных. Что за соглашение? Все очень просто: перед основным названием переменной ставится префикс, указывающий на тип данных, который мы предполагаем хранить в данной переменной. Про имеющиеся типы данных я уже рассказал выше. А ниже приведена примерная таблица соответствий префиксов типам данных:
Префикс | Тип хранимых данных |
---|---|
b | Boolean |
bt | Byte |
i | Integer |
l | Long |
s | Single |
d | Double |
c | Currency |
dt | Date |
str | String |
obj | Object |
v | Variant |
Лично я немного для себя её переделал, т.к. некоторые обозначения мне кажутся скудными. Например Double я обозначаю как dbl, а Single как sgl. Это мне кажется более наглядным.
В чем еще плюс явного указания префикса данных. В VBA есть такие операторы как Def, при помощи которых можно указать тип данных по умолчанию для переменных, первая буква имени которых попадает в заданный в операторе диапазон. Например:
DefBool B Sub test() Dim bCheck End Sub
Автоматически переменной bCheck будет присвоен тип Boolean, т.к. она начинается с буквы b — регистр здесь не имеет значения(впрочем как в VBA в целом). Оператор Def задается в области объявления. Можно задать не одну букву, а целый диапазон букв:
DefBool B-C Sub test() Dim bCheck, cCheck End Sub
Но я считаю, что одной буквы для одного типа вполне достаточно. Можно задать сразу несколько операторов Def.
DefBool B DefStr S Sub test() Dim bCheck, sCheck End Sub
Ниже приведен полный перечень операторов типов и данные, которые задает каждый из них:
DefBool — Задает тип Boolean
DefByte — Задает тип Byte
DefCur — Задает тип Currency
DefDate — Задает тип Date
DefDbl — Задает тип Double
DefInt — Задает тип Integer
DefLng — Задает тип Long
DefObj — Задает тип Object
DefSng — Задает тип Single
DefStr — Задает тип String
DefVar — Задает тип Variant
По умолчанию в VBA применена инструкция DefVar для всех букв(иначе говоря для всех переменных, которым не назначен тип данных явно через оператор As).
Ну и немаловажный момент это непосредственно осмысленное имя переменной. Имя переменной должно примерно отражать то, что в ней будет храниться. Например, Вы создаете отчет и Вам надо объявить две переменные: одна имя листа, другая имя книги. Можно было сделать так: str1, str2. Коротко, здорово. Но если подумать — и как можно понять, какая из этих переменных что хранит? Никак. Надо просматривать код и вспоминать, какой переменной какое значение было присвоено. Не совсем удобно, правда? А если бы Вы задали имена так: strBookName, strSheetName, то вроде как более понятно, что мы в них будем хранить. Это удобно не только вам самим при работе с кодом, но и другим людям, которые, возможно в будущем будут пользоваться Вашим кодом. Им будет удобнее читать код, если он будет оформлен грамотно, а переменные названы осмысленно. И не стоит экономить на длине имени — имя должно быть понятным. Без фанатизма, конечно :-). Хоть VBA и позволяет нам создавать переменные длиной до 254 символов, но читать такую переменную так же неудобно, как и с одним символом. Но здесь уже все зависит от Ваших предпочтений и фантазии.
Небольшое дополнение: лучше привыкать давать названия переменным на латинице(т.е. английский алфавит), т.к. для VBA английский язык «родной» и лучше использовать его.
Sub main() 'объявляем переменные с назначением конкретных типов 'As String - текст 'As Long - целое число Dim sAddress As String, sNewAddress As String, sShName As String Dim lRow As Long Dim rRange as Range 'назначили переменной тип ячейка/диапазон 'присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection 'меняем выделение - выделяем ячейку D9 Range("D9").Select 'назначаем переменной адрес выделенных ячеек sAddress = Selection.Address 'назначаем переменной lRow значение первой строки выделенной области lRow = Selection.Row 'показываем сообщение MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www.excel-vba.ru" MsgBox "Номер первой строки: " & lRow, vbInformation, "www.excel-vba.ru" 'назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" 'выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.excel-vba.ru" 'выделяем изначально выделенную ячейку, используя переменную rRange rRange.Select MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.excel-vba.ru" 'задаем значение переменной sShName = "excel-vba" 'переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName End Sub
Просмотреть пошагово выполнение данного кода поможет статья: Отлов ошибок и отладка кода VBA
Важно! Назначение значений переменным задается при помощи знака равно(=). Однако, есть небольшой нюанс: для переменных типа Object(а так же других объектных типов(Workbook, Worksheet, Range, Cells, Chart и т.п.)) присвоение идет при помощи ключевого оператора Set:
'присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection
это так же называется присвоением ссылки на объект. Почему именно ссылки? Все просто: при помещении в переменную непосредственно ячейки или диапазона(Set var = Range(«A1») или Set rRange = Selection) нет никакого запоминания самой ячейки. В переменную помещается лишь ссылка на эту ячейку(можете считать, что это как ссылка в формулах) со всеми вытекающими: такое назначение не запоминает свойства ячейки до или после — в переменной хранится ссылка на конкретную ячейку и доступ есть исключительно к свойствам ячейки на текущий момент. Чтобы запомнить для этой ячейки значение, цвет или даже адрес (а так же и другие свойства) до её изменения и применить запомненное даже после изменения/перемещения самой ячейки — необходимо запоминать в переменные именно свойства ячейки:
Sub main() Dim val, l_InteriorColor As Long, l_FontColor As Long Dim rRange As Range 'назначили переменной тип ячейка/диапазон 'присвоили переменной rRange ссылку на активную ячейку Set rRange = ActiveCell 'запоминаем свойства ячейки val = rRange.Value 'значение l_InteriorColor = rRange.Interior.Color 'цвет заливки l_FontColor = rRange.Font.Color 'цвет шрифта 'копируем другую ячейку и вставляем на место активной ActiveSheet.Range("D1").Copy rRange 'проверяем, что rRange теперь имеет совершенно другие свойста - как у D1 MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.excel-vba.ru" 'назначаем свойства из сохраненных в переменных rRange.Value = val 'значение rRange.Interior.Color = l_InteriorColor 'цвет заливки rRange.Font.Color = l_FontColor 'цвет шрифта 'проверяем, что rRange возвращены параметры до копирования MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.excel-vba.ru" End Sub
Это так же распространяется на все другие объекты. Т.е. те переменные, значения которым назначаются через оператор Set.
Для других же типов Set не нужен и в переменную значение заносится без этих нюансов.
Так же есть и иной вид «переменных» — константы. Это такая же переменная, только(как следует из её названия) — она не может быть изменена во время выполнения кода, т.к. является величиной постоянной и значение её назначается только один раз — перед выполнением кода.
Const sMyConst As String = "Имя моей программы"
Константам могут быть назначены данные тех же типов, что и для переменных, за исключением типа Object, т.к. Object это всегда ссылка на объект, который как правило обладает «динамическими»(т.е. обновляющимися) свойствами. А изменение для констант недопустимо.
Для дополнительной области видимости/жизни констант используется только Public. Если область видимости не указана, то константа будет доступна только из того модуля, в котором объявлена. Здесь обращаю внимание на то, что Dim уже не используется, т.к. Dim это идентификатор только для переменных. Пару важных отличий объявления констант от объявления переменных:
- при объявлении константы необходимо обязательно указывать явно, что это константа ключевым словом Const
- сразу в момент объявления необходимо назначить константе значение: = «Имя моей программы»
Во всем остальном объявление и применение констант идентично объявлению переменных. Коротко приведу пару примеров.
Если константа объявлена внутри процедуры:
Sub TestConst() Const sMyConst As String = "Имя моей программы" MsgBox sMyConst 'показываем сообщение с именем программы End Sub
то она не может быть использована в другой процедуре:
Sub TestConst() Const sMyConst As String = "Имя моей программы" MsgBox sMyConst 'показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst 'вызовет ошибку Variable not defined End Sub
Чтобы использовать одну константу во всех процедурах модуля(того, в котором она объявлена), необходимо объявить её в области объявлений:
Const sMyConst As String = "Имя моей программы" Sub TestConst() MsgBox sMyConst 'показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst 'уже не вызовет ошибку Variable not defined End Sub
Чтобы использовать одну константу во всех процедурах проекта(книги), необходимо объявить её как Public:
Public Const sMyConst As String = "Имя моей программы" Sub TestConst() MsgBox sMyConst 'показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst 'не вызовет ошибку Variable not defined, даже если процедура в другом модуле End Sub
Подробнее можно прочитать выше — как я уже писал для констант применяются те же правила, что и для переменных.
Также см.:
Variable not defined или что такое Option Explicit и зачем оно нужно?
Что такое модуль? Какие бывают модули?
Что такое макрос и где его искать?
Отлов ошибок и отладка кода VBA
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика