Je veux faire ça mais ça ne compile pas :
Public MyVariable as Integer = 123
Quelle est la meilleure façon d'y parvenir ?
Je veux faire ça mais ça ne compile pas :
Public MyVariable as Integer = 123
Quelle est la meilleure façon 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 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 :
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 :
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.
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.
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
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.
Names.Add
méthode (Excel)
Application.Evaluate
méthode (Excel)
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 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.
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.
0 votes
Voir aussi : Puis-je déclarer et affecter simultanément une variable en VBA ?