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

81

Я написал следующий код:

Function find_results_idle()

    Public iRaw As Integer
    Public iColumn As Integer
    iRaw = 1
    iColumn = 1

И я получаю сообщение об ошибке:

"недопустимый атрибут в Sub или Function"

Знаете ли вы, что я сделал не так?

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

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

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

Теги:
scope
excel-vba
global-variables

6 ответов

132
Лучший ответ

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

Public iRaw As Integer
Public iColumn As Integer

Function find_results_idle()
    iRaw = 1
    iColumn = 1
83

Это вопрос о scope.

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

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

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

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.

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

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

  • 3
    +1 Еще полезно 7 лет спустя. Но есть ли какой-то дополнительный нюанс в отношении переменных объекта по сравнению с переменными данных? Я столкнулся с проблемой, связанной с областями видимости переменных, которая вызвала новый вопрос. Очень признателен, если вы успеете взглянуть. stackoverflow.com/q/46058096/5457466
  • 2
    Краткое объяснение объявления переменных в VBA.
27

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

Global iRaw As Integer
Global iColumn As Integer
  • 1
    В чем разница между объявлением с Public и Global ключевым словом?
13

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

Dim iRaw As Integer
Dim iColumn As Integer

Function find_results_idle()
    iRaw = 1
    iColumn = 1
End Function

Function this_can_access_global()
    iRaw = 2
    iColumn = 2
End Function
8

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

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

Public Var1 As variant     'Var1 can be used in all
                           'modules, class modules and userforms of 
                           'thisworkbook and will preserve any values
                           'assigned to it until either the workbook
                           'is closed or the project is reset.

Dim Var2 As Variant        'Var2 and Var3 can be used anywhere on the
Private Var3 As Variant    ''current module and will preserve any values
                           ''they're assigned until either the workbook
                           ''is closed or the project is reset.

Sub MySub()                'Var4 can only be used within the procedure MySub
    Dim Var4 as Variant    ''and will only store values until the procedure 
End Sub                    ''ends.

Sub MyOtherSub()           'You can even declare another Var4 within a
    Dim Var4 as Variant    ''different procedure without generating an
End Sub                    ''error (only possible confusion). 

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

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

  • Быть организованным при использовании переменных уровня рабочей книги, поэтому ваш код не запутывается. Предпочитают Функции (с соответствующими типами данных) или передающие аргументы ByRef.
  • Если вы хотите, чтобы переменная сохраняла свое значение между вызовами, вы можете использовать оператор Статический.
  • 0
    Вы уверены, что глобальную переменную можно использовать в разных книгах? Не работает на меня
  • 0
    Хорошая точка зрения! Я заметил, что не добавил ссылку, где я получил эту информацию ... И при этом я не нашел это снова. Лучше отредактировать ответ ... О, и спасибо, Себ.
-2

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

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

Public Numerator As Integer

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim FileName As String

saveFolder = "c:\temp\"

     For Each objAtt In itm.Attachments
            FileName = objAtt.DisplayName & "_" & Numerator & "_" & Format(Now, "yyyy-mm-dd H-mm-ss") & ".CSV"
                      objAtt.SaveAsFile saveFolder & "\" & FileName
                      Numerator = Numerator + 1

          Set objAtt = Nothing
     Next
End Sub

Ещё вопросы

Сообщество Overcoder
Наверх
Меню