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 :

Modifier une macro avec une autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut Modifier une macro avec une autre
    Bonjour,

    J'ai un petit souci, je dois faire une sorte de "Correction Pack" pour plusieurs gros fichiers Excel. Il doit surtout modifier des formules, donc pas de problème, mais j'aimerais également qu'il ajoute une ligne de code dans une des macros associées au fichier.

    Est-ce que c'est faisable ? Une macro qui en ouvre une autre pour écrire dedans ?

    Merci d'avance !

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Oui, tu peux faire ça mais tu dois disposer, dans la macro à modifier, d'une ligne pour placer ta ligne de code. Il ne te reste plus qu'à indiquer le N° de ligne pour insérer ta ligne.
    Dans ce code, je modifie le nom d'un répertoire ligne 25 du module 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        msg = "    Chemin = " & """" & msg & """"
        Application.VBE.CodePanes(2).CodeModule.ReplaceLine 25, msg
    A adapter (!)
    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Merci ! J'aurais besoin de quelques précisions : ma macro doit modifier une macro située dans un autre fichier, préalablement ouvert. Ta ligne de code fonctionnera quand même, sans préciser dans quel fichier taper ?

    Et pour modifier du code lié à une feuille précise (genre Sheet2) et non à un module, il faut mettre quoi à la place de CodeModule ?

    Merci, merci, merci !

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Place ce code dans un module et exécute le.
    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
    Sub EcrireCodeNimporteOu()
    Dim i, NomFich, x As Long, LeCode(1 To 13)
    Dim NomClasseur As String, NoFeuil As String
    Application.Workbooks.Add
    NomClasseur = ActiveWorkbook.Name
    NomFeuil = "Feuil1"
        LeCode(1) = "Private Sub Worksheet_Deactivate()"
        LeCode(2) = "Dim msg"
        LeCode(3) = "    msg = ""Après avoir beaucoup cherché sur le Web"" &  vbcr"
        LeCode(4) = "    msg = msg & ""Et suite à une méchante galère"" &  vbcr"
        LeCode(5) = "    msg = msg & ""J'ai trouvé un site super"" & vbcr"
        LeCode(6) = "    msg = msg & ""Où je peux enfin me défouler"" & vbcr"
        LeCode(7) = "    msg = msg & ""A glisser des trucs perverts"" & vbcr"
        LeCode(8) = "    msg = msg & ""Dans des codes élaborés"" & vbcr"
        LeCode(9) = "    msg = msg & ""Conclusion :"" & vbcr"
        LeCode(10) = "    msg = msg & "" Ne faites jamais confiance dans les codes qu'on vous passe"" & vbcr"
        LeCode(11) = "    msg = msg & "" Assurez-vous de l'avoir compris avant de dire """"Youpi !"""""
        LeCode(12) = "    msgbox msg"
        LeCode(13) = "End sub"
        Set Wb = Workbooks(NomClasseur)
        With Wb.VBProject.VBComponents(NomFeuil).CodeModule
            For i = .CountOfLines To 1 Step -1
                .DeleteLines i
                DoEvents
            Next
            For j = 1 To UBound(LeCode)
                .InsertLines j, LeCode(j)
            Next
        End With
        Workbooks(NomClasseur).Worksheets(2).Select
    End Sub
    Tu sauras adapter ?
    A+

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    C'est malin ça

    Plus sérieusement, avant d'avoir ta réponse j'ai fait d'autres recherches, et j'ai un vrai souci avec le nom de ma feuille on dirait.

    Je fais simplement ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    With ThisWorkbook.VBProject.VBComponents("Sheet2").CodeModule
        .ReplaceLine 16, "Worksheets(""BCS Information"").Range(""A1:CC6000"").Select"
    End With
    Et j'ai une erreur 9, l'indice n'appartient pas à la sélection. Ca a fonctionné une fois, et là nan. Je dois ajouter une ligne pour déprotéger le code ?
    Ma feuille est cachée par défaut, mais même affichée, mon code m'envoie promener...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Déjà, là, tu fais ça dans le classeur contenant la macro.
    Essaie d'adapter mon code. Lui, il fonctionne. Sinon je vais être obligé de te poser plein de nouvelles questions.
    Ex :
    Tu as bien une feuille qui se nomme "Sheet2"
    Tu as bien une ligne 19 ?
    As-tu une feuille nommée "BCS Information" dans ton classeur ?
    etc.
    A+

    PS - Je pense "de préférence" que la feuille "BCS Information" n'existe pas dans le classeur dans lequel se trouve ta macro.

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Ben non justement, la macro du classeur 1 doit modifier le code d'une macro du classeur 2.

    Classeur 2 dans lequel existent bien ma feuille Sheet2, appelée BCS Information, et dans le code de laquelle figure bien une ligne 16

    Edit : bon, je me tais, j'ai viré le "ThisWorkbook" pour mettre Workbooks(monClasseur), et j'ai une nouvelle erreur, qui me dit justement que l'opération est impossible tant que le projet est protégé. Comment on demande le déverouillage ?

    Merci

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Relis mon code.
    Tu mets ThisWorkbook.VBProject..... etc
    ThisWorkbook est le classeur qui contient la macro que tu exécutes, pas le classeur2. Et donc, tu cherches à écrire ton code dans une feuille du classeur Thisworkbook.name
    Test ce code, avant ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With ThisWorkbook.VBProject.VBComponents("Sheet2").CodeModule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox Thisworkbook.name
    Tu dois nommer le bon classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("LeBonClasseur.xls"). tcestesrats...

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Oui oui merci, ça roule, j'ai juste à délocker le code, mais il semblerait que ce ne soit pas possible, pas avec une ligne de code précise.

    Si tu as une idée... Sinon, le problème initial est résolue, merci beaucoup !!!

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si, ReplaceLine permet bien de remplacer une ligne précise. Le seul problème est de ne pas se tromper de classeur ni de module.
    Fais tout de même très attention, on a vite fait de remplacer une ligne là où il ne faut pas.

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Mh, je me suis mal exprimé en fait, je développe :

    L'ajout de la ligne fonctionne, aucun souci.

    MAIS, ma macro sera exécutée par des utilisateurs lambda, sur des fichiers dont le code VBA est verrouillé par un mot de passe. Je ne peux pas demander aux utilisateurs d'ouvrir la console de code pour déverrouiller le code à la main, ils n'ont ni les compétences (ah là là), ni le mot de passe. Il faut donc que mon code :
    - retire la sécurité sur le code
    - ajoute la ligne

    Pas besoin de reverrouiller, personne n'y retouchera et la fermeture du fichier entraîne un verrouillage automatique.

    Le problème n'est donc plus dans l'ajout de la ligne, qui fonctionne très bien, mais dans le fait qu'Excel refuse la modification du code tant que le projet est verrouillé...

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu as cherché sur le forum s'il n'y avait pas la possibilité de déverrouiller les macros par le code ?
    Je ne suis pas sûr d'une solution mais j'ai vu la question passer.
    Je regarde mais sans garantie.
    A+

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Trouvé !
    Regarde ici
    A+

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Parfait !!! Ca fonctionne nickel, merci ouskel'n'or !!

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Et merde, en fait non, ça marche pas, j'ai une erreur qui me dit que le code est protégé, plus une boite de dialogue qui me réclame le code de déprotection, malgré le fait qu'il figure dans le code de ma macro sensée déverrouiller justement

    Edit : je fais quelques recherches, je posterai quand je serai vraiment vraiment bloqué ou quand j'aurai la solution, pour information et pour la postérité

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Bon, je reviens vers vous après avoir creuser le sujet.

    J'utilise la fonction suivante pour déprotéger mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
      Dim vbProj As Object
     
      Set vbProj = WB.VBProject
     
       If vbProj.Protection <> 1 Then Exit Sub
     
      Set Application.VBE.ActiveVBProject = vbProj
     
       SendKeys Password & "~~", True
      Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
    End Sub
    Cette fonction est retrouvée sur plein de forums, et semble fonctionner, mais dans mon cas, elle me sort un "mot de passe incorrect" et me redemande de le taper, alors qu'il est sensé être en dur dans le code et ne pas apparaître aux yeux des utilisateurs qui vont lancer la macro, justement. Il est hors de question que ce soit eux qui le tapent à la main

    Voilà comment j'appelle ma fonction :

    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
    Sub CorrectionPack1()
        
        'On Error GoTo ERROR_NO_FILE
        
        WRK_FN = Range("H12").Text
        
        UnprotectVBProject Workbooks(WRK_FN), "97654321"
        
        With Workbooks(Range("H12").Text).VBProject.VBComponents("Sheet2").CodeModule
            .ReplaceLine 16, "Worksheets(""BCS Information"").Range(""A1:CC6000"").Select"
        End With
     
        WRK_SN = "Cover"
        
        Workbooks(WRK_FN).Sheets(WRK_SN).Unprotect Password:="14728369"
       
        Workbooks(WRK_FN).Sheets(WRK_SN).Range("A44").Value = "FC1.MTS.29022008"
        
        Workbooks(WRK_FN).Sheets(WRK_SN).Protect Password:="14728369", DrawingObjects:=True, Contents:=True, Scenarios:=True
    
        ProtectVBProject Workbooks(WRK_FN), "97654321"
        
        Workbooks(WRK_FN).Save
        
        GoTo NO_ERROR
        
    ERROR_NO_FILE:
        
        MsgBox ("No file found! - Please open the file before continue.")
        Exit Sub
        
    NO_ERROR:
        MsgBox ("MTS File has been updated & saved !!!")
    End Sub
    Le mot de passe en dur est évidemment le bon, mais ça ne passe pas. Au secouuuuuuuuuuuuuuuuuuuurs !!!

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Je n'ai jamais eu à le faire mais as-tu testé en plaçant l'appel à ta procédure dans ThisWorkbook ? (au de le placer dans la macro CorrectionPack1() )
    A tout hasard.
    Je vais tester ta macro qui "va bien" sur tous les forum
    A+

  18. #18
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Je tente de placer des choses dans ThisWorkbook, mais comme je suis une bille en VBA (hum, j'ai pas beaucoup pratiqué je veux dire), ça ne fonctionne pas, l'exécution ne passe pas par mon code.

    Dans le code de ma feuille Excel (il n'y en a qu'une), j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub cmdUnprotectCharts_Click()
     
    On Error GoTo ERROR_NO_FILE
     
    CorrectionPack1
     
    Exit Sub
     
    ERROR_NO_FILE:
     
        MsgBox ("No file found! - Please open the file before continue.")
    End Sub
    J'ai essayé de mettre la même chose dans Thisworkbook, mais peine perdue. Je sais, je pose quelques questions bêtes, mais comment je dois m'y prendre, please ?

    Merci ouskel'n'or

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ne cherche pas, ça ne fonctionne pas mieux (V2003)
    En outre, je pense que si tu souhaites accéder au code, c'est pour une maintenance éventuelle, et donc pas à l'ouverture du fichier...
    Je ne vais pas m'éterniser sur la question, alors je te souhaite de trouver LA solution... mais si tu trouves, n'hésite pas à la mettre sur le forum et même dans "Contribuez VBA-Excel" qu'on ne meure pas idiot
    Alors, courage !

  20. #20
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    OK OK, je suis sous 2003 aussi...

    Bien, je continue, et si je trouve, je contribuerai, merci en tout cas

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [XL-2010] Modifier une macro avec une autre macro
    Par bifconsult dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/03/2012, 15h30
  3. [XL-2003] Désactiver une macro avec une macro
    Par Sibuxian dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/10/2010, 00h54
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. Réponses: 4
    Dernier message: 15/10/2009, 13h33

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