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 :

Copie et mise en forme d'une feuille à l'autre. [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Par défaut Copie et mise en forme d'une feuille à l'autre.
    Bonjour tout le monde,

    Cela fait un bout de temps de temps que je n'étais pas venu Je ne pensais pas me remettre à coder un jour mais les aléas du travail ont fait ue je dois apprendre le VBA pour Excel !

    Plutôt une bonne nouvelle même si je trouve ce langage difficile à apprendre. Bref... Je vous explique ma demande.

    Je dois mettre en place une macro sous Excel 2013 afin de récupérer des données arrivées "brutes" sur la DATA de mon classeur et les recopier sur la feuille ETAT de ce même classeur. Ensuite, je dois ajuster les colonnes et encadrer le tout.

    Cela fait maintenant 2 semaines que je m'y suis mis et je n'avance pas des masses ... je suis à la page 50 de "VBA pour les Nuls" ;x

    Après cette longue présentation, place à mon super code version 1 :

    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
     
     
    Sub MAJ_ETAT()
     
        ' Copie de DATA de la cellule B4 à la cellule O9999 vers ETAT
     
     Sheets("DATA").Range("B4:O9999").copy _
        Destination:=Worksheets("ETAT").Range("A4:N4")
     
     
        ' Ajustement auto des colonnes
     
        Worksheets("ETAT").Columns("C").NumberFormat = "m/d/yyyy"
        Worksheets("ETAT").Columns("A:N").AutoFit
        Worksheets("ETAT").Columns("A:C").HorizontalAlignment = xlCenter
        Worksheets("ETAT").Columns("H:N").HorizontalAlignment = xlCenter
     
     
    End Sub
    Je commence à la ligne 4 car j'aimerais ajouter un bouton pour les collègues qui seront amenés à utilisé cet état et qui ne savent pratiquement pas utilisé un pc. J'essaie de faire le plus simple pour eux.

    Et je copie de la même façon à partir de la ligne 4 car j'ai une entête de tableau qui se met à jour en fonction de la date, du numéro de contrat, nom client, etc...

    La version 1 fonctionne mais je n'arrive pas à mettre en place l'encadrement sur les lignes non vides.

    J'ai donc voulu améliorer avec une version 2 :

    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
     
     
    Sub MAJ_ETAT()
     
    Dim Lig As Long
     
        Lig = 4 'première ligne à vérifier
            Do While Not IsEmpty(Range("A" & Lig))
                Worksheets("DATA").Range("B4:O1000").copy _
                      Destination:=Worksheets("ETAT").Range("A4:N1000")
            Loop
                MsgBox "Copie terminée"
     
     
        ' Ajustement auto des colonnes
     
        Worksheets("ETAT").Columns("C").NumberFormat = "m/d/yyyy"
        Worksheets("ETAT").Columns("A:N").AutoFit
        Worksheets("ETAT").Columns("A:C").HorizontalAlignment = xlCenter
        Worksheets("ETAT").Columns("H:N").HorizontalAlignment = xlCenter
     
     
    End Sub
    Mais là je tombe dans une boucle infinie ... et ça fini par planter.

    Je sais, ma demande est longue, désolé ...


    En gros, l'idéal pour moi serait de :

    - pouvoir copier de façon dynamique, les données extraites formant un tableau variable d'une extraction à l'autre.

    - mettre en forme automatiquement le résultat (centrer, changer le format de date, encadrer).

    - plus tard effectuer des sous totaux en fonction d'une colonne "année". Mais ce sera pour lus tard

    Le tout avec un seul click pour mes collègues !

    Voilà, je pense que pour une première demande après une longue période c'est pas mal.

    Merci à tout ceux qui auront pris la peine de me lire et à ceux qui pourront m'aider ! Des bisous.

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    Je crois que ta boucle infinie se traduit par un "Lig" que tu n'incrémentes pas

    D'ailleurs, je ne comprends pas du coup ta boucle car tu copies-colles une plage de données sur 1000 lignes.

    Cordialement,

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Par défaut
    Merci pour ta réponse Effectivement, je n'ai pas incrémenté ma variable

    Avec ce code ça marche mieux !

    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
    Sub MAJ_ETAT()
     
    Dim Lig As Long
     
        Lig = 4 'première ligne à vérifier
            Do While Not IsEmpty(Range("A" & Lig))
                Worksheets("DATA").Range("B4:O1000").copy _
                      Destination:=Worksheets("ETAT").Range("A4:N1000")
     
    Lig = Lig + 1
     
            Loop
                MsgBox "Copie terminée"
     
     
        ' Ajustement auto des colonnes
     
        Worksheets("ETAT").Columns("C").NumberFormat = "m/d/yyyy"
        Worksheets("ETAT").Columns("A:N").AutoFit
        Worksheets("ETAT").Columns("A:C").HorizontalAlignment = xlCenter
        Worksheets("ETAT").Columns("H:N").HorizontalAlignment = xlCenter
     
     
    End Sub
    Reste que comme tu le disais, ça n'ai pas vraiment "dynamique", j'entends par là que je force la plage car je ne sais pas comment lui indiqué.

    Si je tente une copie de ligne avec Rows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Worksheets("DATA").Rows(Lig).Select
                    Selection.copy
     Worksheets("ETAT").Rows(Lig).Select
                    Selection.Paste
    J'obtiens une erreur 1004 : la méthode select de la classe range a échoué.

    C'est pas trés causant le débogage sous VBA

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bon, j'y vais de quelques recommandations qui peuvent vous faire gagner beaucoup de temps:

    - Penser au Range.CurrentRegion (equivaut au Ctrl + * sous Excel): ça vous évitera des codages en dur du style
    Worksheets("DATA").Range("B4:O1000"). Le jour ou vos données font plus de 1000 lignes....

    - Pensez au SpecialCells

    - Pensez aux styles! Appliquer un style inclus ou custom est bien plus facile que de tout reformater

    et .... nous sommes tous passés par là!

    Bonne journée

    Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set CurRng = ThisWorkbook.Worksheets(1).Range("A4").CurrentRegion
    Debug.Print  CurRng.Address
     
    Set CurRng = CurRng .SpecialCells(xlCellTypeConstants) 'cellules avec des constantes: pas de formules, ni vides
    Debug.Print  CurRng.Address

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    et un autre exemple en dur ....

    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
    Set RepRng = RepRng.CurrentRegion
     
            With RepRng
     
                With .Borders
                    .LineStyle = xlContinuous
                    .ColorIndex = vbBlack
                End With
     
                .NumberFormat = "General"
                .Font.Name = "Calibri"
                .Font.Size = 12
                .EntireColumn.AutoFit
     
            End With
     
                ' Reformat the dates and numbers
            For ColN = 1 To RepRng.Columns.Count
     
                If InStr(1, RepRng(1, ColN).Value, "Date", vbTextCompare) > 0 Then RepRng.Columns(ColN).NumberFormat = "[$-409]d-mmm-yy;@"
                If InStr(1, RepRng(1, ColN).Value, "Size", vbTextCompare) > 0 Then RepRng.Columns(ColN).NumberFormat = "0.0"
     
            Next ColN
     
            With RepRng
                .EntireColumn.AutoFit
            End With
     
        Application.ScreenUpdating = True

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Par défaut
    Merci beaucoup pour ces conseils ! J'en prends note immédiatement !

    Et la citation de Senna en signature, juste classe !

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

Discussions similaires

  1. [XL-2007] Copier la mise en page d'une feuille à l'autre ?
    Par marot_r dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/12/2014, 21h53
  2. Comment appliquer une mise en forme à de nouvelles feuilles?
    Par jacksparot dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/04/2011, 21h09
  3. [CR 2008] Section Details : alterner la mise en forme d'une ligne à l'autre
    Par mohamed301084 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 27/03/2010, 19h55
  4. Pb de mise en mosaique de forms dans une feuille MDI
    Par Gilles BILLARD dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/05/2009, 08h04
  5. mise en forme d'une feuille Excel
    Par djerbafr dans le forum VBA Access
    Réponses: 3
    Dernier message: 08/01/2009, 13h03

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