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 d'un private sub


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
    Formation à l'innovation sociale
    Inscrit en
    Février 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation à l'innovation sociale

    Informations forums :
    Inscription : Février 2017
    Messages : 30
    Par défaut Suppression d'un private sub
    Bonjour à tous,

    Je me permets de vous solliciter car j'ai une petite question à propos d'un projet en cours.

    J'ai monté un système de fiches avec un template.
    On remplit le template, on clique sur un bouton, et ça crée la fiche au bon endroit, au bon nom etc ...

    Pour éviter que mes collègues enregistrent des informations sur le template qui se doit de toujours rester vierge, j'ai ajouté en private sub :
    Application.ThisWorkbook.Saved = True

    Seul problème, quand la fiche se crée, elle garde les private sub du template, et donc cette fonction ci-dessus.
    Cela pourrait prêter à confusion si mes collègues souhaitent modifier une fiche existante.

    Existe-t-il un moyen par VBA de supprimer ce private sub uniquement (j'ai deux autres lignes en private sub que je souhaite conserver lors de la sauvegarde).

    Merci d'avance !

    Arthur

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    La fiche créée à partir du template se situe-t-elle dans le même classeur ou dans un autre classeur?
    Si elle se situe sur le même classeur : plutôt que d'utiliser Application.ThisWorkbook.Saved = True, tu pourrais protéger la feuille contenant le Template et lever la protection au moment où tu créés une fiche à partir du template. Ainsi les fiches ne seront pas protégées et le template, lui le reste.
    Si elle se situe sur une autre classeur : tu peux utiliser la macro évènementielle BeforeSave. Dans cette macro, tu vérifies le nom du classeur. Si le nom du classeur est celui du template, tu agis en conséquence en utilisant l'argument Cancel de la macro : par ex. une MsgBox vbYesNo disant "Attention template! Voulez-vous vraiment enregistrer ?"

  3. #3
    Membre averti
    Homme Profil pro
    Formation à l'innovation sociale
    Inscrit en
    Février 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation à l'innovation sociale

    Informations forums :
    Inscription : Février 2017
    Messages : 30
    Par défaut
    Bonjour Riaolle,

    Merci beaucoup pour ta réponse.
    Lorsque le template est rempli, la macro utilise un save as pour que le classeur "Template" n'apparaisse même plus et qu'il reste seulement le classeur "Fiche-xxx".
    Le "Application.ThisWorkbook.Saved = True" est simplement une sécurité en cas de fausse manip. Avec des non-initiés, on sait jamais.

    Je ne m'explique peut-être pas très clairement mais je bricole en VBA sans avoir de vraies connaissances.

    Peut-être que j'ai mal compris mais la protection du classeur "Template" empêcherait de le remplir ... ?

    Ta solution avec la message box conditionnelle qui n'apparaitrait qu'en cas de fermeture du classeur "template" me parait très bien.

    Pour la mettre en place, je bute un peu.
    Il faudrait (dans l'idée) mettre en private sub "si 'nom de fichier' = "template.xlsm" alors 'msgbox' "template : voulez-vous vraiment sauvegarder" lors de la fermeture" ?

    Par contre pour faire un code propre de tout ça je ne sais pas.
    Je vais commencer à fouiller un peu mais si tu sais par hasard comment faire, je suis preneur !

    Merci encore,
    Arthur

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Voici un tuto sur les evenements dans un classeur et notammen BeforeSave : http://silkyroad.developpez.com/VBA/...lasseur/#LII-7
    Avec l'argument Cancel, tu peux annuler la sauvegarde. Il suffit de créer une condition If et d'annuler la sauvegarde/mettre une msgbox lorsque la condition est vérifiée.
    Ici, tu as tout sur la msgbox : http://fring.developpez.com/vba/excel/msgbox/#L3.1

    Peut-être que j'ai mal compris mais la protection du classeur "Template" empêcherait de le remplir ... ?
    En effet, tu ne peux pas écrire sur une feuille protégée... mais je pense que tu ne vois pas la chose de la même façon que moi.
    J'imagine que tu fais la chose suivante:
    1. Remplir le formulaire à partir du template
    2. Lancer la macro qui copie ce formulaire rempli
    3. Effacer le template

    Tu pourrais plutôt faire la chose suivante :
    1. Lancer une macro qui recopie le template
    2. Remplir le formulaire-copie du template.

    Du coup, dans l'étape 1 : dans la macro, tu peux déprotéger la feuille template, copier la feuille, re-protéger la feuille template, éventuellement fermer le classeur template et activer le nouveau classeur qui sera à remplir. Ainsi, les utilisateurs ne peuvent même pas commencer à changer le template.
    Est-ce que tu comprends?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Arthur,

    VBA te permet d'écrire ou de supprimer du code avec du code. Le code ci-dessous te permettras d'effacer les macros que tu souhaites (à adapter).

    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
     
    'Supprimer une macro précise nommée "Macro1" dans le "Module3".
     
    Sub SupprMacroSpecifie()
     
        Dim Wb As Workbook
     
        Set Wb = Workbooks("Classeur1.xls")
        SupprimerMacroPrecise Wb, "Module3", "Macro1"
     
        'Pour supprimer un procédure évènementielle
        'SupprimerMacroPrecise Wb, "ThisWorkbook", "Workbook_Open"
     
    End Sub
     
     
    Sub SupprimerMacroPrecise(Wb As Workbook, Mdl As String, NomMacro As String)
        Dim Debut As Integer, Lignes As Integer
     
        With Wb.VBProject.VBComponents(Mdl).CodeModule
            Debut = .ProcStartLine(NomMacro, 0)
            Lignes = .ProcCountLines(NomMacro, 0)
            .DeleteLines Debut, Lignes
        End With
    End Sub
    Bonne journée
    Sophie

  6. #6
    Membre averti
    Homme Profil pro
    Formation à l'innovation sociale
    Inscrit en
    Février 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation à l'innovation sociale

    Informations forums :
    Inscription : Février 2017
    Messages : 30
    Par défaut
    Citation Envoyé par Clochete Voir le message
    Bonjour Arthur,

    VBA te permet d'écrire ou de supprimer du code avec du code. Le code ci-dessous te permettras d'effacer les macros que tu souhaites (à adapter).

    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
     
    'Supprimer une macro précise nommée "Macro1" dans le "Module3".
     
    Sub SupprMacroSpecifie()
     
        Dim Wb As Workbook
     
        Set Wb = Workbooks("Classeur1.xls")
        SupprimerMacroPrecise Wb, "Module3", "Macro1"
     
        'Pour supprimer un procédure évènementielle
        'SupprimerMacroPrecise Wb, "ThisWorkbook", "Workbook_Open"
     
    End Sub
     
     
    Sub SupprimerMacroPrecise(Wb As Workbook, Mdl As String, NomMacro As String)
        Dim Debut As Integer, Lignes As Integer
     
        With Wb.VBProject.VBComponents(Mdl).CodeModule
            Debut = .ProcStartLine(NomMacro, 0)
            Lignes = .ProcCountLines(NomMacro, 0)
            .DeleteLines Debut, Lignes
        End With
    End Sub
    Bonne journée
    Sophie
    Bonjour Sophie,

    J'ai regardé ton code qui m'intéresse beaucoup.
    Si j'ai bien compris, pour supprimer une partie de ma private sub, je la cible avec la première sub de ton code, et je choisis les lignes à supprimer avec la deuxième sub de ton code ?
    Je peux donc les mettre à la suite à la fin d'une macro déjà existante ?

    Merci !

    EDIT :

    J'ai essayé ça

    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
     
    Sub SupprMacroSpecifie()
        Dim Wb As Workbook
        Set Wb = Workbooks("Template Fiche - Mac + Windows.xlsm")
        SupprimerMacroPrecise Wb, "ThisWorkbook", "Workbook_Open"
    *
        'Pour supprimer un procédure évènementielle
        'SupprimerMacroPrecise Wb, "ThisWorkbook", "Workbook_Open"
    *
    End Sub
    *
    *
    Sub SupprimerMacroPrecise(Wb As Workbook, Mdl As String, NomMacro As String)
        Dim Debut As Integer, Lignes As Integer
    *
        With Wb.VBProject.VBComponents(Mdl).CodeModule
            Debut = .ProcStartLine(Workbook_Open, 3)
            Lignes = .ProcCountLines(Workbook_Open, 1)
            .DeleteLines Debut, Lignes
        End With
    End Sub
    J'ai une erreur de compilation dès la première ligne

  7. #7
    Membre averti
    Homme Profil pro
    Formation à l'innovation sociale
    Inscrit en
    Février 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation à l'innovation sociale

    Informations forums :
    Inscription : Février 2017
    Messages : 30
    Par défaut
    Hmm, je comprends mieux maintenant oui.

    La seule chose c'est que je n'efface pas le template, vu qu'il est enregistré sous un autre nom grâce à la macro (imaginons "Projet_Arthur.xlsm") donc le template n'est pas enregistré et reviens à sa version d'origine, à savoir vierge.

    Je pense que ce serait compliqué de changer le fonctionnement et de créer une copie dès le début vu que mon équipe s'est déjà familiarisé avec ce fonctionnement depuis un moment. Même si j'admets que cela aurait été plus simple de se lancer la dessus au début...

    Avec la lecture que tu m'as donnée, j'ai ajouté ça
    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
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        If ThisWorkbook.Name = ("Template Fiche - Mac + Windows.xlsm") Then
     
            Select Case MsgBox("Le template ne peut être sauvegardé." & Chr(10) & "En le fermant, vous perdrez toutes les données potentiellement inscrites auparavant.", vbOKCancel, "Attention !")
            Case vbOK
            'procédure si click sur Yes
            ThisWorkbook.Saved = True
     
            Case vbCancel
            'procédure si click sur Cancel
            Cancel = True
            End Select
     
        End If
    End Sub
    J'ai bricolé ça aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        If ThisWorkbook.Name = ("Template Fiche - Mac + Windows.xlsm") Then
        MsgBox "Le template ne peut être sauvegardé." & Chr(10) & "Pour créer une fiche, utilisez le bouton 'Ajouter à la BDD et sauvegarder dans le Drive' en bas de page", vbOKOnly + vbExclamation, "Attention !"
        Cancel = True
        End If
    End Sub
    J'ai pas trop réfléchi car dans la création de la fiche depuis le template, une macro utilise un save as, et donc bien évidemment le private sub_before save casse tout.

    C'est qu'un détail donc je peux m'en passer, sauf s'il existe un moyen d'autoriser les save as et interdire les save tout court (en général une fausse manip se situe plutôt autour du save tout court...)

    Merci beaucoup encore une fois !!

    EDIT : Merci Sophie, je vais jeter un oeil à ça, ça peut être sympa !

Discussions similaires

  1. Private Sub Form_Open . Dim maxi
    Par Nessie37 dans le forum VBA Access
    Réponses: 6
    Dernier message: 08/10/2007, 18h19
  2. code: Private Sub Form_Timer avec condition
    Par WITER dans le forum IHM
    Réponses: 3
    Dernier message: 25/07/2007, 23h33
  3. [VBA] Goto faisant référence en-dehors d'un Private Sub?
    Par Oceliane dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/03/2007, 15h57
  4. Réponses: 9
    Dernier message: 06/06/2006, 22h05
  5. mettre plusieurs private sub sur un bouton ?
    Par juju33 dans le forum Access
    Réponses: 2
    Dernier message: 26/03/2006, 16h22

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