Autres indentifier le classeur en ne connaissant que le nom d'un des module

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
je voudrais pour remonter jusqu'au classeur a partir d'un module

j'obtiens l'object vbcomponent(module) avec ceci
VB:
  Set vbComp = Application.VBE.ActiveCodePane.CodeModule.Parent
avez vous des idées?
 
Solution
Non vue qu'il s'agit bien de l'instance wb.VBProject et pas de son non

Ici tu récupères l'instance du modules actif
Application.VBE.ActiveCodePane.CodeModule.Parent
Et tu le compare à l'instance du wb?? Défi dans la boucle
C'est comme une collection du même module de classe chaque instance est unique

Place les deux dans la fenêtre espion, tu verras qu'il sont du même type et que ce soit bien des objets à part entière

dysorthographie

XLDnaute Accro
Bonjour Patrick,
Code:
Sub RemonterJusquAuClasseur()
    ' Obtenez l'objet VBComponent du module actif
    Dim vbComp As VBComponent
    Set vbComp = Application.VBE.ActiveCodePane.CodeModule.Parent
    
    ' Obtenez l'objet VBProject contenant le module
    Dim vbProj As VBProject
    Set vbProj = vbComp.Collection.Parent
    
    ' Obtenez le classeur contenant le projet VBA
    Dim wb As Workbook
    For Each wb In Workbooks
        If wb.VBProject Is vbProj Then
            MsgBox "Le module appartient au classeur : " & wb.Name
            Exit Sub
        End If
    Next wb
    
    MsgBox "Le classeur n'a pas été trouvé."
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
bonjour Robert
et oui ça j'y ai déjà pensé
sauf que si c'est des classeurs avec le même nom "vbproject" d'origine je risque de prendre celui d'a coté non ?
chatgpt me l'avais déjà proposé avec en plus une boucle sur tout les module et l'analyse du texte pour être sur d'avoir le bon
bref une usina gaz quoi
 

dysorthographie

XLDnaute Accro
Non vue qu'il s'agit bien de l'instance wb.VBProject et pas de son non

Ici tu récupères l'instance du modules actif
Application.VBE.ActiveCodePane.CodeModule.Parent
Et tu le compare à l'instance du wb?? Défi dans la boucle
C'est comme une collection du même module de classe chaque instance est unique

Place les deux dans la fenêtre espion, tu verras qu'il sont du même type et que ce soit bien des objets à part entière
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Cousinhub
oui c'est ça
j'avais trouvé entre temps
le but étant de récupérer le classeur parent du module affiché dans vbe
la fonction renvoie un object workbook
VB:
Sub testgetwbkparent()
    Dim vbcomp As VBComponent
    Set vbcomp = Application.VBE.ActiveCodePane.CodeModule.Parent
    MsgBox GetWorkbookParent(vbcomp).Name
End Sub

Function GetWorkbookParent(vbcomp) As Workbook
    Dim vbProj As vbProject
    Set vbProj = vbcomp.Collection.Parent
    Set GetWorkbookParent = Workbooks(Mid(vbProj.Filename, InStrRev(vbProj.Filename, "\") + 1))
End Function

super merci à tous
ça me faisait mal de devoir boucler même si la solution de Robert est bonne
et oui robert en effet tu à raison on traville en mode object donc il ne peut pas avoir de confusion
même si deux classeurs auraient eventuellement un module du même nom
(je précise j'ai testé )

merci à tous ;)
 

laurent950

XLDnaute Barbatruc
Bonsoir @patricktoulon

En une seule Ligne
VB:
Sub testgetwbkparente1()
    MsgBox Split(Application.VBE.ActiveCodePane.CodeModule.Parent.Collection.Parent.fileName, "\")(UBound(Split(Application.VBE.ActiveCodePane.CodeModule.Parent.Collection.Parent.fileName, "\")))
End Sub

Une version un peu formatée pour plus de lisibilité, mais qui fait exactement la même chose
Code:
Sub testgetwbkparente2()
    Dim filePath As String
    Dim fileName As String

    ' Obtenir le chemin complet du fichier du projet VBA parent
    filePath = Application.VBE.ActiveCodePane.CodeModule.Parent.Collection.Parent.fileName

    ' Extraire le nom du fichier à partir du chemin complet
    fileName = Split(filePath, "\")(UBound(Split(filePath, "\")))

    ' Afficher le nom du fichier (classeur)
    MsgBox fileName
End Sub
 

patricktoulon

XLDnaute Barbatruc
après cette méthode n'est pas optimisée
j'entends par là que pour se fair tu split 2 fois la chaine
la méthode instrRev c'est mieux
VB:
Sub testgetwbkparente1()
    With Application.VBE.ActiveCodePane.CodeModule.Parent.Collection.Parent: MsgBox Mid(.Filename, InStrRev(.Filename, "\") + 1): End With
End Sub
la tu vois je prends une portion de la" chaine en un coup
 

patricktoulon

XLDnaute Barbatruc
donc au final ici une seule ligne n'est pas forcement mieux et lisible
si je coupe proprement on pige tout de suite
Code:
Sub testgetwbkparente1()
    With Application.VBE.ActiveCodePane.CodeModule.Parent.Collection.Parent
       MsgBox Mid(.Filename, InStrRev(.Filename, "\") + 1)
    End With
End Sub
 

laurent950

XLDnaute Barbatruc
Re

il y a surement un accès directe au résultat?

VB:
Sub TestGetWorkbookNameSuite()
Dim NomF As String: NomF = Application.VBE.ActiveCodePane.CodeModule.Parent.Collection.Parent.fileName
' Affichez le nom du fichier
    MsgBox Mid(NomF, InStrRev(NomF, "\") + 1)
End Sub
 

Discussions similaires

Réponses
26
Affichages
578

Statistiques des forums

Discussions
312 916
Messages
2 093 580
Membres
105 758
dernier inscrit
RIFAHI MOHAMED