Можно ли объявить открытую переменную в VBA и назначить значение по умолчанию? - PullRequest
46 голосов
/ 05 мая 2011

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

Public MyVariable as Integer = 123

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

Ответы [ 8 ]

94 голосов
/ 05 мая 2011

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

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

Public Const APOSTROPHE_KEYCODE = 222

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

VBA Constant Image

Если вы ищете что-то, где вы объявляете открытую переменную, а затем хотите инициализировать ее значение, вам нужно создать подпрограмму 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

Убедитесь, что вы объявляете подпрограмму в самом объекте рабочей книги: enter image description here

9 голосов
/ 05 мая 2011

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

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

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

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

8 голосов
/ 05 мая 2011

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

Вы могли бы:

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

В модуле Class создайте его глобально;

public cMyStuff as new MyStuffClass

Так что cMyStuff.myIntegerThing доступен немедленно.

2 голосов
/ 11 июля 2016

Это то, что я делаю, когда мне нужны инициализированные глобальные константы:
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 голос
/ 11 августа 2015

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

И, поскольку влияние НЕ РАЗРЕШАЕТСЯ вне процедур, вы можете, например, создатьsub называется 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 голос
/ 05 мая 2011

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

Кроме того, вы можете создать класс с соответствующими свойствами и инициализировать их в методе Initialise

0 голосов
/ 29 октября 2013

Прошло довольно много времени, но это может вас удовлетворить:

Public MyVariable as Integer: MyVariable = 123

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

0 голосов
/ 05 мая 2011

Это было давно, но я верю, что это будет:

Public MyVariable as Integer
MyVariable = 123
...