XL 2021 Aide adaptation code vba pour complément

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 !

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,

Suite au suivie de plusieurs discutions je me suis rendu compte que mon complément pour excel (.xlam) que j'avais fait avais quelques failles. (impossible de poster désolé)

Sur chatGPT, j'ai trouvé un code qui fonctionne pour désactiver ce qui est dans le module "ThisWorkbook"

VB:
Sub DisableUserFormAndOpenWorkbook()
    Dim wb As Workbook
    Dim vbComponent As Object
    Dim Code As String

    ' Ouvre le classeur cible sans exécuter le code
    Application.EnableEvents = False
    Set wb = Workbooks.Open("C:\chemin\vers\fichier_cible.xlsm")
    Application.EnableEvents = True

    ' Accède au module "ThisWorkbook"
    Set vbComponent = wb.VBProject.VBComponents("ThisWorkbook")

    ' Stocke le code existant
    Code = vbComponent.CodeModule.Lines(1, vbComponent.CodeModule.CountOfLines)

    ' Désactive le code d'ouverture du UserForm
    vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    vbComponent.CodeModule.AddFromString "Private Sub Workbook_Open(): End Sub"

    ' Exécute vos tâches ici
    ' ...

    ' Rétablit le code d'origine
    vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    vbComponent.CodeModule.AddFromString Code

    ' Ferme le classeur cible
    wb.Close SaveChanges:=True
End Sub

Le problème pour moi,
J'ai essayé de plusieurs façons mais sans succès, le modèle proposé fonctionne quand on a un fichier cible dont on connais le nom, mais moi, vu que c'est un complément je dois pour ouvrir n'importe quel fichier sans avoir à présisé le nom dans mon module.

Logiquement je pense que je dois faire un "ActiveWorkBook" ou "With ActiveWorkBook", mais j'arrive pas à le formuler, j'ai systématiquement une erreur au démarrage.

Capture d’écran 2024-08-20 095905.jpg

Capture d’écran 2024-08-20 100027.jpg


et voici le code que j'ai essayé

Code:
Sub DisableUserFormAndOpenWorkbook()
    Dim wb As Workbook
    Dim vbComponent As Object
    Dim Code As String
    Dim wbPath As String

    ' Ouvre le classeur cible sans exécuter le code
    Application.EnableEvents = False
    wbPath = ActiveWorkbook
    Set wb = Workbooks.Open(wbPath)
    Application.EnableEvents = True

    ' Accède au module "ThisWorkbook"
    Set vbComponent = wb.VBProject.VBComponents("ThisWorkbook")

    ' Stocke le code existant
    Code = vbComponent.CodeModule.Lines(1, vbComponent.CodeModule.CountOfLines)

    ' Désactive le code d'ouverture du UserForm
    vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    vbComponent.CodeModule.AddFromString "Private Sub Workbook_Open(): End Sub"

    ' Exécute vos tâches ici
    ' ...

    ' Rétablit le code d'origine
    vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    vbComponent.CodeModule.AddFromString Code

    ' Ferme le classeur cible
    'wb.Close SaveChanges:=True
End Sub

Merci à tous
Nico
 
re
Bonjour
si j'ai bien compris le truc
tu souhaite déactiver le workbook open dans un classeur ouvert a partir de ton complement xlam
c'est bien ça ?

si c'est bien ça la réponse est dans la question

je suis sidéré de voir ce qu'arrive à sortir CGPT 🙄

après pour l'erreur qui est pointé selon moi c'est evident

dim wbpath as string
wbpath=activeworkbook

?????????????????????????????????????

activeworkbook.quoi???????????????????????
 
re
à fin de ne pas te faire perdre du temps inutilement ainsi que le mien je vais être plus explicite

1° alors pour ce qui est de la question de déactiver le workbook_open d'un classeur
la réponse est bien évidemment NON ce n'est pas possible
comment le pourrait tu d'ailleurs si le classeur est ouvert le open c'est déjà exécuté

2° pour ton erreur
tu dim un string et tu lui donne la valeur de activeworkbook
activeworkbook est un object workbook pas un string


donc NON NON NON NON !!! tu ne peux pas déactiver le open d'un classeur a partir de ton complément

j'espère avoir été clair

je suis sidéré (je le redis) de voir ce que sort chatGPT
hihihi c'est formidable!!!!
 
Re Patrick,

tu es la bible peut-être, mais le code que j'ai donné soit celui ci fonctionne depuis un classeur vierge, je l'ai testé sur un classeur dont il y avait une éxécution au démarrage,

VB:
Sub DisableUserFormAndOpenWorkbook()
    Dim wb As Workbook
    Dim vbComponent As Object
    Dim Code As String

    ' Ouvre le classeur cible sans exécuter le code
    Application.EnableEvents = False
    Set wb = Workbooks.Open("C:\chemin\vers\fichier_cible.xlsm")
    Application.EnableEvents = True

    ' Accède au module "ThisWorkbook"
    Set vbComponent = wb.VBProject.VBComponents("ThisWorkbook")

    ' Stocke le code existant
    Code = vbComponent.CodeModule.Lines(1, vbComponent.CodeModule.CountOfLines)

    ' Désactive le code d'ouverture du UserForm
    vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    vbComponent.CodeModule.AddFromString "Private Sub Workbook_Open(): End Sub"

    ' Exécute vos tâches ici
    ' ...

    ' Rétablit le code d'origine
    vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    vbComponent.CodeModule.AddFromString Code

    ' Ferme le classeur cible
    'wb.Close SaveChanges:=True
End Sub

Donc je demandais juste comment depuis un complément.
 
VB:
Sub DisableUserFormAndOpenWorkbook()
    Dim wb As Workbook
   'Dim vbComponent As Object
   ' Dim Code As String

    ' Ouvre le classeur cible sans exécuter le code
    Application.EnableEvents = False
   
     fichier = Application.GetOpenFilename("Excel Files (*.xlsm), *.xlsm", 1, "ouvrir un fichier Excel")
    If fichier = False Then Exit Sub
 
   
    Set wb = Workbooks.Open(fichier)
    Application.EnableEvents = True

    ' Accède au module "ThisWorkbook"
    'Set vbComponent = wb.VBProject.VBComponents("ThisWorkbook")

    ' Stocke le code existant
    'Code = vbComponent.CodeModule.Lines(1, vbComponent.CodeModule.CountOfLines)

    ' Désactive le code d'ouverture du UserForm
    'vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines

    'vbComponent.CodeModule.AddFromString "Private Sub Workbook_Open(): End Sub"

    ' Exécute vos tâches ici
    ' ...

    ' Rétablit le code d'origine
    'vbComponent.CodeModule.DeleteLines 1, vbComponent.CodeModule.CountOfLines
    'vbComponent.CodeModule.AddFromString Code

    ' Ferme le classeur cible
    'wb.Close SaveChanges:=True
End Sub

bref comme tu peux le voir seul les enableevents suffisent a bloquer les events nul besoin de faire du paté avec le code
 

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

  • Question Question
Microsoft 365 Code VBA
Réponses
7
Affichages
648
  • Question Question
Microsoft 365 Question code VBA
Réponses
2
Affichages
391
Réponses
6
Affichages
605
Réponses
7
Affichages
696
Retour