62 votes

Est-il possible de déclarer une variable publique en vba et de lui attribuer une valeur par défaut ?

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

Public MyVariable as Integer = 123

Quelle est la meilleure façon d'y parvenir ?

0 votes

Où ce VBA est-il exécuté ? Excel, Access, Word...

0 votes

@DuncanHowe J'espérais une solution vba générique.

4 votes

Les variables globales ne sont-elles plus considérées comme un mal ? J'ai été absent pendant deux semaines en mai, j'ai donc pu manquer quelque chose.

117voto

ray Points 3191

.NET nous a gâtés :) Votre déclaration n'est pas valable pour VBA.

Seules les constantes peuvent recevoir une valeur lors de la charge de l'application. Vous les déclarez comme suit :

Public Const APOSTROPHE_KEYCODE = 222

Voici un exemple de déclaration provenant d'un de mes projets vba :

VBA Constant Image

Si vous souhaitez déclarer une variable publique et ensuite initialiser sa valeur, vous devez créer un sous 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 le Workbook Object lui-même : enter image description here

12voto

Alain Points 10079

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 des sous-fonctions et des fonctions et transmises en tant que paramètres. Une fois le code exécuté, vous ne devez pas vous attendre à ce que le projet VBA maintienne les valeurs des variables.

La raison en est qu'il existe un grand nombre de choses qui peuvent réinitialiser par inadvertance le projet VBA pendant l'utilisation du classeur. Lorsque cela se produit, toutes les variables publiques sont réinitialisées à 0.

Si vous avez besoin qu'une valeur soit stockée en dehors de vos sous-fonctions et fonctions, je vous recommande vivement d'utiliser une feuille de calcul cachée avec des plages nommées pour toute information qui doit persister.

9voto

Alex K. Points 67805

Bien sûr que tu le sais, mais si c'est une constante alors const MyVariable as Integer = 123 sinon, vous n'avez pas de chance ; une valeur initiale doit être attribuée à la variable ailleurs.

Tu pourrais :

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

Dans un module de classe, créez-la globalement ;

public cMyStuff as new MyStuffClass

Alors cMyStuff.myIntegerThing est disponible immédiatement.

1 votes

Le mieux serait d'ajouter un module et de définir ces propriétés dans ce module. Je crée un module appelé Globals et définir Property Get dans ce module et cela fonctionne comme un charme. Property Get PSIStartRow() As Integer PSIStartRow = Sheets("FOB Prices").Range("F1").Value End Property Property Get PSIStartCell() As String PSIStartCell = "B" & PSIStartRow End Property

0 votes

Le code a été mélangé dans le commentaire ci-dessus. Je vais le poster plus bas.

6voto

ashleedawg Points 12302

Fait peu connu :
Une plage nommée peut faire référence à une <em>valeur </em>au lieu de cellules spécifiques.

On pourrait en tirer parti pour agir comme une "variable globale", plus vous pouvez faire référence à la valeur à partir de VBA y dans une cellule de la feuille de calcul, y la valeur assignée sera même persister après avoir fermé et rouvert le classeur !


  • Pour "déclarer" le nom myVariable et lui attribuer une valeur de 123 :

    ThisWorkbook.Names.Add "myVariable", 123
  • Pour récupérer la valeur (par exemple pour afficher la valeur dans un MsgBox ):

      MsgBox [myVariable]
  • Vous pouvez également faire référence au nom avec une chaîne de caractères : (résultat identique entre crochets)

    MsgBox Evaluate("myVariable")
  • Pour utiliser la valeur sur une feuille de calcul utilisez simplement son nom dans votre formule tel quel :

    =myVariable
  • En fait, vous pourriez même stocker expressions de fonctions (un peu comme dans JavaScript )
    (Certes, je n'arrive pas à penser à une situation où cela serait bénéfique - mais je ne les utilise pas non plus en JS).

    ThisWorkbook.Names.Add "myDay", "=if(isodd(day(today())),""on day"",""off day"")"

Les crochets ne sont qu'un raccourci pour la fonction Évaluer méthode. J'ai entendu dire que leur utilisation était considérée comme désordonnée ou "bricolée", mais je n'ai eu aucun problème et leur utilisation dans Excel est supporté par par Microsoft.

Il existe probablement aussi un moyen d'utiliser le Range pour faire référence à ces noms, mais je n'en vois pas l'avantage et je n'ai pas cherché à l'approfondir.


Plus d'informations :

4voto

Mohamed YOUNES Points 19

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 PERMISE en dehors des procédures, vous pouvez, par exemple, créer une sous-routine appelée InitGlobals qui initialise vos variables publiques, puis vous appelez simplement cette sous-routine 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X