Я хочу сделать это, но он не будет компилироваться:
Public MyVariable as Integer = 123
Какой лучший способ достичь этого?
Я хочу сделать это, но он не будет компилироваться:
Public MyVariable as Integer = 123
Какой лучший способ достичь этого?
.NET испортил нам:) Ваше объявление недействительно для VBA.
Только константы могут быть заданы при загрузке приложения. Вы объявляете их так:
Public Const APOSTROPHE_KEYCODE = 222
Вот пример объявления из одного из моих проектов vba:
Если вы ищете что-то, где вы объявляете общедоступную переменную, а затем хотите инициализировать ее значение, вам необходимо создать подменю 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 в самом документе рабочей книги:
Просто чтобы предложить вам другой угол -
Мне нехорошо поддерживать постоянные переменные между вызовами функций. Любые переменные, которые необходимо использовать, должны храниться в Subs и Functions и передаваться как параметры. Как только код будет выполнен, вы не должны ожидать, что VBA Project будет поддерживать значения любых переменных.
Причиной этого является то, что есть просто огромное количество вещей, которые могут непреднамеренно reset VBA Project при использовании рабочей книги. Когда это произойдет, любые общедоступные переменные получат reset до 0.
Если вам нужно значение, которое будет храниться вне ваших подсайтов и функций, я настоятельно рекомендую использовать скрытый рабочий лист с именованными диапазонами для любой информации, которая должна сохраняться.
Конечно, вы знаете, но если это константа, то const MyVariable as Integer = 123
иначе вам не повезло; переменной должно быть присвоено значение в другом месте.
Вы можете:
public property get myIntegerThing() as integer
myIntegerThing= 123
end property
в модуле класса, затем глобально создайте его;
public cMyStuff as new MyStuffClass
Итак, cMyStuff.myIntegerThing
доступен сразу.
Вы можете определить переменную в общих объявлениях, а затем инициализировать ее в первом событии, которое срабатывает в вашей среде.
В качестве альтернативы вы можете создать себе класс с соответствующими свойствами и инициализировать их в методе Initialize
Как сказано выше, Чтобы объявить глобальные доступные переменные, вы можете сделать это за пределами функций, которым предшествует ключевое слово 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. Добавьте модуль под названием 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
Это было какое-то время, но я считаю, что это будет:
Public MyVariable as Integer
MyVariable = 123
Это было довольно долгое время, но это может вас удовлетворить:
Public MyVariable as Integer: MyVariable = 123
Это немного уродливо, так как вам нужно перепечатать имя переменной, но это на одной строке.