web-dev-qa-db-fra.com

Est-il possible de déclarer une variable publique dans vba et d’affecter une valeur par défaut?

Je veux faire ça mais ça ne compilera pas:

Public MyVariable as Integer = 123

Quel est le meilleur moyen d'y parvenir?

43
David

.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:

VBA Constant Image

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: enter image description here

88
ray

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.

9
Alain

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.

7
Alex K.

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
2
Achilles

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.

1
Duncan Howe

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
1
Mohamed YOUNES