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 :

Suppression de module par du VB ne fonctionne plus!


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut Suppression de module par du VB ne fonctionne plus!
    Bonjour à tous,

    Voici mon problème :

    J'ai créer une petite macro qui parcoure des classeurs afin de supprimer un module de chacun et d'en réimporter un autre, une forme de mise à jour en fait.

    Ce code fonctionnait et voila qu'il ne fonctionne plus !
    En fait ...VBComponents.Remove.... ne supprime pas le module, du coup quand je réimporte le nouveau module, celui-ci voit son nom modifié.

    Si dessous mon bout de code, j'ai tout essayer, la syntaxe devrait etre bonne mais ca ne fonctionne pas. Pourtant en essayant d'importer, exporter, ajouter des lignes ou en supprimer, tout fonctionne avec les memes arguments... Alors je ne comprend pas !

    Merci d'avance à quiconque pourra m'aider !


    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
    Do While fichier <> ""
        ProgBarValue = k / i
        frmProgBar.ListProg.AddItem "Traitement de " & fichier
        Call ProgressBar
        Workbooks.Open chemin & fichier
        Set Classeur = Workbooks(fichier)
        On Error Resume Next
        For j = 1 To Classeur.VBProject.VBComponents.Count
            If Classeur.VBProject.VBComponents.Item(j).Name = "Module11" Then
                Classeur.VBProject.VBComponents.Remove Classeur.VBProject.VBComponents.Item("Module11")
                Classeur.VBProject.VBComponents.Import (Correctif)
                Classeur.Sheets(1).Unprotect ("alexandre")
                Classeur.Sheets(1).Range("chek").FormulaR1C1 = "=IF(entree_nominale^2+tol_sup_entree_a^2+tol_inf_entree_a^2=0,""Empty"",IF(RC[7]<>0,""NOk"",""OK""))"
                Classeur.Sheets(1).Protect ("alexandre"), DrawingObjects:=False, Contents:=True, Scenarios:= _
            False, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True
               Exit For
            End If
        Next j
        On Error GoTo 0
        Workbooks(fichier).Close True
        fichier = Dir
        k = k + 1
    Loop

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Excel VBA patch de module
    Bonjour a.floranc,

    1. Changement d'environnement

    Citation Envoyé par a.floranc Voir le message
    Ce code fonctionnait et voila qu'il ne fonctionne plus !
    Qu'est-ce qui a changé dans l'environnement ? Nouvelle version d'Excel ? Nouvelle version de Windows ? Feuille de calcul protégée ? Mieux précisez le contexte.

    2. Gestion d'erreur

    La première chose que l'on voit est que
    se trouve à l'intérieur de la boucle principale Do While fichier <> ""
    juste avant la boucle sur les modules For j = 1 To Classeur.VBProject.VBComponents.Count

    On se pose des questions d'autant plus que
    est rejeté quand tout est terminé après la boucle For.
    Pas facile d'identifier la cause initiale de la 1ere erreur et son éventuelle propagation.

    Mettre en commentaire le On Error Resume Next et le On Error Goto 0.
    Si c'est absolument nécessaire, limiter l'usage du déroutement de la gestion d'erreur à l'instruction suivante et restaurer immédiatement la gestion d'erreur standard On Error Goto 0. Dans tous les cas On Error Resume Next n'est pas à mettre devant un For.

    3. Y a-t-il une erreur lors du Remove du Module11 ?

    Citation Envoyé par a.floranc Voir le message
    Pourtant en essayant d'importer, exporter, ajouter des lignes ou en supprimer, tout fonctionne avec les mêmes arguments...
    Quand est-il de l'effacement complet du module puisque c'est le point clé du problème ?

    Sur une copie de travail (pas un .xls officiel),
    mettre un point d'arrêt sur reconnaissance du Module11 dans la partie Then du If et lancer la mise à jour.

    Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Classeur.VBProject.VBComponents.Remove Classeur.VBProject.VBComponents.Item(j)
    Le Module11 devrait être effacé, ce qui ne pose pas de problème puisque c'est une copie.

    Notez le code et l'éventuel message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? CStr(Err.Number) + ": " + Err.Description
    0:
    Zéro si pas d'erreur.

    4. Maquette de UpdateModule()

    C'est clair que l'on pourrait trouver plus descriptif que les indices ayant comme nom une seule lettre i, j, k.
    Cela serait plus clair avec le Module1 de la maquette suivante dans une nouvelle feuille de calcul vide :
    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
    Option Explicit
    ' VBE menu "Tools" > "Reference"
    ' [x] Microsoft Visual Basic for Applications Extensibility
     
    Sub UpdateModule()
    Const nameModuleRemove = "Module11"
    Const filenameModule = "Module11.bas" ' Correctif
    Dim classeur As Workbook, indMod As Integer, vbCmpMod As VBIDE.VBComponent
     
        Set classeur = ThisWorkbook
        With classeur.VBProject.VBComponents
            On Error Resume Next
            Set vbCmpMod = .Item(nameModuleRemove)
            On Error GoTo 0
            If Not vbCmpMod Is Nothing Then
                .Remove vbCmpMod
                .Import ThisWorkbook.Path + "\" + filenameModule
                'SheetPatch classeur ' Not tested
            End If
        End With
    End Sub
     
    Sub SheetPatch(classeur As Workbook)
    Const nameAuthor = "alexandre"
    Const indSheetPatch = 1
    Const nameRangePatch = "chek"
    Const formulaPatch = "=IF(entree_nominale^2+tol_sup_entree_a^2+tol_inf_entree_a^2=0,""Empty"",IF(RC[7]<>0,""NOk"",""OK""))"
     
        With classeur.Sheets(indSheetPatch)
            .Unprotect nameAuthor
            .Range(nameRangePatch).FormulaR1C1 = formulaPatch
            .Protect (nameAuthor), DrawingObjects:=False, Contents:=True, _
                Scenarios:=False, AllowSorting:=True, AllowFiltering:=True, _
                AllowUsingPivotTables:=True, AllowFormattingColumns:=True, _
                AllowFormattingRows:=True
        End With
    End Sub
    5. Session de debug avec UpdateModule()

    Pour que le type VBIDE.VBComponent soit reconnu :
    Cliquez sur le VBE menu "Outils" > "Reference"
    Cochez [x] Microsoft Visual Basic for Applications Extensibility

    VBE menu "Insérer" > "Module"
    Dans ses propriétés, renommer le en : Module11
    Dans sa fenêtre d'édition, copier-coller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    ' Patch
    Exportez le Module11 manuellement :
    VBE menu "Fichier" > "Exporter fichier"
    Nom de sauvegarde : Module11.bas
    Répertoire de sauvegarde : le répertoire du .xls de test

    Dans la fenêtre d'Edition du Module11 :
    Supprimez le commentaire en vert. Le code n'a plus qu'une seule ligne.
    Fermez sa fenêtre d'Edition. On considère que le Module11 n'est pas ouvert dans le VBE lors de la mise à jour.

    Dans la fenêtre d'Edition de Module1, mettre un point d'arrêt sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set vbCmpMod = .Item(nameModuleRemove)
    Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
    La ligne Set vbCmpMod = .Item(nameModuleRemove) devient jaune.
    Clic sur Pas à pas principal (Shift+F8) [Step Over] jusqu'à atteindre :
    devient jaune.
    Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE :
    Module11

    Clic sur Pas à pas principal (Shift+F8) [Step Over]
    Module11 disparait de la fenêtre projet du VBE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    .Import ThisWorkbook.Path + "\" + filenameModule
    devient jaune.

    Clic Run (F5)
    Module11 est réapparu dans le projet VBE.

    Double-clic sur Module11 dans la fenêtre projet du VBE.
    Sa fenêtre d'édition montre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    ' Patch
    démontrant que Module11 a été patché.

    6 Usage de UpdateModule()

    Enlever le point d'arrêt.
    Dans le Module11, supprimez le commentaire vert puis fermez la fenêtre d'Edition.

    Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
    Réouvrir le Module11, le commentaire vert 'Patch est réapparu.

    On n'a pas eu besoin de dérouter la gestion d'erreur par le On Error Resume Next puis la restaurer par On Error Goto 0.

    Une autre approche alternative à l'effacement suivi de l'import du correctif serait de sélectionner automatiquement toutes les lignes du Module11, de les effacer puis de les remplacer par le correctif.

    Avertissement : toute autre utilisation qu'une mise à jour officielle de Module11 n'est pas recommandée.
    ___________

    Si la discussion est résolue, vous pouvez cliquer sur le bouton

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

Discussions similaires

  1. Classement par ordre alphabétique ne fonctionne plus
    Par Alixam dans le forum Bibliographies - Index - Glossaires
    Réponses: 2
    Dernier message: 07/08/2012, 15h51
  2. Suppression ligne dessiner par canvas
    Par bhahmed dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/09/2006, 04h36
  3. Réponses: 6
    Dernier message: 07/05/2006, 16h31
  4. nombre module par application?
    Par Junior_jef dans le forum Access
    Réponses: 2
    Dernier message: 04/04/2006, 15h51
  5. [sybase] Suppression de tables par lot
    Par Higgins dans le forum Sybase
    Réponses: 2
    Dernier message: 30/09/2004, 16h42

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