Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Récupérer le nom d'une variable

  • Initiateur de la discussion Initiateur de la discussion dionys0s
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dionys0s

XLDnaute Impliqué
Bonjour le forum

c'est une question peut-être un peu farfelue, mais j'aimerais savoir s'il est possible de récupérer le nom d'une variable. Par exemple :

VB:
Dim MaVar As Integer

MaVar = 15

Msgbox FonctionNomVar(MaVar)

Et le MsgBox afficherait non pas la valeur de la variable ("15"), mais le nom de la variable ("MaVar")

D'avance merci pour votre aide 🙂
 
Re : Récupérer le nom d'une variable

Re,

c'est donc bien ce que je disais : je ne peux appeler cette fonction qu'une seule fois par module.
Dans le fichier joint, l'exécution de MaMacro1 renvoie les bons résultats, mais pas l'exécution de MaMacro2

VB:
Option Explicit
Dim Module$, i& 'mémorise

Function Nom(x)
Dim t$, p As Byte
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  For i = i + 1 To .CountOfLines
    t = .Lines(i, 1)
    p = InStr(t, "(") + 1
    If t Like "*Nom(*)*" And InStr(t, "Function") = 0 Then _
      Nom = Mid(t, p, InStr(p, t, ")") - p): Exit For
  Next
End With
End Function

Sub MaMacro1()
Dim t$, MaVar1, tata1, titi1, toto1
Module = "Module1" 'à adapter
i = 0
t = Nom(MaVar1)
MsgBox t, , "Nom"
MsgBox Nom(tata1), , "Nom"
MsgBox Nom(titi1), , "Nom"
MsgBox Nom(toto1), , "Nom"
End Sub

Sub MaMacro2()
Dim t$, MaVar2, tata2, titi2, toto2
Module = "Module1" 'à adapter
i = 0
t = Nom(MaVar2)
MsgBox t, , "Nom"
MsgBox Nom(tata2), , "Nom"
MsgBox Nom(titi2), , "Nom"
MsgBox Nom(toto2), , "Nom"
End Sub

Je pense que nous avons atteint une limite d'excel, donc je vais me résigner pour le moment.
C'est dommage, ça aurait été tellement chouette de pouvoir récupérer le string de déclaration de n'importe quelle variable avec un truc du genre MaVar.VBE.CodeName qui renverrait "MaVar".

Merci beaucoup pour ton aide en tout cas Job.

A+
 

Pièces jointes

Re : Récupérer le nom d'une variable

c'est donc bien ce que je disais : je ne peux appeler cette fonction qu'une seule fois par module.

Mais non pas du tout, on peut toujours analyser le code de chaque macro :

Code:
Option Explicit
Dim Module$, Proc$, deb&, i& 'mémorise

Function Nom(x)
Dim t$, p As Byte
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  For i = i + 1 To deb + .ProcCountLines(Proc, 0)
    t = .Lines(i, 1)
    If t Like "*Nom(*)*" Then
      p = InStr(t, "Nom(") + 4
      Nom = Mid(t, p, InStr(p, t, ")") - p)
      Exit For
    End If
  Next
End With
End Function

Sub MaMacro1()
Dim t$, MaVar1, tata1, titi1, toto1
Module = "Module1" 'à adapter
Proc = "MaMacro1" 'à adapter
deb = ThisWorkbook.VBProject.VBComponents(Module).CodeModule.ProcBodyLine(Proc, 0) - 1
i = deb
t = Nom(MaVar1)
MsgBox t, , "Nom"
MsgBox Nom(tata1), , "Nom"
MsgBox Nom(titi1), , "Nom"
MsgBox Nom(toto1), , "Nom"
End Sub

Sub MaMacro2()
Dim t$, MaVar2, tata2, titi2, toto2
Module = "Module1" 'à adapter
Proc = "MaMacro2" 'à adapter
deb = ThisWorkbook.VBProject.VBComponents(Module).CodeModule.ProcBodyLine(Proc, 0) - 1
i = deb
t = Nom(MaVar2)
MsgBox t, , "Nom"
MsgBox Nom(tata2), , "Nom"
MsgBox Nom(titi2), , "Nom"
MsgBox Nom(toto2), , "Nom"
End Sub
Sachez que pratiquement tout est possible en VBA, il suffit de savoir chercher.

Fichier (2).

Edit : .ProcBodyLine peut créer des problèmes, remplacez par .ProcStartLine

A+
 

Pièces jointes

Dernière édition:
Re : Récupérer le nom d'une variable

Re,

C'est mieux avec la variable init :

Code:
Option Explicit
Dim Module$, Proc$, init As Boolean, i& 'mémorise

Function Nom(x)
Dim deb&, t$, p As Byte
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  deb = .ProcBodyLine(Proc, 0) - 1
  For i = IIf(init, deb, i) + 1 To deb + .ProcCountLines(Proc, 0)
    t = .Lines(i, 1)
    If t Like "*Nom(*)*" Then
      p = InStr(t, "Nom(") + 4
      Nom = Mid(t, p, InStr(p, t, ")") - p)
      Exit For
    End If
  Next
End With
init = False
End Function

Sub MaMacro1()
Dim t$, MaVar1, tata1, titi1, toto1
Module = "Module1" 'à adapter
Proc = "MaMacro1" 'à adapter
init = True
t = Nom(MaVar1)
MsgBox t, , "Nom"
MsgBox Nom(tata1), , "Nom"
MsgBox Nom(titi1), , "Nom"
MsgBox Nom(toto1), , "Nom"
End Sub

Sub MaMacro2()
Dim t$, MaVar2, tata2, titi2, toto2
Module = "Module1" 'à adapter
Proc = "MaMacro2" 'à adapter
init = True
t = Nom(MaVar2)
MsgBox t, , "Nom"
MsgBox Nom(tata2), , "Nom"
MsgBox Nom(titi2), , "Nom"
MsgBox Nom(toto2), , "Nom"
End Sub
Fichier (3).

Edit : .ProcBodyLine peut créer des problèmes, remplacez par .ProcStartLine

A+
 

Pièces jointes

Dernière édition:
Re : Récupérer le nom d'une variable

Re,

Sans variable init, et il faut des variables Public si la fonction est dans un autre module :

Code:
Option Explicit
Public Module$, Proc$, i& 'mémorise

Function Nom(x)
Dim deb&, t$, p As Byte
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  deb = .ProcBodyLine(Proc, 0) - 1
  For i = IIf(i, i, deb) + 1 To deb + .ProcCountLines(Proc, 0)
    t = .Lines(i, 1)
    If t Like "*Nom(*)*" Then
      p = InStr(t, "Nom(") + 4
      Nom = Mid(t, p, InStr(p, t, ")") - p)
      Exit For
    End If
  Next
End With
End Function

Sub MaMacro1()
Dim t$, MaVar1, tata1, titi1, toto1
Module = "Module1" 'à adapter
Proc = "MaMacro1" 'à adapter
i = 0
t = Nom(MaVar1)
MsgBox t, , "Nom"
MsgBox Nom(tata1), , "Nom"
MsgBox Nom(titi1), , "Nom"
MsgBox Nom(toto1), , "Nom"
End Sub

Sub MaMacro2()
Dim t$, MaVar2, tata2, titi2, toto2
Module = "Module1" 'à adapter
Proc = "MaMacro2" 'à adapter
i = 0
t = Nom(MaVar2)
MsgBox t, , "Nom"
MsgBox Nom(tata2), , "Nom"
MsgBox Nom(titi2), , "Nom"
MsgBox Nom(toto2), , "Nom"
End Sub
Fichier (4).

Edit : .ProcBodyLine peut créer des problèmes, remplacez par .ProcStartLine

A+
 

Pièces jointes

Dernière édition:
Re : Récupérer le nom d'une variable

Bonjour le fil, le forum,

Suite au post #4 de Roland_M, voici une solution pour déterminer les valeurs des variables d'une macro :

Code:
Sub Valeurs_des_variables()
Dim Module$, Proc$, dico As Object, deb&, i&, t$, derlig&, d%, p%, a
Module = InputBox("Entrez le module :", , "Module1")
If Module <> "" Then Proc = InputBox("Entrez la procédure :", , "MaMacro1")
If Proc = "" Then Exit Sub
Set dico = CreateObject("Scripting.Dictionary")
On Error GoTo 2
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  deb = .ProcStartLine(Proc, 0)
  On Error GoTo 0
  For i = deb To deb + .ProcCountLines(Proc, 0) - 1
    t = Trim(.Lines(i, 1))
    If t <> "" And Left(t, 1) <> "'" Then derlig = i
    d = 0
1   d = InStr(d + 1, t, " = ")
    If d Then
      If InStr(Mid(t, 1, d), "'") = 0 Then 'évite les commentaires
        p = InStrRev(t, " ", d - 1)
        dico(Mid(t, p + 1, d - p - 1)) = ""
        GoTo 1
      End If
    End If
  Next
  a = dico.keys
  .InsertLines derlig, "On Error Resume Next" 'au cas où la variable est un objet
  For i = 0 To UBound(a)
  .InsertLines derlig + 1 + i, "MsgBox """ & a(i) & " = "" & " & a(i) & ", , ""Valeur"""
  Next
  Application.Run Module & "." & Proc
  .DeleteLines derlig, UBound(a) + 2
End With
Exit Sub
2 MsgBox "Noms du module ou de la procédure incorrects !", 48
Application.OnTime 1, "Valeurs_des_variables"
End Sub
Fichier joint.

Nota : sur Excel 2010 j'ai remarqué que si l'on modifie une macro il faut fermer le fichier et le rouvrir, ou bien relancer la macro.

Edit
: modifié pour ignorer les commentaires

A+
 

Pièces jointes

Dernière édition:
Re : Récupérer le nom d'une variable

Re,

Une solution voisine qui liste ensemble les noms des variables et leurs valeurs :

Code:
Public a, b 'mémorise

Sub Valeurs_des_variables()
Dim Module$, Proc$, dico As Object, deb&, i&, t$, derlig&, d%, p%, mes$
Module = InputBox("Entrez le module :", , "Module1")
If Module <> "" Then Proc = InputBox("Entrez la procédure :", , "MaMacro1")
If Proc = "" Then Exit Sub
Set dico = CreateObject("Scripting.Dictionary")
On Error GoTo 2
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  deb = .ProcStartLine(Proc, 0)
  On Error GoTo 0
  For i = deb To deb + .ProcCountLines(Proc, 0) - 1
    t = Trim(.Lines(i, 1))
    If t <> "" And Left(t, 1) <> "'" Then derlig = i
    d = 0
1   d = InStr(d + 1, t, " = ")
    If d Then
      If InStr(Mid(t, 1, d), "'") = 0 Then 'évite les commentaires
        p = InStrRev(t, " ", d - 1)
        dico(Mid(t, p + 1, d - p - 1)) = ""
        GoTo 1
      End If
    End If
  Next
  a = dico.keys: b = dico.items
  .InsertLines derlig, "On Error Resume Next" 'au cas où la variable est un objet
  For i = 0 To UBound(a)
    .InsertLines derlig + 1 + i, "b(" & i & ") = " & a(i)
  Next
  Application.Run Module & "." & Proc
  .DeleteLines derlig, UBound(a) + 2
End With
'---restitution des listes a et b---
For i = 0 To UBound(a)
  mes = mes & vbLf & a(i) & " = " & b(i)
Next
MsgBox Mid(mes, 2), , "Valeurs"
Exit Sub
2 MsgBox "Noms du module ou de la procédure incorrects !", 48
Application.OnTime 1, "Valeurs_des_variables"
End Sub
Le Nota de mon post précédent est toujours valable.

Fichier (2).

Edit : modifié pour ignorer les commentaires.

A+
 

Pièces jointes

Dernière édition:
Re : Récupérer le nom d'une variable

Re,

Pour la dernière macro du module, .ProcCountLines compte les lignes blanches situées après la macro.

Et pour toutes les macros, il compte les commentaires après le End Sub.

Pour y remédier je détermine la dernière ligne de la macro par :

Code:
If t <> "" And Left(t, 1) <> "'" Then derlig = i
J'ai introduit cette instruction dans les macros des posts #20 et #21 précédents.

Edit : modifié pour ignorer les commentaires.

A+
 
Dernière édition:
Re : Récupérer le nom d'une variable

Re,

On aura remarqué que la variable objet toto s'affiche avec le fichier (2) alors qu'elle ne s'affiche pas avec le fichier (1).

Mais on peut modifier la dernière macro en testant la présence de l'instruction Set :

Code:
Public a, b 'mémorise

Sub Valeurs_des_variables()
Dim Module$, Proc$, dico As Object, deb&, i&, t$, derlig&, d%, p%
Dim objet As Boolean, mes$
Module = InputBox("Entrez le module :", , "Module1")
If Module <> "" Then Proc = InputBox("Entrez la procédure :", , "MaMacro1")
If Proc = "" Then Exit Sub
Set dico = CreateObject("Scripting.Dictionary")
On Error GoTo 2
With ThisWorkbook.VBProject.VBComponents(Module).CodeModule
  deb = .ProcStartLine(Proc, 0)
  On Error GoTo 0
  For i = deb To deb + .ProcCountLines(Proc, 0) - 1
    t = Trim(.Lines(i, 1))
    If t <> "" And Left(t, 1) <> "'" Then derlig = i
    d = 0
1   d = InStr(d + 1, t, " = ")
    If d Then
      If InStr(Mid(t, 1, d), "'") = 0 Then 'évite les commentaires
        p = InStrRev(t, " ", d - 1)
        If p > 3 Then objet = Mid(t, p - 3, 3) = "Set" Else objet = False
        If Not objet Then dico(Mid(t, p + 1, d - p - 1)) = ""
        GoTo 1
      End If
    End If
  Next
  a = dico.keys: b = dico.items
  .InsertLines derlig, "On Error Resume Next" 'au cas où la variable est un objet
  For i = 0 To UBound(a)
    .InsertLines derlig + 1 + i, "b(" & i & ") = " & a(i)
  Next
  Application.Run Module & "." & Proc
  .DeleteLines derlig, UBound(a) + 2
End With
'---restitution des listes a et b---
For i = 0 To UBound(a)
  mes = mes & vbLf & a(i) & " = " & b(i)
Next
MsgBox Mid(mes, 2), , "Valeurs"
Exit Sub
2 MsgBox "Noms du module ou de la procédure incorrects !", 48
Application.OnTime 1, "Valeurs_des_variables"
End Sub
Fichier (3).

Edit : modifié pour ignorer les commentaires.


A+
 

Pièces jointes

Dernière édition:
Re : Récupérer le nom d'une variable

Bonjour le fil, le forum,

J'ai modifié les posts #20 à #23 pour que les commentaires soient ignorés.

Notez aussi qu'on ne peut pas traiter des procédures ayant des arguments non facultatifs.

Bonne journée.
 
Re : Récupérer le nom d'une variable

Re,

Si l'on veut juste lister les variables c'est bien sûr plus simple.

Voir les 2 fichiers joints avec une Sub et une Function.

Ils fonctionnent qu'il y ait ou non des arguments dans la procédure étudiée.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
11
Affichages
408
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…