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 :

Copier en VBA avec formules et mises en forme conditionnelles


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Assistante
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Assistante
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Par défaut Copier en VBA avec formules et mises en forme conditionnelles
    Bonjour

    J'ai une macro qui me permet de scinder un classeur en plusieurs classeurs, suivant un champs.
    Actuellement cette macro copie les données et le format mais pas les mises en forme conditionnelles ni les formules.

    Je joins un classeur exemple il s'agit du module 5, il n'y a que le début de la macro qui copie les données dans une feuille temporaire.

    Que dois je ajouter pour que mes données soient bien copiées avec les formules et mises en forme conditionnelles ?

    Voici aussi le code :

    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
     
    ub Production_Schedule()
     
    Call Variables
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
     
     
     
    'Copie dans PlageExtract des données sans doublons du champs indiqué en en entete de PlageExtract, de la plage Data
    Data.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=PlageExtract, Unique:=True
     
    'Copie du production schedule dans une feuille temporaire
     
    For Each c In Range("AJ5", Range("AJ100").End(xlUp))
     
    PlageExtract = c
    Sheets.Add
    Data.AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Sheets("Production_Schedule").[AJ4:AJ5], CopyToRange:=[A1], Unique:=False
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$AC$2000"), , xlYes).Name = "tab_Production_Schedule"
     
     
     
    Next
     
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si tu dupliques le classeur pour travailler directement sur les copies et faire ton ménage dedans (au lieu du filtre avancé), tu dois tout conserver

    tu utilises les filtres automatiques pour afficher uniquement les lignes non voulues
    tu fais une suppression de la plage visible (à l'exception de la ligne 1 qui contient les en-têtes)

    regarde ce sujet daté de tout à l'heure, j'ai proposé un code qui fait ces opérations avec filtre automatique (mais uniquement une colonne contient un critère)

    http://www.developpez.net/forums/d15...t/#post8501955

  3. #3
    Membre averti
    Femme Profil pro
    Assistante
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Assistante
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Par défaut
    Bonjour

    Le classeur n'est pas dupliqué, ce serait trop compliqué, la création de tous les classeurs est automatique, pas manuelle.

    La macro sert à découper une feuille de 6000 lignes pour envoyer à chaque partenaire (une cinquantaine) de façon hebdomadaire la partie qui lui incombe. Dans ces extractions il y a des modifications qui sont faites avant envoi (qui ne sont pas dans la macro du fichier test). Elle vient du site http://boisgontierjacques.free.fr/pa...eursRepertoire

    L'exemple sur le site de la macro est
    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 CreeClasseurs()
      Application.DisplayAlerts = False
      [A1:D10000].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[g1], Unique:=True
      For Each c In Range("G2", Range("G65000").End(xlUp))
        Range("G2") = c
        Sheets.Add
        Sheets("BD2").[A1:D10000].AdvancedFilter Action:=xlFilterCopy, _
           CriteriaRange:=Sheets("BD2").[G1:G2], CopyToRange:=[A1], Unique:=False
        ActiveSheet.Copy
        ActiveSheet.Name = c
        ActiveWorkbook.SaveAs Filename:=c
        ActiveWorkbook.Close
        ActiveSheet.Delete
        Sheets("BD2").Select
      Next c
    End Sub
    mais ça ne recopie que les données et le format et non les formules et mises en forme conditionnelles

    Je suis plutôt très débutante en vba, que dois je modifier dans mon code ?

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je ne comprend pas bien

    dans ton premier message, tu indiques scinder un classeur en plusieurs
    du coup, si je te propose de le dupliquer pour ensuite travailler sur les copies, c'est "Scinder et épurer" également, mais pas dans le même ordre

    tout ceci bien sûr peut se réaliser automatiquement par VBA (méthode SaveAs de l'objet Workbook)

    seul inconnue dans cette proposition : je ne sais pas quel est le traitement que tu appliques pour épurer et remodeler les données.

  5. #5
    Membre averti
    Femme Profil pro
    Assistante
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Assistante
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Par défaut
    La macro d'origine et complète est la suivante, elle inclue les formules et mises en forme conditionnelles, mais ce serait plus simple si les données étaient copiées avec ces éléments et surtout plus pratique lors des changements sur le fichier d'origine.
    Petit précision en réfléchissant, je n'extraie les nouveaux classeurs que à partir d'une feuille alors que mon classeur en contient plusieurs, et j'ai des boutons notamment sur mon classeur originale qui ne doivent pas être recopiées.
    Egalement, certaines colonnes ont des formules de RECHERCHEV qui ne doivent pas reportées, mais juste copier les valeurs.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    Sub CreeClasseurs()
     
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    On Error Resume Next
    Kill "S:\Achats\COMMUN\Tableau de suivi\Production Status\*.*"
    On Error GoTo 0
     
    [A4:AF6500].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[AI4], Unique:=True
    For Each c In Range("AI5", Range("AI65000").End(xlUp))
    Range("AI5") = c
    Sheets.Add
    Sheets("Production_Schedule").[A4:AF6500].AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Sheets("Production_Schedule").[AI4:AI5], CopyToRange:=[A1], Unique:=False
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$AF$2000"), , xlYes).Name = _
            "Tableau2"
     
     
    ActiveSheet.Columns("A:AF").AutoFit
    ActiveSheet.Range("A:A,B:B,C:C,F:F,G:G").EntireColumn.Hidden = True
    ActiveSheet.Range("D1") = "Production Manager"
    ActiveSheet.Range("H1") = "Supplier"
    ActiveSheet.Range("E1") = "OA#"
    ActiveSheet.Range("I1") = "Style"
    ActiveSheet.Range("J1") = "Color"
    ActiveSheet.Range("K1") = "Size"
    ActiveSheet.Range("L1") = "Order Quantity"
    ActiveSheet.Range("M1") = "Order ETD"
    ActiveSheet.Range("N1") = "Order Warehouse Date"
    ActiveSheet.Range("O1") = "Revised ETD"
    ActiveSheet.Range("P1") = "Delay"
    ActiveSheet.Range("Q1") = "Partial Qty"
    ActiveSheet.Range("R1") = "Balance"
    ActiveSheet.Range("Z1") = "FRI status"
    ActiveSheet.Range("AE1") = "Warehouse Date"
    ActiveSheet.Range("AF1") = "Comments"
    ActiveSheet.Copy
    nf = Replace(Replace(Replace(Replace(Replace(c, "/", "_"), "&", "_"), "...", "_"), ".", "_"), " ", "_")
    Application.ScreenUpdating = False
     
    '----------------------------------------------------
    ' Mise en forme conditionnelle
     
    Range("A:AH").Select
    Selection.FormatConditions.Delete
     
    With Range("A2").Select
    Set plage = Range("A2:AH" & Range("A65536").End(xlUp).Row)
    plage.FormatConditions.Add Type:=xlExpression, Formula1:="=$AD2<>0"
    plage.FormatConditions(1).Interior.ColorIndex = 35
    plage.FormatConditions(1).Font.ColorIndex = 1
     
    End With
     
     
    With Range("Y2").Select
    Set plage2 = Range("Y2:Y" & Range("Y65536").End(xlUp).Row)
     
    plage2.FormatConditions.Add Type:=xlExpression, Formula1:="=SI($O2<>"""";$Y2>=$O2;et($E2<>"""";$Y2>=$M2) )"
    plage2.FormatConditions(2).Interior.ColorIndex = 3
    plage2.FormatConditions(2).Font.ColorIndex = 2
    plage2.FormatConditions(2).Font.Bold = True
     
    plage2.FormatConditions.Add Type:=xlExpression, Formula1:="=ET($E2<>"""";$AA2="""";$Y2<>"""";$Y2<AUJOURDHUI())"
    plage2.FormatConditions(3).Interior.ColorIndex = 6
    plage2.FormatConditions(3).Font.ColorIndex = 1
     
    End With
     
    '------------------------------------------------------------
     
     
    ' Suite du code
     
    ActiveSheet.Name = Left(nf, 31)
    ActiveWorkbook.SaveAs Filename:="S:\Achats\COMMUN\Tableau de suivi\Production Status\" & "Production_status_" & nf & "_" & Format(Date, "d-mm-yy")
    ActiveWorkbook.Close
    ActiveSheet.Delete
    Next c
     
     
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
     
    End Sub
    Merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    si je comprend bien ton code (je l'ai uniquement survolé là)

    à la fin du traitement, tu as dans ton dossier autant de classeurs que de cellule en colonne AI (à partir de la ligne 5) qui sont remplies
    ces classeurs contiennent : la feuille d'origine + la feuille retravaillée ?

    je pense que si tu faisais une copie de la feuille directement au lieu d'en créer une nouvelle, tu conserves le tout


    pour tes annotations supplémentaires (il y a d'autres feuilles, des formules ne sont pas à prendre en compte, des boutons doivent être supprimés), c'est assez léger comme explication, quel est le nom de la feuille de travail ? et quelles sont les colonnes où on doit convertir les formules en valeur ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/09/2015, 13h32
  2. Formule dans mise en forme conditionnelle
    Par bernidupont dans le forum Excel
    Réponses: 5
    Dernier message: 15/06/2015, 10h20
  3. [XL-2007] Formule dans Mise en forme conditionnelle
    Par Supremereboot dans le forum Excel
    Réponses: 2
    Dernier message: 10/01/2013, 11h28
  4. Formule de mise en forme conditionnelle
    Par Coralie73 dans le forum Excel
    Réponses: 3
    Dernier message: 29/11/2008, 12h37
  5. [Formule]pb mise en forme conditionnelle
    Par kickoune dans le forum Excel
    Réponses: 2
    Dernier message: 11/04/2007, 20h58

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