VBA Tutorial => Attributes

Vba excel глобальные переменные Урок 5 по VBA – Объявление локальных и глобальных переменных В данной статье мы рассмотрим работу с локальными и

Syntax

  • Attribute VB_Name = “ClassOrModuleName”
  • Attribute VB_GlobalNameSpace = False ‘ Ignored
  • Attribute VB_Creatable = False ‘ Ignored
  • Attribute VB_PredeclaredId = {True | False}
  • Attribute VB_Exposed = {True | False}
  • Attribute variableName.VB_VarUserMemId = 0 ‘ Zero indicates that this is the default member of the class.
  • Attribute variableName.VB_VarDescription = “some string” ‘ Adds the text to the Object Browser information for this variable.
  • Attribute procName.VB_Description = “some string” ‘ Adds the text to the Object Browser information for the procedure.
  • Attribute procName.VB_UserMemId = {0 | -4}
    • ‘ 0: Makes the function the default member of the class.
    • ‘ -4: Specifies that the function returns an Enumerator.

Урок 5 по VBA — Объявление локальных и глобальных переменных

В данной статье мы рассмотрим работу с локальными и глобальными переменными VBA языка, а именно: как ведут себя переменные, объявленные в блоке модуля и в блоке отдельной процедуры; познакомимся с ключевыми словами Public, Private и Static; Определим логику назначении типов данных при объявлении нескольких переменных в одной строке; напишем парочку примеров.

VBA_5.png

В прошлых статьях мы кратко рассмотрели переменные и типы данных, теперь настало время более подробно вникнуть во все тонкости…

3 ответа

Вы уже выполняете макрос и каким-то образом остановили его выполнение (например, из-за необработанной ошибки или из-за того, что вы нажали Ctrl – Break во время выполнения). В этом состоянии вы не можете выполнить другой макрос.

В редакторе Visual Basic вам нужно нажать кнопку «Стоп»:введите описание изображения здесь

Затем вы можете запустить макрос.

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

И вы должны проверить, является ли значение в ячейке числовым. Пример

Sub add() If IsNumeric(Selection.Value) Then Selection.Value = Selection.Value + 1 Else MsgBox (“Not a value selected”) End IfEnd Sub

Sub Lower() Range (“e3”), Value = Range(“e3”), Value – 1End SubSub Higher() Range (“e3”), Value = Range(“e3”), Value + 1End Sub

Объявление нескольких переменных VBA

Рассмотрим такой пример: надо объявить три переменные разного типа, например, Byte, String и Long, это может выглядеть так:

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

Тут A и В будут типа Variant и только C – Long. Что бы все правильно сработало, нам нужно каждой переменной назначить заданный тип:

Объявление переменных в VBA локальной и глобальной видимости

Если переменная VBA объявлена в начале модуля, то она сохраняется в памяти до тех пор, пока работает макрос, если объявление происходит в теле процедуры, то переменная будет удалена из памяти сразу, после выполнения блока кода заданной процедуры. Добавьте в редакторе Visual Basic новую форму и модуль.

Параметры формы: разместите на форме три компонента Label и три кнопки, как показано на рисунке. Имя формы (свойство Name) – VariableForm, имя модуля – VariableModule.

В редакторе кода для модуля пропишите:

Тут мы просто определяем, что при запуске макроса нужно запустить форму.

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

В самом начале мы объявляем глобальную переменную VBA – GVar типа Integer, в комментарии указано, что вне процедуры присвоить значение переменной нельзя. Далее следуют три процедуры, в первой процедуре происходит увеличение значение глобальной GVar на 5, результат будет записываться в свойство Caption первого компонента Label. Вторя и третья процедуры производят аналогичные действия, только для объявленных в них локальных переменных VBA, LVar, происходит увеличение значения на 2 и на 3, соответственно. События Click (нажатие кнопки мыши) для кнопок будет вызывать заданные процедуры.

VBA-form-5.png

При запуске макроса в полях будут отображаться значения 5, 2 и 3. При нажатии на “Кнопка 1” будет происходить вызов процедуры GetGlobal и увеличение значения переменной GVar на 5. Для “Кнопка 2” и “Кнопка 3” будут вызываться процедуры GetLocal_1 и GetLocal_2, однако ничего увеличиваться не будет, так как переменные LVar являются локальными и при каждом вызове заданных процедур их значение будет обнуляться.

Глобальные переменные в VBA со значениями

5 Thomas [2017-03-17 23:18:00]

Я работаю над файлом Excel с несколькими подписчиками, которые независимы друг от друга. Но они все равно используют одни и те же переменные с одинаковыми значениями все время. Поэтому я хотел бы определить переменную глобально, но то, что я нашел довольно легко, было только объявить их глобально. Что мне нужно сделать, чтобы я мог также заполнить переменную значениями с самого начала? Возможно ли, что переменные определены с самого начала, не имея необходимости писать суб, что-то вроде приведенного ниже примера? (Я считаю, что это невозможно, или я не прав?)

Буду признателен за вашу помощь!

vba excel-vba excel

3 Решение Amorpheuses [2017-03-17 23:25:00]

Вы можете определить их в модуле как общедоступные переменные, а затем установить их в Workbook_Open в модуле ThisWorkBook (где листы перечислены в редакторе MS Visual Basic):

Этот метод выполняется всякий раз, когда электронная таблица сначала открывается.

5 Macro Man [2017-03-17 23:36:00]

Возможно ли, что переменные определены с самого начала без необходимости писать суб?

Нет, вы можете получить/установить значение переменной внутри вспомогательной процедуры или функции.

С одной стороны, ваш текущий код:

объявляет s1 и s2 как Variant и s3 как Worksheet — это распространенное заблуждение в VBA, которое можно объявить несколькими переменными того же типа таким образом.

Правильный способ сделать это в одной строке в VBA:

Я бы сказал то же самое для второй строки, но вы все равно объявили это как вариант.

3 Vmesser [2017-03-17 23:27:00]

Вы должны заполнить их внутри события Workbook_Open . Перейдите в модуль ThisWorkbook и напишите:

Это событие вызывается, когда вы открываете WorkBook.

0 dee [2017-03-19 05:04:00]

Если вы хотите использовать эти значения, такие как constants , которые будут иметь одинаковое значение все время, вы все равно можете определить их как private членов класса ThisWorkbook и реализовать свойство get , которое перенастраивает значение и гарантирует, что значение определено.

Преимущество этого решения состоит в том, что никто, кроме объекта ThisWorkbook , не может изменять значения этих переменных. Это не относится к общедоступным глобальным переменным, потому что кто-то может случайно, например. установите workbook1 на Nothing , и поскольку Workbook_Open запускается только один раз с самого начала, произойдет ошибка при доступе workbook1 . ИМО для использования переменных global в основном не является хорошей идеей. НТН

Модуль класса ThisWorkbook:

Тогда всюду в книге просто вызовите свойство на ThisWorkbook , например. как это.

Vba excel глобальные переменные

By using our site, you acknowledge that you have read and understand our Cookie Policy, Privacy Policy, and our Terms of Service.

How do I declare a global variable in VBA?

I wrote the following code:

And I get the error message:

«invalid attribute in Sub or Function»

Do you know what I did wrong?

I tried to use Global instead of Public , but got the same problem.

I tried to declare the function itself as `Public, but that also did no good.

What do I need to do to create the global variable?

sm6MV.jpg

You need to declare the variables outside the function:

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:

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.

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.

Как объявить глобальные переменные в Excel VBA видимыми в рабочей книге

У меня есть вопрос о глобальной области действия и абстрагирован проблема на простой пример:

В книге Excel: В Лист1 у меня есть две (2) кнопки. Первый помечен как SetMe и связан с подпрограммой в Лист1 модуль : Код Sheet1:

Вторая помечена как ShowMe и связана с подпрограммой в модуле ThisWorkbook : Код этой книги:

Нажав SetMe , вы получите компилятор error: variable not defined . Когда я создаю отдельный модуль и перемещаю объявление Global1 , все работает.

Итак, мой вопрос: Все, что я прочитал, гласит, что глобальные переменные, объявленные в верхней части модуля, вне любого кода должны быть видны всем модулям проекта. Ясно, что это не так. Если мое понимание модуля неверно. Объекты Sheet1 , Sheet2 , ThisWorkbook . которые поставляются с рабочей книгой: это не модули, способные объявлять переменные в глобальной области?

Или это единственное место, где можно объявить глобальное, в отдельном модуле типа Модули .

Ваш вопрос: это не модули, способные объявлять переменные в глобальной области?

Ответ: ДА, они «способны»

Единственным моментом является то, что ссылки на глобальные переменные в этой книге или на листе должны быть полностью квалифицированными (т.е. называемыми ThisWorkbook.Global1 , например) Ссылки на глобальные переменные в стандартном модуле должны быть полностью квалифицированы только в случае двусмысленности (например, если имеется более одного стандартного модуля, определяющего переменную с именем Global1, и вы хотите использовать ее в третьем модуле).

Например, место в коде Sheet1

место в коде этой книги

и в стандартном модуле

Все три подпрограммы работают нормально.

PS1: Этот ответ основан, в основном, на информации от здесь. Очень стоит прочитать (от великого Чипа Пирсона).

PS2: Ваша строка Debug.Print («Hello») даст вам ошибку компиляции Invalid outside procedure .

PS3: Вы можете (частично) проверить свой код с помощью Debug → Скомпилировать VBAProject в редакторе VB. Будут появляться все ошибки компиляции.

PS5: Возможно, вы не сможете объявить глобальную переменную в, скажем, Sheet1, и использовать ее в коде из другой книги (чтение http://msdn.microsoft.com/en-us/library/office/gg264241%28v=office.15%29.aspx#sectionSection0, я не проверял этот момент, поэтому этот вопрос еще не подтвержден как таковой). Но вы все равно не хотите делать это в своем примере.

PS6: Есть несколько случаев, которые приводят к двусмысленности в случае не полностью квалифицирующих глобальных переменных. Вы можете немного помахать, чтобы найти их. Они являются ошибками компиляции.

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...