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 :

Duplication de feuille sans useform et sans code VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut Duplication de feuille sans useform et sans code VBA
    Voila,

    Je cherche à copier, à l'aide d'un bouton, un modèle de document afin de l'enregistrer sur un ficher spécifique (dépendant des valeurs saisi sur le modèle), et ensuite l'envoyer par mail ou de l'imprimer (si pas de mail)

    J'ai donc une feuille modèle; bourée de marco et de code VBA qui contient le fameux bouton "générer" pour créer le résultat.

    Je ne sais pas comment faire cela sachant que lorsque je clique sur le bouton générér, je souhaite dupliquer la feuille avec les conditions suivantes :

    -> Je voudrais que la nouvelle feuille dupliquée n'est pas le code VBA du modèle
    -> Que le bouton "générer" du modèle soit supprimé de la feuille dupliquée
    -> Que les formule du modèle soit remplacées par les valeurs dans la feuille dupliquée

    Avez vous une idée ? Merci d'avance !

  2. #2
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonsoir,

    Voici une façon de faire :

    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
    Sub NewClasseurSansVBA()
    ' ***************************************************************************************
    ' Cette sub supprime tous les objets de la collection Shapes sur la feuille créée       *
    ' Cette sub NE DOIT DONC pas être utilisée si la feuille active contient des objets     *
    ' de la collection Shapes à conserver                                                   *
    ' ***************************************************************************************
    Dim s As Shape
        ' Création du classeur
        ThisWorkbook.Sheets(1).Copy
        ' Suppression des objets de la collection Shapes dont le(s) bouton(s).
            For Each s In ActiveSheet.Shapes
                s.Delete
            Next
        ' Suppression du code de la feuille active
            With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
                .DeleteLines 1, .CountOfLines
            End With
    End Sub
    NB - Il faut avoir coché la référence "Microsoft Visual Basic for Applications Exensibility X.x"

    A ta disposition pour toute information complémentaire. Selon ton niveau, quelques lignes peuvent suffire ou plusieurs pages peuvent être nécessaires !

    Joyeux Noël

    Michel Gaboly

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    Merci pour ta réponse. Cependant, je dois envoyer ce document par mail apres. l'option COPY de la worksheet ne crée pas un fichier sauvegardé. Comment puis je faire pour le sauver et récupérér son nom de fichier pour l'envoyer par mail puis le supprimer après ?

    Sais tu aussi comment remplacer les formules par les valeurs ?

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  5. #5
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonjour,

    Je ne t’avais donné le code que pour la partie techniquement complexe.

    Le reste est quasi trivial, et tu peux l’obtenir en adaptant à peine le résultat obtenu par enregistrement automatique :

    1. Démarre l'enregistrement automatique
    2. Crée un nouveau classeur, puis saisis quelque chose dans une cellule au moins.
    3. Sélectionne ensuite la plage avec les données que tu as entrées, copie-les puis fais un copiage spécial valeurs.
    4. Enregistre-le : tu devras entrer le nom sous lequel il doit être enregistré.
    5. Arrête l’enregistrement auto.


    Tu as pratiquement ton code.

    Les seules modifs importantes à effectuer sont la sélection de la zone à copier pour y remplacer les formules : il faut utiliser la propriété UsedRange

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub RemplaceFormuleParValeurs()
        ActiveSheet.UsedRange.Copy
        ActiveSheet.UsedRange.PasteSpecial xlValues
    End Sub
    et le nom de fichier à fournir pour l’’enregistrement. Tu n’as pas à récupérer ce nom, puisque c’est toi qui le choisis ou le détermines. Cela pourrait être le nom de l’onglet de la feuille active par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub EnregistreAvecNomFeuille()
        ActiveWorkbook.SaveAs ActiveSheet.Name & "xls"
    End Sub
    Pour pouvoir utiliser ensuite le nom du classeur pour l'envoyer par mail, stocke-le dans une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub EnregistreEnUtilsantUneVariable()
    Dim NomClasseur$
        NomClasseur = ActiveSheet.Name
        ActiveWorkbook.SaveAs NomClasseur & "xls"
    End Sub
    Bon Noël

    Michel Gaboly

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    Merci pour toutes ces précisions, je devrais pouvoir m'en sortir !!!

    Je te tiens au courant.

    Bonne fêtes de fin d'année à toi également

  7. #7
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    De rien,

    N’hésite pas à demander des précisions si tu en a besoin.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    Pas d'idée ?

    En fait, je souahitez juste retirer la mise en forme confitionnelle d'une cellule mais en conservant le résultat de cette mise en forme.

    Certaines cellules sont grise suite à une mise en forme conditionnelle, je souhaites donc les garder grises tout en retirant la mise en forme conditionnelle qui a institué cette couleur.

    MErci

  9. #9
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Des idées, oui, bien sûr, très précises, même.

    Cependant pouvoir conserver le résultat des mises en forme conditionnelles (MEFC) est un traitement beaucoup plus lourd que tu ne sembles l’imaginer :

    Il faut faire une boucle qui passe dans chaque cellule pour laquelle une MEFC a été définie. Ensuite, pour chaque cellule concernée,

    1. Lire la ou les conditions qui ont été définies (formule ou test sur valeur).
    2. Tester dans l’ordre si chaque condition définie est remplie.
    3. Si oui, déterminer les choix de mises en forme associés (détail des encadrements, couleur de police, gras ou pas, souligné ou pas, couleur de fond, ...)
    4. Les appliquer inconditionnellement.
    5. Effacer la MEFC.


    Voici comment se présente le traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub ReproductionEffetsMEFC()
    Dim Ref As Range, c As Range
        ActiveCell.SpecialCells (xlCellTypeAllFormatConditions)
            For Each c In Ref
                ' Lecture des éléments de mise en forme induits par la MEFC
                ' pour c et reproduction de cette mise en forme (police, bordures, fond)
            Next
    End Sub
    C’est un développement relativement long, qui selon moi sort du cadre de l’entraide dans un forum

    C’est éventuellement faisable si tu n’as qu’un format (cellules grisées). Mais dans ce cas, indique les conditions pour lesquelles les cellules sont grisées et ce que tu appelles grisées : quelle nuance de gris ? La couleur de la police ou la couleur de fond ?

    Il faudrait que tu joignes en pièce jointe un classeur Excel avec au moins une cellule grisée par ta mise en forme, afin de pouvoir la reproduire précisément.

    Cordialement,

    Michel Gaboly

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    J'était parti sur une solution semblable mais je ne sais pas comment récupérér la mise en forme.

    Effectivement, le fait de tester la condition directement en VBA me semble une bonne idée, je vais donc créer une procédure qui recrée la MEFC et je vais l'appliquer à chaque cellule avant de la détruire.

    Je n'ai que deux format :

    • bordure pleine avec couleur de fond gris (couleur unique)
    • bordure pleine sans couleur de fond
    A charge après à l'utilisateur une fois le traitement terminé de modifier comme bon lui semble les couleurs.

    Pour info, c'est un tableau de gestion de planning vierge qui est généré. Toute les cellules sont blanches abev une bordures sauf certaines heures sui sont grises.

    Je vois ca ce soir !!

    Merci

  11. #11
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonjour,

    J’ai l’impression que tu te compliques beaucoup la vie pour rien

    S’il s’agit de générer un tableau vierge sans mise en forme conditionnelle (MEFC), et avec des zones grisées, ajoute-le au classeur avec les macros (celui évoqué dans ton premier message), et génère avec ton bouton, situé sur UNE AUTRE feuille, un classeur vierge, ayant pour seule feuille ton planning vierge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub NouveauPlanning()
        ThisWorkbook.Sheets("PlanningVierge").Copy
        ActiveSheet.Name = "Planning semaine 4"
    End Sub
    La seconde ligne, pas forcément nécessaire, te permet de renommer la feuille dans le classeur créé.

    Ainsi, tu n’auras plus à te préoccuper d’effacer le bouton, du code VBA, ni de devoir reproduire le résultat de MEFC.

    Michel Gaboly

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    C'est malheureusement un peu plus compliqué que ca car ce document sera évolutif à l'avenir ...

    Mais je note que effectivement, je n'ai pas besoin d'utiliser de mise en forme conditionnelle mais uniquement de coder une procedure l'imitant.

    Je penses avoir tout ce dont j'ai besoin pour terminer ce planning. Il me manque juste le point sur la protection de la feuille.

    Je te remercie grandement pour ta préciseuse aide et espère ne pas t'avoir trop embetté !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] [Excel] Feuille dans une form, sans excel installé
    Par ro2v dans le forum Installation, Déploiement et Sécurité
    Réponses: 3
    Dernier message: 05/05/2010, 12h45
  2. Réponses: 2
    Dernier message: 12/12/2007, 18h44
  3. Feuille des ADF TREE sans symbole de dossier ou +
    Par ikeaboy dans le forum JDeveloper
    Réponses: 8
    Dernier message: 21/07/2007, 07h40
  4. [SQL]Mise a jour sans passer par du code
    Par hackel dans le forum Access
    Réponses: 7
    Dernier message: 06/04/2007, 09h13
  5. Imprimer la structure d'une base sans code vba
    Par steph141 dans le forum Access
    Réponses: 2
    Dernier message: 06/04/2006, 22h30

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