Je veux faire ça mais ça ne compilera pas:
Public MyVariable as Integer = 123
Quel est le meilleur moyen d'y parvenir?
.NET nous a gâtés:) Votre déclaration n’est pas valable pour VBA.
Seules les constantes peuvent recevoir une valeur lors du chargement de l'application. Vous les déclarez comme suit:
Public Const APOSTROPHE_KEYCODE = 222
Voici un exemple de déclaration d'un de mes projets vba:
Si vous recherchez quelque chose pour lequel vous déclarez une variable publique, puis souhaitez initialiser sa valeur, vous devez créer un sous-programme Workbook_Open et y effectuer votre initialisation. Exemple:
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
Assurez-vous de déclarer le sous-objet dans l'objet de classeur lui-même:
Juste pour vous offrir un angle différent -
Je trouve que ce n'est pas une bonne idée de maintenir des variables publiques entre les appels de fonction. Toutes les variables que vous devez utiliser doivent être stockées dans Subs et Functions et transmises en tant que paramètres. Une fois que le code est terminé, vous ne devez pas vous attendre à ce que le projet VBA maintienne les valeurs de toutes les variables.
La raison en est qu’il ya tout un tas de choses qui peuvent réinitialiser par inadvertance le projet VBA tout en utilisant le classeur. Lorsque cela se produit, toutes les variables publiques sont réinitialisées à 0.
Si vous souhaitez qu'une valeur soit stockée en dehors de vos sous-programmes et fonctions, il est vivement recommandé d'utiliser une feuille de calcul masquée avec des plages nommées pour toute information devant rester persistante.
Bien sûr, vous savez, mais si c'est une constante, alors const MyVariable as Integer = 123
sinon votre chance la variable doit se voir attribuer une valeur initiale ailleurs.
Vous pourriez:
public property get myIntegerThing() as integer
myIntegerThing= 123
end property
Dans un module de classe, créez-le globalement;
public cMyStuff as new MyStuffClass
Donc, cMyStuff.myIntegerThing
est disponible immédiatement.
Voici ce que je fais quand j'ai besoin de constantes globales initialisées:
1. Ajouter un module appelé Globals
2. Ajoutez des propriétés comme celle-ci dans le module 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
Vous pouvez définir la variable dans les déclarations générales, puis l'initialiser dans le premier événement déclenché dans votre environnement.
Vous pouvez également créer vous-même une classe avec les propriétés pertinentes et les initialiser dans la méthode Initialise.
Comme indiqué ci-dessus, pour déclarer des variables globales accessibles, vous pouvez le faire en dehors des fonctions précédées du mot-clé public.
Et, puisque l'affectation n'est PAS AUTORISÉE en dehors des procédures, vous pouvez, par exemple, créer un sous-fichier appelé InitGlobals qui initialise vos variables publiques, puis vous appelez simplement ce sous-programme au début de vos instructions
En voici un exemple:
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