XL 2021 Aide adaptation code vba pour complément

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
 

patricktoulon

XLDnaute Barbatruc
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 :rolleyes:

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

dim wbpath as string
wbpath=activeworkbook

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

activeworkbook.quoi???????????????????????
 

patricktoulon

XLDnaute Barbatruc
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!!!!
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
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.
 

patricktoulon

XLDnaute Barbatruc
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

  • ouvreur.xlsm
    14.2 KB · Affichages: 0
  • cobaie.xlsm
    10.6 KB · Affichages: 0
Dernière édition:

Discussions similaires

Réponses
3
Affichages
253
Réponses
12
Affichages
749

Statistiques des forums

Discussions
313 866
Messages
2 103 082
Membres
108 521
dernier inscrit
manouba