[VBA] [Excel 2013] Récupérer la valeur d'une variable

7 réponses
Avatar
ThierryP
Bonjour le forum,

Sur une feuille, j'ai une liste de noms de variables comme ceci :

Meca_ARS
Meca_PLG
RCSI
Elec_ARS
Elec_PLG
Meca_PLA
Elec_PLA
Meca_CNG
Elec_CNG
Meca_BIO
Elec_BIO

Dans une proc=C3=A9dure, je fais des calculs de cumul sur ces variables :
Select Case cellule.Interior.Color
Case Range("Liste_Code_Couleurs")(1)
Meca_ARS =3D Meca_ARS + 0.5
Case Range("Liste_Code_Couleurs")(2)
Meca_PLG =3D Meca_PLG + 0.5

etc....

et =C3=A0 la fin je souhaite =C3=A9crire la valeur de chaque variable dans =
des cellules. Pour faire court, j'ai tent=C3=A9 :

For Z =3D 1 To Application.WorksheetFunction.CountA(Range("Liste_Variables"=
))
ActiveCell.Offset(0, Z) =3D Range("Liste_Variables")(Z)
Next

mais dans ma cellule, je ne retrouve pas la valeur mais le nom de la variab=
le.

Comment r=C3=A9cup=C3=A9rer la valeur de mes variables ?

Merci d'avance,

ThierryP

7 réponses

Avatar
Michel__D
Bonjour,
Le 01/10/2019 à 17:23, ThierryP a écrit :
Bonjour le forum,
Sur une feuille, j'ai une liste de noms de variables comme ceci :
Meca_ARS
Meca_PLG
RCSI
Elec_ARS
Elec_PLG
Meca_PLA
Elec_PLA
Meca_CNG
Elec_CNG
Meca_BIO
Elec_BIO
Dans une procédure, je fais des calculs de cumul sur ces variables :
Select Case cellule.Interior.Color
Case Range("Liste_Code_Couleurs")(1)
Meca_ARS = Meca_ARS + 0.5
Case Range("Liste_Code_Couleurs")(2)
Meca_PLG = Meca_PLG + 0.5
etc....
et à la fin je souhaite écrire la valeur de chaque variable dans des cellules. Pour faire court, j'ai tenté :
For Z = 1 To Application.WorksheetFunction.CountA(Range("Liste_Variables"))
ActiveCell.Offset(0, Z) = Range("Liste_Variables")(Z)
Next
mais dans ma cellule, je ne retrouve pas la valeur mais le nom de la variable.
Comment récupérer la valeur de mes variables ?

Regarde la méthode Evaluate dans l'aide d'Excel.
Avatar
MichD
Bonjour,
Je n'ai pas compris ta question!
Lorsque l'on parle de "variables", ces dernières sont définies
(déclarées) dans un module de l'éditeur de code (VBA). Dans une feuille
de calcul, une liste de noms dans une plage de cellules fait plutôt
référence à des plages nommées. Chacun de ces "NOMS" doit représenter
une valeur numérique quelconque.
Suppose une liste de noms définis au niveau du classeur dans la plage
A1:A10 de la feuil1 ayant toute des valeurs numériques déjà attribuées.
Si l'exercice consiste à majorer de .05 chacune des valeurs de ces noms:
Dans un module standard, on peut écrire :
'------------------------
Sub test()
Dim Arr(), Elt As Variant
With Feuil1
Arr = .Range("A1:A10")
End With
For Each Elt In Arr
Names.Add Elt, Evaluate(Elt) + 0.5
Next
End Sub
'------------------------
MichD
Le 01/10/19 à 11:23, ThierryP a écrit :
Bonjour le forum,
Sur une feuille, j'ai une liste de noms de variables comme ceci :
Meca_ARS
Meca_PLG
RCSI
Elec_ARS
Elec_PLG
Meca_PLA
Elec_PLA
Meca_CNG
Elec_CNG
Meca_BIO
Elec_BIO
Dans une procédure, je fais des calculs de cumul sur ces variables :
Select Case cellule.Interior.Color
Case Range("Liste_Code_Couleurs")(1)
Meca_ARS = Meca_ARS + 0.5
Case Range("Liste_Code_Couleurs")(2)
Meca_PLG = Meca_PLG + 0.5
etc....
et à la fin je souhaite écrire la valeur de chaque variable dans des cellules. Pour faire court, j'ai tenté :
For Z = 1 To Application.WorksheetFunction.CountA(Range("Liste_Variables"))
ActiveCell.Offset(0, Z) = Range("Liste_Variables")(Z)
Next
mais dans ma cellule, je ne retrouve pas la valeur mais le nom de la variable.
Comment récupérer la valeur de mes variables ?
Merci d'avance,
ThierryP
Avatar
ThierryP
Merci, je vais regarder ça !
Regarde la méthode Evaluate dans l'aide d'Excel.
Avatar
ThierryP
Bonjour Denis,
En fait, je voudrais faire quelque chose qui ressemble à "INDIRECT" :
Dans un feuille j'ai créé une liste de procédures avec un co de couleur et une variable associés.
Plutôt que d'écrire :
ActiveCell.Offset(0, 1) = Variable1
ActiveCell.Offset(0, 2) = Variable2 etc...
je souhaite boucler sur ma liste de variables (c'est une plage nommée) , ce qui me permet d'ajouter ou supprimer des variables sans avoir à r éécrire ou supprimer des lignes de code.
J'espère que c'est plus clair ainsi !!!
ThierryP
Le mardi 1 octobre 2019 21:29:38 UTC+2, MichD a écrit :
Bonjour,
Je n'ai pas compris ta question!
Avatar
MichD
En supposant que j'ai compris ta demande...
Ajoute la bibliothèque suivante à ton projetVBA
Barre des menus / outils / références / et coche cet item:
"Microsoft Scripting Runtime"
Cela va te permettre d'accéder à un nouvel objet "Dictionary".
Un exemple sur la manière de manipuler cet objet.
'-------------------------------------
Sub test()
Dim Dic As Scripting.Dictionary
Dim C As Range
Set Dic = CreateObject("Scripting.Dictionary")
'Ceci permet d'éviter les doublons s'il y en a dans la liste.
'un object dictionary ne peut pas avoir 2 Keys identiques,
'cela provoque une erreur.
For Each C In Range("Couleurs")
If Not Dic.Exists(C.Value) Then
Dic.Add C.Value, C.Offset(0, 1).Value
End If
Next
'Pour boucler sur les Keys qui représentent
'Les noms des couleurs de la plage nommée
For Each k In Dic.Keys
x = k
Next
'Pour boucler sur les Keys qui représentent
'Les noms des couleurs de la plage nommée
For Each x In Dic.Items
Valeur = x
Next
'Ceci te donne la position de cette couleur "Montage_ARS"
'dans la collection des Keys
B = Application.Match("Montage_ARS", Dic.Keys, 0)
'Pour trouver la valeur numérique associée à la couleur
'Le premier index d'un dictionnaire est 0 et non 1.
aa = Dic.Keys(0) 'Nom de la couleur
A = Dic.Items(0) 'Valeur de la couleur
N = Dic.Count 'nombre d'entrées dans le dictionnaire
'Pour supprimer un item du dictionnaire
Dic.Remove "Montage_ARS"
End Sub
'-------------------------------------
MichD
Avatar
MichD
Même exemple + commentaire plus approprié
'-----------------------------------------------------
Sub test()
Dim Dic As Scripting.Dictionary
Dim C As Range
Set Dic = CreateObject("Scripting.Dictionary")
'Remplir le dictionary des noms des couleurs
'et de la valeur numérique de ces couleurs
'Dic.Add Key, Item
'Dans un dictionary, on ne peut pas avoir
'2 keys identiques => cela génère une erreur.
For Each C In Range("Couleurs")
If Not Dic.Exists(C.Value) Then
Dic.Add C.Value, C.Offset(0, 1).Value
End If
Next
'Le premier index d'un dictionnaire est 0 et non 1.
aa = Dic.Keys(0) 'Nom de la couleur
A = Dic.Items(0) 'Valeur de la couleur
N = Dic.Count 'nombre d'entrées dans le dictionnaire
'Pour boucler sur les Keys qui représentent
'Les noms des couleurs de la plage nommée
For Each k In Dic.Keys
x = k
Next
'Pour boucler sur les valeurs numériques des couleurs
For Each x In Dic.Items
Valeur = x
Next
'Ceci te donne la position de cette couleur "Montage_ARS"
'dans la collection des Keys
B = Application.Match("Montage_ARS", Dic.Keys, 0)
'Pour trouver la valeur numérique associée à la couleur B
BB = Dic.Items(B)
'Pour supprimer un item du dictionnaire
Dic.Remove "Montage_ARS"
End Sub
'-----------------------------------------------------
MichD
Avatar
ThierryP
Bonsoir Denis,
Merci pour ton exemple et les explications détaillées !!!
Pour l'instant, je m'en suis sorti en créant un tableau pour les diff érentes activités et le script est bien plus simple !!!
J'alimente mes variables :
For Each cellule In Sheets(Mois).Range("B" & I & ":BK" & I)
For K = 1 To UBound(Activites)
If cellule.Interior.Color = Range("Liste_Code_Couleurs")(K) T hen Activites(K) = Activites(K) + 0.5
Next
et ensuite je remplis mes cellules :
For Z = 1 To Application.WorksheetFunction.CountA(Range("Liste_Variab les"))
ActiveCell.Offset(0, Z) = Activites(Z)
Next
J'ai pu éliminer pas mal de lignes et surtout automatiser en partie en cas de modification de variables (ajout, suppression etc...)
Merci pour le coup de main, comme d'habitude !
ThierryP