IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Crash Excel sur modification VBA de l'Objet "thisWorkbook"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Par défaut Crash Excel sur modification VBA de l'Objet "thisWorkbook"
    Bonjour,

    J'ai une application VBA qui est déployée auprès d'utilisateurs et pour laquelle je souhaite implémenter des mises à jour du Code VBA (inclus dans les sheets, les userform, les modules ... et thisWorksheet.

    L'ensemble fonctionne sauf que si je touche au code présent dans "thisWorksheet", Excel Crash lors de la sauvegarde du fichier...

    J'ai donc tenté d'ajouter la ligne Application.EnableEvents = False afin d'inhiber l'exécution automatique du code de thisWorkbook (tout fraichement mis à jour) lors de la sauvegarde du fichier.
    Je n'ai plus de crash d'Excel, mais le code s'interrompt quand même (sur certains PC...)


    Ci-joint le code utilisé (un peu simplifié pour le post)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Sub UpdateFichier()
        Dim Wb As Workbook
        Dim VbComp As VBComponent
        Set Srcwb = ActiveWorkbook ' Fichier contenant le nouveau code VBA
        On Error Resume Next
     
    'Export userform Source
        For Each VbComp In Srcwb.VBProject.VBComponents
            If VbComp.Type = 3 Then VbComp.Export VbComp.Name & ".frm"
        Next
     
     
    '**********************************************************************************************
    '    C'est simplifié pour l'exemple, ma macro complète exécute la mise à jour sur tous les fichiers d'un répertoire
    '    Je n'ai mis que le code de mise à jour des sheets (la partie module et userform fonctionne bien)
        Workbooks.Open Filename:= _
                    "U:\Repertoire\Fichier_Destination.xlsm", _
                    UpdateLinks:=0
        Set Wb = Workbooks("Fichier_Destination.xlsm")
     
    ' Je renomme les modules et les userforms avec un préfixe zz_ je vide les modules de leurs code et je les supprime
        For Each VbComp In Wb.VBProject.VBComponents
                    Select Case VbComp.Type
                        Case 1         ' Suppression des 1 = Modules
                            VbComp.Name = "zz_" & VbComp.Name
                            With VbComp.CodeModule
                                .DeleteLines 1, .CountOfLines
                            End With
                            wb.VBProject.VBComponents.Remove VbComp
                        Case 3              ' Suppression 3 = Userform
                                VbComp.Name = "zz_" & VbComp.Name
                                wb.VBProject.VBComponents.Remove VbComp
                        Case 100            ' Code VBA des Sheets supprimés
                            With VbComp.CodeModule
                                .DeleteLines 1, .CountOfLines
                            End With
                    End Select
        Next
     
    'Dans un 2ème temps remplacement dans chacune des feuilles du fichier destination du code présent dans le fichier source (les 2 fichiers ont les mêmes sheets présents)
        For Each VbComp In Srcwb.VBProject.VBComponents
                    Select Case VbComp.Type
                     Case 1          ' 1 = Modules, Création du module(même nom que Src) et copie du code Src
                        Set VbDest = wb.VBProject.VBComponents.Add(1)
                        VbDest.Name = VbComp.Name                
                        With VbComp.CodeModule
                            CodeModSrc = .Lines(1, .CountOfLines)
                        End With
                        VbDest.CodeModule.InsertLines 1, CodeModSrc
                        CodeModSrc = ""
                     Case 3          ' 3 = userform, Importation des userform Sources
                        wb.VBProject.VBComponents.Import VbComp.Name & ".frm"
                     Case 100        ' Réécriture du Code VBA des Sheets par rapport à la source
                         With VbComp.CodeModule
                             CodeModSrc = .Lines(1, .CountOfLines + 1)
                         End With
                         wb.VBProject.VBComponents(VbComp.Name).CodeModule.InsertLines 1, CodeModSrc
                         CodeModSrc = ""
                    End Select
        Next
     
        Application.EnableEvents = False
     
        Wb.Close SaveChanges:=True
     
        Application.EnableEvents = True
    End Sub
    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut Philoul,

    Perso, je ferais en début de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set Wb = Workbooks.Open(Filename:="U:\Repertoire\Fichier_Destination.xlsm",UpdateLinks:=0)
    Et à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Wb.Save
    Wb.Close SaveChanges:=True
    A voir

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Par défaut
    Je poursuis mes test mais c'est encore plus pourris que ce que je croyais...
    Finalement la mise à jour du code des sheets semble fonctionner (du moins de temps en temps) en revanche pour les modules et les userforms, il semblerai qu'il y ai des problèmes temps réels lors de l'exécution du code :

    Je me trouve de façon aléatoire avec des fichiers dont (après exécution de la macro d'update) :
    Certains ont des modules non effacés malgré la ligne de code :

    wb.VBProject.VBComponents.Remove VbComp

    du coup lorsque je cherche à recréer un module du même nom il m'envoie un message d'erreur... et si j'interromp la macro les modules supprimés disparaissent (mais pas toujours...)

    Je tente donc un contournement en renommant les modules avant de les vider de leur code puis les supprimer

    (voir ci-dessus le code complété)

    Je me retrouve donc maintenant avec la plupart des premiers fichiers traité corrects. puis certains autres fichiers se retrouvent avec quelques modules et/ou userforms supplémentaires avec le préfixe zz_ (ceux qui n'ont pas été supprimés malgré la commande)
    Si je refait l'update sur ces fichiers généralement cela plante excel... La solution pour les récupérer est de supprimer manuellement ces modules avant de relancer l'update...


    D'autres ont leur code VBA complément verolé (message d'erreur à l'ouverture, réparation du fichier et suppression du code VBA)...

    Bon sur ces fichiers si je repasse ma macro d'update il sont généralement réparés...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Peut être faut-il différer la suite du traitement afin qu'un délai soit accordé à la montée du classeur cible pour qu'il soit entièrement opérationnel.
    Un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Workbooks.Open Filename:= _
                    "U:\Repertoire\Fichier_Destination.xlsm", _
                    UpdateLinks:=0
        Set Wb = Workbooks("Fichier_Destination.xlsm")
        Appication.OnTime  Now + TimeValue("00:00:01"), "SuiteTraitement"  '///
    End Sub
     
    Sub SuiteTraitement() 'avec transmissions des paramètres qui vont bien OU variables publiques
        For Each VbComp In Wb.VBProject.VBComponents
                    Select Case VbComp.Type
                        Case 1         ' Suppression des 1 = Modules
                            VbComp.Name = "zz_" & VbComp.Name
    ''' etc
    End Sub

Discussions similaires

  1. [XL-2000] bug excel sur modif formule ?
    Par niko8181 dans le forum Excel
    Réponses: 1
    Dernier message: 12/10/2009, 16h31
  2. Objet Entity sur VB ( VBA excel )
    Par elfette dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/06/2007, 12h22
  3. [VBA-E] Requetes depuis Excel sur une Base Access sécurisée
    Par DhiSan dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2006, 18h44
  4. Probleme d'enregistrement sur Macro/VBA de Excel
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/11/2005, 17h23
  5. probleme de selection aleatoire sur excel avec macro vba
    Par guillaume sors dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/10/2005, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo