Задать глобальную переменную vba excel

Обновлено: 05.07.2024

Я попытался использовать Global вместо Public , но возникла та же проблема.

Я попытался объявить саму функцию как Public, но это тоже не помогло.

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

Вам нужно объявить переменные вне функции:

Если вы хотите, чтобы переменные действовали только в течение всего времени существования функции, используйте Dim (сокращение от Dimension ) внутри функции или подпрограммы для объявления переменных:

глобальная переменная (как указал SLaks) объявляется вне функции с помощью ключевого слова Public . Эта переменная будет доступна в течение всего срока службы вашего запущенного приложения. В случае Excel это означает, что переменные будут доступны, пока открыта конкретная книга Excel.

Вы также можете иметь переменные, которые доступны только в определенном модуле (или классе), объявив их с помощью ключевого слова Private .

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

Чтобы использовать глобальные переменные, вставьте новый модуль из пользовательского интерфейса проекта VBA и объявите переменные с помощью Global

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

Вкратце, рассмотрим этот «модуль»:

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

Еще две быстрые вещи:

  1. Будьте организованы при использовании переменных уровня книги, чтобы не запутать ваш код. Отдайте предпочтение функциям (с правильными типами данных) или передаче аргументов ByRef .
  2. Если вы хотите, чтобы переменная сохраняла свое значение между вызовами, вы можете использовать оператор Static .

Если эта функция находится в модуле / классе, вы можете просто написать их вне функции, поэтому она будет иметь Global Scope . Глобальная область действия означает, что к переменной может получить доступ другая функция в том же модуле / классе (если вы используете dim как оператор объявления, используйте public , если хотите, чтобы переменные могли быть доступны для всех функций во всех модулях):

Также вы можете использовать -

Протестировано в Office 2010

Создайте публичное целое число в Общей декларации.

Тогда в своей функции вы можете каждый раз увеличивать ее значение. См. Пример (функция сохранения вложений электронного письма в формате CSV).

Хороший способ создания общедоступных / глобальных переменных - рассматривать форму как объект класса, объявлять свойства и использовать Public Property Get [переменная] для доступа к свойству / методу. Также вам может потребоваться указать или передать ссылку на созданный модуль формы. Вы получите ошибки, если вызовете методы для закрытых форм / отчетов.
Пример: передать Me.Form.Module.Parent в подпрограмму / функцию не внутри формы.

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

Если вы используете Late Binding, как я, всегда проверяю значения Null и объекты, которые Nothing, прежде чем пытаться выполнить какую-либо обработку.


Мы обычно объявляем любую переменную, используя слово DIM, и это лучший прямой способ сделать это. Но переменные, объявленные с использованием DIM, могут использоваться только в одном модуле. Если мы попытаемся использовать эту переменную, определенную с помощью DIM, она будет применима для модуля, в котором она объявлена. Что если мы хотим использовать переменную в любом модуле или проекте? Что не может быть возможным, если мы продолжаем использовать DIM для определения этой переменной?

В этом случае у нас есть вторичная опция, определяющая переменную по слову Global или Public в VBA. Глобальные или публичные переменные VBA - это те переменные, которые объявлены в начале подкатегории с помощью Option Explicit. Что бы мы ни делали или не могли делать в подкатегориях, они выполняются до этого в Option Explicit.

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

Ниже приведены различные примеры объявления глобальной переменной в Excel с использованием кода VBA.

Вы можете скачать этот шаблон Excel для глобальных переменных VBA здесь - Шаблон Excel для глобальных переменных VBA

VBA Global Variables - Пример № 1

В этом примере мы увидим, как различные подкатегории могут использоваться как один модуль без использования глобального или открытого слова для определения какой-либо переменной. Для этого нам понадобится модуль.

  • Перейдите в меню « Вставка» и нажмите « Модуль», как показано ниже.


  • Теперь введите подкатегорию под любым именем, как показано ниже.

Код:


  • Теперь используйте DIM для определения любой переменной. Здесь мы выбрали алфавит A в качестве строки .

Код:


  • Теперь создайте другую подкатегорию в том же модуле, как показано ниже.

Код:


  • Теперь во второй подкатегории определите другую переменную B, используя DIM в качестве String.

Код:


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

  • Теперь, чтобы сделать это, напишите Option Explicit над первой подкатегорией, как показано ниже.

Код:


  • Теперь мы можем определить нашу переменную, которая будет использоваться в обеих подкатегориях, которые у нас есть ниже. Итак, теперь рассмотрим запись любой переменной, скажем, A как String, используя DIM.

Код:


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

VBA Global Variables - Пример № 2

В этом примере мы увидим, как использовать Global или Public word для определения любой переменной в Excel VBA. Для этого мы будем использовать код, который мы видели в примере-1.

Мы будем использовать нижнюю часть кода для объявления глобальной или публичной переменной.

Код:


Как мы это делали в примере 1, где мы объявили общую переменную, которая будет использоваться в обеих подкатегориях, под Option Explicit. В этом примере мы также объявим глобальную переменную под явным вариантом.

Поскольку у нас уже есть готовый код, мы можем напрямую объявить переменные, используя Global . Теперь в приведенном ниже параметре Explicit напишите Global так же, как мы использовали для DIM, и выберите переменную по выбору. Здесь мы выбираем алфавит A, как показано ниже.

Код:


Теперь мы выбираем переменную любого типа. Как мы уже использовали String в приведенном выше примере, мы бы тоже использовали это здесь.

Код:


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

Код:


Теперь давайте назначим некоторый текст определенной переменной A в обеих подкатегориях. Мы выбираем «Test1» и «Test2» для переменной A в обеих подкатегориях, как показано ниже. А также мы выбрали MsgBox, чтобы показать значения, хранящиеся в переменной A.

Код:


Теперь запустите код, нажав клавишу F5 или нажав кнопку воспроизведения, чтобы увидеть результат.

Вот как мы можем создать и определить переменную один раз с помощью Global, и это можно использовать в любом модуле, любом классе и в любом проекте. Мы также можем использовать Public вместо Global, как показано ниже. И это даст тот же результат, который мы получили при использовании Global.

Код:


Плюсы VBA Global Variable

  • Это экономит время при объявлении нескольких переменных, когда мы знаем, что нам может потребоваться снова определить переменные одного и того же типа в разных модулях или подкатегориях.
  • Используя Global или Public в определении переменной процесса, наш код становится меньше, экономя время и пространство.
  • Это уменьшает сложность, когда мы пишем огромный код, и может запутаться в использовании разных переменных в разных модулях или подкатегориях.

Минусы VBA Global Variable

  • Если мы внесем какие-либо изменения в глобальную переменную, то эти изменения будут реализованы во всех местах ее использования, что приведет к проблеме в функциональности написанного кода.

То, что нужно запомнить

  • Global и Public могут использоваться взаимозаменяемо с одинаковыми функциями.
  • Если мы не хотим использовать глобальную переменную, мы можем следовать процессу, как показано в примере 1, для определения переменной. Но это будет ограничено тем же модулем.
  • Глобальные переменные могут использоваться в любом модуле, любой подкатегории, любом классе или в любом проекте.
  • Глобальная переменная дает вывод кода, в котором мы сохранили курсор. Он не будет запускать полный код за один раз, передавая все выходные по одному.

Рекомендуемые статьи

Это руководство по глобальным переменным VBA. Здесь мы обсудим, как объявлять глобальные переменные в Excel, используя код VBA, а также некоторые практические примеры и загружаемый шаблон Excel. Вы также можете просмотреть наши другие предлагаемые статьи -

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

объявление переменных в vba

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

Объявление нескольких переменных 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 переменных

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

Мы просто изменили ключевое слово Dim на Static, и теперь переменные LVar не будут удаляться из памяти после выполнения процедур. Объявление переменных в VBA. Обратите внимание, что мы объявили переменные с одним именем, это можно, так как они находятся в отдельных процедурах.

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

Как объявить глобальную переменную?
Угораздило установить Офис2003. :-/ неужели нельзя больше использовать необъявленные.

Где объявить переменную в цикле?
Есть код For x = 1 To UBound(arrTik) adrURL =.

Как и где объявить строковую переменную, которая будет использоваться во всем проекте?
Как и где объявить строковую переменную, которая будет использоваться во всем проекте и оставлять.

Как объявить переменную глобально?
Есть первый макрос, который сохраняет определенный текст в файл! Путь к файлу хранится в.

после всех OPTION . если они есть
в обычном модуле пишем

В декларации модуля

после всех OPTION . если они есть
в обычном модуле пишем

Ошибка: "Variable not defined". Или что не так?

Добавлено через 3 минуты

В декларации модуля

Какого именно модуля? Их много, нужно чтобы эту переменную видели все модули.

Решение

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

Решение

1) создайте в 1-м модуле

Бляхирев, вам надо переменную между userform и модулем?

1) создайте в 1-м модуле

Да я и не сомневаюсь. Если правильно всё сделано, то после выполнения кода из второго модуля, код в третьем должен вывести 10.
Это если всё правильно. Бляхирев про это ничего не сказал, файл никто не видел.

Ребят, у меня после окончания процедуры сохранилась в памяти глобальная переменная
Это разве законно?

В начале модуля

Так вот, в самом начале макроса, первым делом прописал:
Так вот, если я запускаю макрос без условия тригера

При следующем запуске макроса пишет, что переменная ничему не ровна

Но стоит затригерить и присвоить

То есть он у него в памяти остался таким, ведь никаких действий вообще не было предпринято для тригера

Это что же получается, нужно постоянно в конце макроса присваивать переменным нулевые значения?
А если у меня таких глобальных переменных 70?!


Или мне необходимо объявлять в модуле переменные, как static?
Я просто не могу сейчас проверить

других альтернатив отслеживания выполнения или не выполнения действий макросами я не знаю, так что 70, это скорее всего даже меньше, чем есть на самом деле, обрабатывается под 100 разных файлов, это точно blackfisk, а где-то в описании языка VB гарантируется, что при выделении памяти под переменную, она будет автоматически обнулена? А то, может я что-то упустил из-за того, что самоучка. Насколько мне помнится, со времен БЭСМов правильным тоном в программировании было обязательно задать переменной начальное значение перед использованием. И о смене парадигмы, даже с появлением типа Variant, я не слышал. Поскольку сейчас все файлы и макросы excel запускает в одном окне, мне кажется логичным, что переменная, описанная как глобальная, видна во всех макросах данного excel-объекта. Мало того, возможное изменение типа и значения этой переменной в другом макросе, если название совпадает, вполне вписывается в эту концепцию "одного окна". Вообще глобальные переменные для того и существуют, чтоб они жили пока открыто приложение.

Как объявить переменную и записать в нее диапазон значений
Добрый день подскажите пожалуйста. у меня есть макрос. его суть: поиск выбранного значения из.

Как объявить переменную, в которую будут записаны пути ко всем найденным файлам
Здравствуйте, в данном контексте 'папка, в которой происходит поиск файлов с расширением .doc .

Не могу объявить переменную - где библиотека?
Надо: Dim str as Workbook 'Так вот этого Workbook и нету за Workbook отвечает Microsoft Excel.


Как создать глобальную переменную
Как сделать переменную которая будет роботать везде. Везде- в 1 форме и во всех других в данном.

Я попытался использовать Global вместо Public , но получил ту же проблему.

Я попытался объявить эту функцию как "Public", но это тоже не помогло.

Что мне нужно сделать для создания глобальной переменной?

ОТВЕТЫ

Ответ 1

Вам нужно объявить переменные вне функции:

Ответ 2

Если вы хотите, чтобы переменные продолжали всю жизнь функции, используйте Dim (сокращение для измерения) внутри функции или sub, чтобы объявить переменные:

Глобальная переменная (как указывал SLaks) объявляется вне функции, используя ключевое слово Public . Эта переменная будет доступна в течение всего срока действия вашего приложения. В случае с Excel это означает, что переменные будут доступны до тех пор, пока эта книга Excel не будет открыта.

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

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

Ответ 3

Чтобы использовать глобальные переменные, вставьте новый модуль из пользовательского интерфейса проекта VBA и объявите переменные с помощью Global

Ответ 4

Вопрос действительно о размахе, как сказал другой парень.

Вкратце рассмотрим этот "модуль":

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

Две другие быстрые вещи:

  1. Будьте организованы при использовании переменных уровня книги, чтобы ваш код не запутался. Предпочитают функции (с правильными типами данных) или передают аргументы ByRef.
  2. Если вы хотите, чтобы переменная сохраняла свое значение между вызовами, вы можете использовать статический оператор.

Ответ 5

Если эта функция находится в модуле/классе, вы можете просто написать их вне функции, поэтому она имеет Global Scope . Глобальная область видимости означает, что к переменной может быть обращена другая функция в том же модуле/классе (если вы используете dim как выражение объявления, используйте public , если вы хотите, чтобы переменные могли получить доступ ко всем функциям во всех модулях):

Ответ 6

Создать общедоступное целое в общей декларации.

Затем в вашей функции вы можете увеличить ее значение каждый раз. См. Пример (функция сохранения прикреплений электронной почты как CSV).

Ответ 7

Хороший способ создания переменных Public/Global - это обрабатывать форму как объект класса, объявлять свойства и использовать открытое свойство Get [variable] для доступа к свойству/методу. Также вам может понадобиться сослаться на ссылку или передать ссылку на инстанцированный модуль Form. Вы получите ошибки, если будете вызывать методы для закрытых форм/отчетов.
Пример: передать Me.Form.Module.Parent в sub/function, а не внутри формы.

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

Если вы используете Late Binding, как я, всегда проверяйте нулевые значения и объекты, которые являются Nothing, прежде чем пытаться выполнить какую-либо обработку.

Читайте также: