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 une plage pour chaque jour du mois


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut copier une plage pour chaque jour du mois
    bonjour a tous
    j ai une plage de données (en tete: nom, prenom, equipe)de 39 a 52 lignes , que je souhaite recopier sur une autre feuille( mensuelle) pour chaque jour du mois .
    ex: nom prenom, groupe , jour
    n1 , p1 , 1 , 1
    n2, p2 , 1 , 1
    -------------------------
    n39 ,p39 , 3 , 31

    mon souci est que sur la feuille qui doit recevoir ces données ,il existe des données sous la ligne maxi(52*31 soit 1612)-en 1650 que je ne veux pas écraser car je fais d autres calculs dessous.
    en glanant sur les forums , j ai trouve ce code qui pourrait aller mais il me recopie les données a partir de la ligne 1650 au lieu de la ligne 3...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For i = 1 To 31
        Sheets("tables").Select
        Range("A3:C" & Range("A65535").End(xlUp).Row).Select
        Selection.Copy
        Sheets("Janvier").Select
        debut = Range("A3").End(xlDown).Row + 1
        Range("A" & debut).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        fin = Range("A3").End(xlDown).Row
        For j = debut To fin
        Cells(j, 4).Value = i
        Next j
    Next i
    comment l adapter ?
    merci de votre contribution et bonne fête de fin d 'année a tous

  2. #2
    Membre confirmé
    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
    Points : 563
    Points
    563
    Par défaut
    Bonjour,

    Avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A65535").End(xlUp).Row
    Tu repères ta première ligne utilisée, à partir du bas, c’est-à-dire ta ligne de calculs. C’est de cette ligne qu’il faut partir, et pas de la dernière de la feuille. Voici 3 options :

    1 - Tu nommes la cellule en C1650, par exemple "RéfTotaux"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("RéfTotaux").End(xlUp).Offset(1)
    te permettra de faire référence à la première cellule vide en colonne C, vers le haut, à partir de ta ligne de calculs.

    2 - Sans employer de nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("C65536").End(xlUp).End(xlUp).Offset(1)
    aboutira au même résultat

    3 - S'il n’y a aucune cellule vide avant celle où tu veux reporter tes données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("C1").End(xlDown).Offset(1)
    aboutira également au même résultat.


    PS - Depuis la version 2007 le nombre de lignes d’une feuille est passé de 65 536 à 1 048 576. Pour être sûr de partir du bas, il vaut mieux remplacer

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("C" & ActiveCell.EntireColumn.Rows.Count)
    qui fonctionnera, quelle que soit la version d’Excel.

    Bonne soirée !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Après avoir nomme ma cellule de calcul (calcul) j ai insere comme ceci mais j obtiens un message d erreur au niveau de la ligne Range( "A" & début).select
    erreur d execution 1004
    la methode 'range' de l objet '_global' a echoué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For i = 1 To 31
        Sheets("tables").Select
        Range("A3:C" & Range("A65535").End(xlUp).Row).Select
        Selection.Copy
        Sheets("Janvier").Select
        debut = Range("calcul").End(xlUp).Offset(1)
        Range("A" & debut).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        fin = Range("calcul").End(xlUp).Offset(1)
        For j = debut To fin
        Cells(j, 4).Value = i
        Next j
    Next i
    ou est le bug?
    merci

  4. #4
    Membre confirmé
    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
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Désolé, j’avais lu trop vite au début, je n’avais pas enregistré qu’il y avait 2 feuilles distinctes. C”est pour cela que le "Range("A65535").End(xlUp)" me choquait.

    Toutefois le problème est indépendant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A65535").End(xlUp)
    renvoie un objet Range. Il est inutile d’utiliser .Row : au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A3:C" & Range("A65535").End(xlUp).Row)
    on peut utiliser directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range(Range("A3"), Range("C65535").End(xlUp))
    si la colonne C est renseignée pour la dernière ligne ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range(Range("A3"), Range("A65535").End(xlUp).offset(0, 2))
    si on n’est pas sûr que C est renseignée pour la dernière ligne. Il ne faut pas essayer de copier trop directement ce qui se passe dans l’environnement Excel ; dans Excel, une plage s’écrit A3:C341 par exemple. Dans VBA, bien souvent, les numéros de lignes ne sont pas connus et chercher à les déterminer n’est pas forcément utile. Le plus souvent, on connaît la plage (ou la cellule) de début et la plage (ou la cellule) de fin, qui bien souvent correspondent à des variables.

    La syntaxe la plus courante pour désigner une plage est alors Range(Range1, Range2). C’est en général le + efficace.

    Dans l’exemple de code, ce qui ne fonctionne pas, c’est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A" & debut).Select
    car début, défini ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        debut = Range("calcul").End(xlUp).Offset(1)
    est un objet Range et pas un numéro de ligne. Si tu as déclaré tes variables, ce que je te recommande très vivement (pour cela, sélectionne "Déclaration explicite des variables" dans les préférences), la syntaxe correcte est alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set debut = Range("calcul").End(xlUp).Offset(1)
    Ce que tu essayes d’obtenir avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A" & debut).Select
    est très vraisemblablement ce que debut représente directement. Si calcul est défini en colonne A,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A" & debut.Row).Select
    est strictement équivalent à debut.

    Par ailleurs, évite les Select autant ; le code que possible sera + concis, +lisible et s'exécutera + rapidement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Tables").Range("A3", Range("A65536").End(xlUp).Offset(0, 2)).Copy Sheets("Janvier").Range("A3").End(xlDown).Offset(1)
    remplace ainsi avantageusement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Sheets("tables").Select
        Range("A3:C" & Range("A65535").End(xlUp).Row).Select
        Selection.Copy
        Sheets("Janvier").Select
        debut = Range("calcul").End(xlUp).Offset(1)
        Range("A" & debut).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    NB - Si toutes les lignes de la colonne A sont remplies à partir de A3, passer par "Calcul" n’est pas nécessaire.

    Par ailleurs,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For j = debut To fin
            Cells(j, 4).Value = i
        Next j
    ne fonctionnera pas, car tels que définis dans la seconde verion de ton code, Debut et fin sont des cellules, et plus des numéros de ligne.

    Enfin, j’ai du mal à comprendre la boucle qui va reporter les mêmes éléments 31 fois de suite sur la feuille janvier. La sélection reportée contient toutes les données de janvier si on utilise "Range("A3").End(xlDown)".

    S'il est nécessaire de sélectionner les données d’un jour différent à chaque passage dans la boucle, il manque l’étape effectuant la sélection des données quotidiennes !

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/11/2014, 12h07
  2. manipulation de date pour chaque jour du mois
    Par renardchan dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/06/2011, 22h00
  3. [VBA-E] pb pour copier une plage vers un autre repertoire
    Par alex.a dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 04/05/2007, 15h23
  4. [CSS]Définir une taille pour chaque police
    Par Davboc dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 27/12/2005, 18h32
  5. [Composants] TRichEdit: Une police pour chaque ligne
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2003, 15h59

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