Можно ли объявить открытую переменную в VBA и назначить значение по умолчанию?

37

Я хочу сделать это, но он не будет компилироваться:

Public MyVariable as Integer = 123

Какой лучший способ достичь этого?

  • 0
    Где этот VBA работает? Excel, Access, Word ...
  • 0
    @DuncanHowe Я надеялся на общее решение VBA.
Показать ещё 1 комментарий
Теги:

8 ответов

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

.NET испортил нам:) Ваше объявление недействительно для VBA.

Только константы могут быть заданы при загрузке приложения. Вы объявляете их так:

Public Const APOSTROPHE_KEYCODE = 222

Вот пример объявления из одного из моих проектов vba:

Изображение 3770

Если вы ищете что-то, где вы объявляете общедоступную переменную, а затем хотите инициализировать ее значение, вам необходимо создать подменю Workbook_Open и выполнить там свою инициализацию. Пример:

Private Sub Workbook_Open()
  Dim iAnswer As Integer

  InitializeListSheetDataColumns_S
  HideAllMonths_S

  If sheetSetupInfo.Range("D6").Value = "Enter Facility Name" Then
    iAnswer = MsgBox("It appears you have not yet set up this workbook.  Would you like to do so now?", vbYesNo)
    If iAnswer = vbYes Then
      sheetSetupInfo.Activate
      sheetSetupInfo.Range("D6").Select
      Exit Sub
    End If
  End If

  Application.Calculation = xlCalculationAutomatic
  sheetGeneralInfo.Activate
  Load frmInfoSheet
  frmInfoSheet.Show


End Sub

Удостоверьтесь, что вы объявили sub в самом документе рабочей книги: Изображение 3771

  • 7
    +1 за очень графический / педагогический дух вашего ответа!
8

Просто чтобы предложить вам другой угол -

Мне нехорошо поддерживать постоянные переменные между вызовами функций. Любые переменные, которые необходимо использовать, должны храниться в Subs и Functions и передаваться как параметры. Как только код будет выполнен, вы не должны ожидать, что VBA Project будет поддерживать значения любых переменных.

Причиной этого является то, что есть просто огромное количество вещей, которые могут непреднамеренно reset VBA Project при использовании рабочей книги. Когда это произойдет, любые общедоступные переменные получат reset до 0.

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

4

Конечно, вы знаете, но если это константа, то const MyVariable as Integer = 123 иначе вам не повезло; переменной должно быть присвоено значение в другом месте.

Вы можете:

public property get myIntegerThing() as integer
myIntegerThing= 123
end property

в модуле класса, затем глобально создайте его;

public cMyStuff as new MyStuffClass

Итак, cMyStuff.myIntegerThing доступен сразу.

  • 0
    Лучше было бы добавить модуль и определить эти свойства внутри этого модуля. Я создаю модуль с именем Globals и определяю Property Get внутри этого модуля, и он работает как шарм. Свойство Get PSIStartRow () в виде целого числа PSIStartRow = Sheets ("FOB Prices"). Range ("F1"). Значение свойства свойства End. Get PSIStartCell () As String PSIStartCell = "B" & PSIStartRow End Property.
  • 0
    Код был искажен в приведенном выше комментарии. Я опубликую это ниже.
1

Это то, что я делаю, когда мне нужно инициализировать глобальные константы:
1. Добавьте модуль под названием Globals
2. Добавьте такие свойства в модуль Globals:

Property Get PSIStartRow() As Integer  
    PSIStartRow = Sheets("FOB Prices").Range("F1").Value  
End Property  
Property Get PSIStartCell() As String  
    PSIStartCell = "B" & PSIStartRow  
End Property
1

Как сказано выше, Чтобы объявить глобальные доступные переменные, вы можете сделать это за пределами функций, которым предшествует ключевое слово public.

И, поскольку аффектация НЕ РАЗРЕШЕНА вне процедур, вы можете, например, создать подзаголовок InitGlobals, который инициализирует ваши общедоступные переменные, тогда вы просто вызываете эту подпрограмму в начале ваших утверждений.

Вот пример:

Public Coordinates(3) as Double
Public Heat as double
Public Weight as double

Sub InitGlobals()
    Coordinates(1)=10.5
    Coordinates(2)=22.54
    Coordinates(3)=-100.5
    Heat=25.5
    Weight=70
End Sub

Sub MyWorkSGoesHere()
    Call InitGlobals
    'Now you can do your work using your global variables initialized as you wanted them to be.
End Sub
1

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

В качестве альтернативы вы можете создать себе класс с соответствующими свойствами и инициализировать их в методе Initialize

0

Это было довольно долгое время, но это может вас удовлетворить:

Public MyVariable as Integer: MyVariable = 123

Это немного уродливо, так как вам нужно перепечатать имя переменной, но это на одной строке.

  • 3
    Выдает ошибку компиляции: недопустимо вне процедуры
-2

Это было какое-то время, но я считаю, что это будет:

Public MyVariable as Integer
MyVariable = 123
  • 5
    Боюсь, это тоже не компилируется. Похоже, это было слишком долго!
  • 7
    В частности, Public объявления должны быть вне подпрограмм ( Sub или Function ), присваивания значений внутри .

Ещё вопросы

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