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 :

Beug avec ActiveWorkbook.Save dans un module


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pourrais-tu, en français et sans aucune notion Excel ou VBA, nous expliquer ce que tu as devant toi comme classeurs et ce que tu souhaites réaliser? il ne sert à rien à rien de patcher du code si la situation de départ n'est pas claire, si l'objectif n'est pas clairement défini. Ce n'est que comme ça qu'on pourra s'en sortir.

    Exemple:
    • J'ai un classeur nommé travail.xlsm.
    • Je veux en sauver une copie de sauvergarde à un moment donné (quel moment, comment est-il détecté, ...?;
    • Après, je veux supprimer une feuille nommée x;
    • Etc
    • Etc
    • Etc



    Sans ça, c'est peine perdue. Tu nous parles de ThisWorkbook mais tout classeur est potentiellement ThisWorkbook comme tout classeur est potentiellement ActiveWorkbook. Cela ne nous mène à rien.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  2. #2
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    J'ai un classeur Planning Chevalley.xlsm contenant plusieurs feuilles nommées : "Interventions" "DATA_Jours_Fériés" "DATA_Interventions Fiche_de_travail"

    J'aimerai créer un nouveau classeur nommé Copie du planning.xlsx contenant la feuille Interventions renommées Planning et la copie de la feuille DATA_Jours_Fériés.

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Methode Copy sans destination, à appliquer à la Worksheet source.
    Ca créera un nouveau fichier. Il suffira ensuite de le nommer avec un SaveAs.
    Lire ça : https://msdn.microsoft.com/fr-fr/lib...4(v=office.15)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ce n'est pas possible que tu aies une feuille nommée "DATA_Interventions Fiche_de_travail", car il y a trop de caractères. La longueur maximale d'un nom d'onglet est de 31 caractères.

    Voici une procédure qui fait exactement ce que tu souhaites (si on accepte que la copie soit enregistrée dans le même dossier). Puisque le classeur est nouveau, il ne saurait être question qu'il possède une feuille Planning,. Ca ne sert donc à rien de tester l'existence de la feuille.

    • Lors de la copie des deux feuilles, un nouveau classeur est automatiquement créé et il devient le classeur actif. On le récupère dans une variable car on en aura besoin plus tard, puis on réactive le classeur Chevalley qui est en fait le ThisWorkbook (celui qui contient la macro en train de s'exécuter).
    • On renomme la feuille dans le classeur de sauvegarde
    • On ferme la sauvegarde en la nommant



    On entoure cela d'une gestion d'erreur, indispensable lorsque l'on pilote des trucs hors classeur.

    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
    Sub CreateCopy()
      Dim Target As Workbook
     
      On Error GoTo Catch
      Application.ScreenUpdating = False
      Sheets(Array("Interventions", "DATA_Jours_Fériés")).Copy
      Set Target = ActiveWorkbook
      ThisWorkbook.Activate
      Target.Worksheets("Interventions").Name = "Planning"
      Target.Close True, ThisWorkbook.Path & "\Copie du planning.xlsx"
     
    Catch:
      If Err <> 0 Then MsgBox "L'erreur suivante est survenue:" & vbLf & Err.Description, vbExclamation, "Erreur " & Err.Number
      Application.ScreenUpdating = True
    End Sub

    Cette procédure, qui prend réellement 6 lignes applicatives, doit être appelée au moment opportun (clic sur un bouton, avant fermeture de Chevalley, ...). Evite toujours de mettre du code applicatif dans une procédure événementielle. Comme je te l'ai déjà dit ailleurs, crée des procédures autonomes que tu peux tester en dehors d'un contexte précis (ici, un événement qui survient), et appelle ce code lors de la survenance de l'événement.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    Merci Menhir,
    Le code que vous m'avez indiqué, placé dans ThisWorkbook Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Fonctionne tout comme le mien avec l'enregistrement via le raccourcis clavier CTRL+S ou en cliquant sur la disquette de la barre d'outils Excel

    Mais NE FONCTIONNE PAS avec ActiveWorkbook.Save dans le module1

    Pourriez-vous faire le test avec un fichier, car j'ai peut-être un problème dans ma version Office365 ...

    Merci
    Philippe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Worksheets("Sheet1").Copy
    With ActiveWorkbook
         .SaveAs Filename:=Environ("TEMP") & "\New1.xlsx", FileFormat:=xlOpenXMLWorkbook
         .Close SaveChanges:=False
    End With
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit
    Sub Bouton_Save_Click()
        ActiveWorkbook.Save
    End Sub

  6. #6
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    Merci Pierre,

    Même résultat, et même réponse qu'à Menhir rien ne fonctionne avec ActiveWorkbook.Save

    Merci Menhir,
    Le code que vous m'avez indiqué, placé dans ThisWorkbook Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean).

    Fonctionne tout comme le mien avec l'enregistrement via le raccourcis clavier CTRL+S ou en cliquant sur la disquette de la barre d'outils Excel

    Mais NE FONCTIONNE PAS avec ActiveWorkbook.Save dans le module1

    Pourriez-vous faire le test avec un fichier, car j'ai peut-être un problème dans ma version Office365 ...

    Merci
    Philippe

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    ActiveWorkbook.Save, c'est UNE ligne de code... Ca ne saurait pas appeler la macro que je t'ai donnée. Tu as du code événementiel dans le thisworkbook de Chevalley? Si oui, donnne-le.

    Tu as probablement des trucs pas nets dans la procédure Workbook_BeforeSave, par exemple. Tu devrais avoir ceci, et ça fonctionne très bien


    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      CreateCopy
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par goninph Voir le message
    Pourriez-vous faire le test avec un fichier
    Non

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par goninph Voir le message
    [...]ActiveWorkbook.Save dans le module1[...]

    Pas ActiveWorkbook.Save, mais plutôt ThisWorkbook.Save, sinon, tu sauves le classeur actif et pas le classeur qui contient la macro... Et ça, ça n'enclenchera pas l'événement Workbook_BeforeSave du classeur Chevalley (sauf si ActiveWorkbook et ThisWorkbook représentent le même classeur, mais ce n'est pas toujours le cas...)

    • ThisWorkbook => classeur qui contient la macro qui est en train de s'exécuter
    • ActiveWorkbook => Classeur qui est en avant-plan dans l'environnement Excel



    Parfois, les deux pointent vers le même classeur, parfois pas, en fonction du contexte.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Voilà le fichier. Teste en mettant éventuellement un point d'arrêt sur la ligne CreateCopy dans la procédure événementielle du ThisWorkbook.
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    Pierre, le code fonctionne comme tous les autres avec le raccourcis clavier CTRL+S ou en cliquant sur la disquette de la barre d'outils Excel

    Mais je me suis mal expliqué :

    Je veux déclencher l'enregistrement du classeur avec un bouton placé sur la feuille Interventions auquel j'ai affecté la macro Bouton_Save_Click contenant la seule et unique ligne de code ActiveWorkbook.Save

    Pour ce faire j'ai placé le code ci-dessous dans le module1 pour lancer l'enregistrement.

    Lors de chaque enregistrement, je veux mettre à jour (remplacer) le classeur Copie du planning.xlsx

    Avez-vous essayé de lancer la macro ActiveWorkbook.Save, car chez moi la macro ne créer pas le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Bouton_Save_Click()
        ActiveWorkbook.Save
    End Sub





    Citation Envoyé par Pierre Fauconnier Voir le message
    Voilà le fichier. Teste en mettant éventuellement un point d'arrêt sur la ligne CreateCopy dans la procédure événementielle du ThisWorkbook.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    ActiveWorkbook.Save NE LANCE PAS LA MACRO!! Ca ne fait que sauver le classeur actif! Point barre! (Voir mon message #26 qui t'expliquait déjà cela)

    Si tu veux qu'une macro (la tienne, la mienne, celle que tu veux) fasse son boulot lorsque tu utilises la ligne ActiveWorkbook.Save, tu DOIS LE PRECISER en plaçant le code suivant (qui appelle MA macro) dans le module ThisWorkBook de ton classeur Chevalley. Sans ce bloc de code événementiel, la macro CreateCopy n'est pas lancée lors de l'enregistrement (ActiveWorkbook.Save).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      CreateCopy
    End Sub
    Je t'ai créé un classeur qui modélise EXACTEMENT ce que tu dois mettre en place et je t'ai dit comment le tester!


    Nom : 2019-09-26_154207.png
Affichages : 468
Taille : 22,5 Ko


    Nom : 2019-09-26_154227.png
Affichages : 453
Taille : 33,3 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Cela dit, ce n'est pas une bonne idée de mettre un bouton appelant une macro sur une feuille que tu vas copier sur un nouveau classeur, xlsx qui plus est. Ca ne saurait que créer des soucis, puisque tu vas lier ton nouveau classeur à ton ancien par un appel de macro. Je doute que ça puisse fonctionner avec un xlsx, d'ailleurs.


    A quoi sert ce bouton? L'utilisateur n'est pas capable de cliquer sur la disquette ou de faire Ctrl+S?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    La macro copie les feuilles dans le nouveau classeur Copie du planning.xlsx, dés que les feuilles sont dans le nouveau classeur la macro supprime tous les Shapes, pas besoin de bouton dans la copie, c'est uniquement pour consultation et portabilité sur un téléphone portable par exemple.

    Lors de l'ouverture du fichier principal Planning Chevalley.xlsm, le fichier est en FullScreen et la barre d'outils est cachée ..., afin d'afficher un maximum d'éléments sur le petit écran du Microsoft Surface Pro et pouvoir rendre plus accessible le bouton SAVE au (gros) doigt de l'utilisateur.

    En ouvrant cette discussion je ne pensais pas vous donnez autant de travail, désolé




    Citation Envoyé par Pierre Fauconnier Voir le message
    Cela dit, ce n'est pas une bonne idée de mettre un bouton appelant une macro sur une feuille que tu vas copier sur un nouveau classeur, xlsx qui plus est. Ca ne saurait que créer des soucis, puisque tu vas lier ton nouveau classeur à ton ancien par un appel de macro. Je doute que ça puisse fonctionner avec un xlsx, d'ailleurs.


    A quoi sert ce bouton? L'utilisateur n'est pas capable de cliquer sur la disquette ou de faire Ctrl+S?

  15. #15
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    ActiveWorkbook.Save NE LANCE PAS LA MACRO!! Ca ne fait que sauver le classeur actif! Point barre!

    OK, mais si je suis pas à pas le déroulement (avec la touche F8) de l'action ActiveWorkbook.Save, on passe par Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) contenant la macro CreateCopy par ex., c'est correct ?

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Oui, c'est correct. le problème venait du bouton sur la feuille et de la sauvegarde au mauvais format, car après Test, ça plante, évidemment...

    Tu dois sauver ton fichier en xlsm avec la macro suivante, par exemple, puisque tu y intègres un bouton qui appelle une macro

    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
    Sub CreateCopy()
      Dim Target As Workbook
     
      On Error GoTo Catch
      Application.ScreenUpdating = False
      Sheets(Array("Interventions", "DATA_Jours_Fériés")).Copy
      Set Target = ActiveWorkbook
      ThisWorkbook.Activate
      Target.Worksheets("Interventions").Name = "Planning"
      Target.SaveAs Filename:=ThisWorkbook.Path & "\Copie du planning.xlsm", FileFormat:=XlFileFormat.xlOpenXMLWorkbookMacroEnabled
      Target.Close False
     
    Catch:
      If Err <> 0 Then MsgBox "L'erreur suivante est survenue:" & vbLf & Err.Description, vbExclamation, "Erreur " & Err.Number
      Application.ScreenUpdating = True
    End Sub
    Dans le module 1, tu as aussi le code suivant, qui sauve simplement le classeur, et c'est l'appel à CreateCopy dans Workbook_BeforeSave qui réalise l'opération.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub SaveAndCopy()
      ThisWorkbook.Save
    End Sub
    Et c'est cette macro SaveAndCopy qui va être associée au bouton placé sur la feuille.




    Je persiste néanmoins à dire que c'est une mauvaise idée de mettre le bouton sur la feuille qui est copiée, car ton bouton va pointer vers la macro du fichier d'origine. Fais clic droit sur le bouton dans ta copie de sauvegarde puis "Affecter une macro" pour voir que le chemin du fichier source est renseigné, comme le montre la copie d'écran du classeur de sauvegarde. A mon avis, pas une bonne idée!

    Nom : 2019-09-26_160544.png
Affichages : 422
Taille : 9,3 Ko
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Et ça fonctionne, maintenant?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    Pierre Fauconnier, sur votre PC, le fichier du message #34 créer la copie en appuyant sur le bouton 1 ?

    Chez moi pas de copie crée avec le bouton 1 de la feuille, pas contre CTRL+S la copie se créer

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Non

    Même scénario: CTRL+S => Ok... Bouton => pas ok...

    On va changer la manoeuvre:

    Modifie la macro en lui passant un argument booléen optionnel pour ne pas lancer une deuxième fois l'enregistrement si la macro de copie est appelée sur le CTRL+S, et en lui faisant enregistrer le classeur si pas appelée par le CTRL+S (ligne en fin de macro If Not CalledBySave.... Tu connecteras le bouton sur cette macro

    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
    Sub CreateCopy(Optional CalledBySave As Boolean)
      Dim Target As Workbook
     
      On Error GoTo Catch
      Application.ScreenUpdating = False
      Sheets(Array("Interventions", "DATA_Jours_Fériés")).Copy
      Set Target = ActiveWorkbook
      ThisWorkbook.Activate
      Target.Worksheets("Interventions").Name = "Planning"
      Target.SaveAs Filename:=ThisWorkbook.Path & "\Copie du planning.xlsm", FileFormat:=XlFileFormat.xlOpenXMLWorkbookMacroEnabled
      Target.Close False
      If Not CalledBySave Then ThisWorkbook.Save
    Catch:
      If Err <> 0 Then MsgBox "L'erreur suivante est survenue:" & vbLf & Err.Description, vbExclamation, "Erreur " & Err.Number
      Application.ScreenUpdating = True
    End Sub
    Dans la macro événementielle, tu auras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      CreateCopy True
    End Sub



    Actuellement, je ne m'explique pas ce comportement...
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #20
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    Je vais corriger et vous tiens informé

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Attribut Save dans un module
    Par Elabdine dans le forum Fortran
    Réponses: 1
    Dernier message: 23/10/2014, 07h52
  2. Probleme avec "Dim n as integer" dans un module
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/09/2011, 20h47
  3. Réponses: 2
    Dernier message: 26/09/2010, 19h02
  4. erreur avec withevents dans un module de classe
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/12/2007, 04h32
  5. Réponses: 3
    Dernier message: 29/05/2007, 20h37

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