recopie selon condition (novice macro)

  • Initiateur de la discussion Initiateur de la discussion pat76
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pat76

XLDnaute Nouveau
Bonjour à tous,

Je cherche à créer une macro mais je n'y arrive pas.
Après 2 jours de recherche et d'essais, je m'adresse à vous.

J'ai créé un classeur avec 5 feuilles "COURSES", "PLAT", "TROT", "MONTE", "OBSTACLE".
Dans la colonne C de "COURSES", il y a P ou T ou M ou O.
Je souhaiterais copier les lignes où figurent "P" dans la feuille "PLAT", les "T" dans la feuille "TROT" et ainsi de suite.
Pour l’utilisation, je sélectionnerai les lignes à recopier dans la feuille "COURSES" avant d’appuyer sur un bouton associé à cette macro.
Je voudrais bien sûr que ces lignes se recopient à partir de la première ligne vide de la feuille de destination.

Qui connait la formule magique ?

Merci beaucoup de m'aider, je suis autodidacte.
mais là, je sèche !!!
 

Pièces jointes

Re : recopie selon condition (novice macro)

Bonjour à tous
Sur le même principe (condensé), mais permettant d'ajouter les données aux données existantes :
Code:
[COLOR="DarkSlateGray"]Sub Macro1()
Dim catLst, i As Integer, tmp
   catLst = Array(Array("M", "MONTE"), Array("O", "OBSTACLE"), Array("P", "PLAT"), Array("T", "TROT"))
   Application.ScreenUpdating = False
   With Sheets("COURSES").Range(Cells(1, 7), Cells(Rows.Count, 1).End(xlUp))
      For i = 0 To UBound(catLst)
         tmp = catLst(i)
         .AutoFilter Field:=3, Criteria1:=tmp(0)
         .Offset(1, 0).Copy Destination:=Sheets(tmp(1)).Cells(Sheets(tmp(1)).Rows.Count, 1).End(xlUp).Offset(1, 0)
      Next i
      .AutoFilter
   End With
   Application.ScreenUpdating = True
   MsgBox "Tri terminé !"
End Sub[/COLOR]
ROGER2327
#1868
 
Re : recopie selon condition (novice macro)

Merci beaucoup pour les réponses .
ça marche impec, mais il reste quand même un problème🙁je suis désolé, c'est de ma faute mon fichier n'était pas assez rempli!!)
la recopie ne se fait donc pas vers la première ligne vide mais après la dernière ligne qui contient de la saisie (nuance); en effet, je souhaiterai conserver sous les lignes de données des lignes reservées aux totaux ou stats.

En résumé, j'ai besoin d'insérer une nouvelle ligne sous la dernière ligne de saisie en feuille de destination.(ceci afin d'éviter de ne plus avoir de ligne vides disponible entre les données du haut de la feuille et les lignes de totaux ou stats.)
Je fais de monmieux pour être clair .... ;-)

Je vous renvoie le fichier modifié.
 

Pièces jointes

Re : recopie selon condition (novice macro)

Bonjour pat76
Pas de chance pour moi, j'ai travaillé ce matin sur votre premier problème, pour tenir compte de la demande de ne prendre en compte qu'une partie des données de la feuille COURSES. Maintenant, il s'agit d'un deuxième problème où il n'est plus question de copier/coller mais de copier/insérer des lignes. Ce serait sans doute trop simple de donner à résoudre le vrai problème qu'on a...
Je livre ce que j'ai fait à propos du premier problème puisque j'y ai passé du temps. Comme ce n'est qu'une modification simple à ce que j'avais préparé, j'y ai ajouté une "zone de stats". Mais elle est au dessus des données.
Pour le deuxième problème, il se trouvera bien un amateur. Patience...​
ROGER2327
#1872
 

Pièces jointes

Re : recopie selon condition (novice macro)

Suite...
Pour que le code ne reste pas du Chinois, langue fort honorable au demeurant, le voici commenté :
Code:
[COLOR="DarkSlateGray"]Sub TRI_SELECTION()
Dim catLst, i As Integer, oCel As Range, tmp
   catLst = Array(Array("M", "MONTE"), Array("O", "OBSTACLE"), Array("P", "PLAT"), Array("T", "TROT")) [COLOR="SeaGreen"][B]'3 :
'Donne la correspondance entre la clé de tri et la feuille.[/B][/COLOR]
   Application.ScreenUpdating = False [COLOR="SeaGreen"]'4[/COLOR]
   With Sheets("COURSES") [COLOR="SeaGreen"][B]'5 : Déclare la feuille de référence.[/B][/COLOR]
      With .Range(.Cells(1, 8), .Cells(Rows.Count, 1).End(xlUp)) [COLOR="SeaGreen"][B]'6 : Décrit la plage de données qui est
'"A1:Hn" où n est le rang de la dernière ligne qui contient des données. Ici, elle décrite de façon
'inhabituelle : "H1:An". C'est .Cells(1,8) qui correspond à "H1" et .Cells(Rows.Count, 1).End(xlUp) qui
'correspond à la dernière cellule de la colonne A contenant une donnée.[/B][/COLOR]
         .AutoFilter Field:=8, Criteria1:="=" [COLOR="SeaGreen"][B]'7 : Filtre sélectionnant dans la plage "A1:Hn" les lignes
'où la colonne H est vide.[/B][/COLOR]
         For i = 0 To UBound(catLst) [COLOR="SeaGreen"][B]'8 : Démarre un boucle ou i indexe les arguments de la liste catLst.
'Un élément de cette liste est lui-même une liste de deux éléments. Par exemple, catLst(0) est la liste
'Array("M", "MONTE").[/B][/COLOR]
            tmp = catLst(i) [COLOR="SeaGreen"][B]'9 : tmp prend l'élément de rang i de catLst[/B][/COLOR]
            .AutoFilter Field:=3, Criteria1:=tmp(0)[COLOR="SeaGreen"][B] '10 Filtre sélectionnant dans les ligne de la plage
'"A1:Hn" où la colonne H est vide celles dont la troisième colonne contient le premier élément de la
'liste tmp. (Pour i=0, c'est "M", pour i=1, c'est "O",etc.)
' On va ensuite copier ces lignes sélectionnées dans la feuille correspondante.[/B][/COLOR]
            If IsEmpty(Sheets(tmp(1)).Cells(14, 1)) Then [COLOR="SeaGreen"][B]'11 : On regarde la valeur de la cellule "A14"
'de la feuille tmp(1), c'est-à-dire de la feuille dont le nom figure dans le deuxième élément de la
'liste tmp. (Pour i=0, c'est "MONTE", pour i=1, c'est "OBSTACLE",etc.)[/B][/COLOR]
               .Offset(1, 0).Copy Destination:=Sheets(tmp(1)).Cells(14, 1) [COLOR="SeaGreen"][B]'12 :'Si cette cellule est
'vide on colle la sélection à partir de la cellule "A14", pour préserver la zone réservée au dessus
'de la ligne 14.[/B][/COLOR]
            Else [COLOR="SeaGreen"][B]'13 : Sinon...[/B][/COLOR]
               .Offset(1, 0).Copy Destination:=Sheets(tmp(1)).Cells(Sheets(tmp(1)).Rows.Count, 1). _
                  End(xlUp).Offset(1, 0) [COLOR="SeaGreen"][B]'14 :...on colle la sélection à partir de la première ligne vide
'en dessous de la line 14. Dans .Offset(1, 0).Copy, la valeur de décalage (offset) d'une ligne évite de
'la ligne 1 (intitulés des champs) dela feuille "COURSES".[/B][/COLOR]
            End If [COLOR="SeaGreen"]'14[/COLOR]
         Next i [COLOR="SeaGreen"][B]'15: On boucle sur tous les éléments de catLst.[/B][/COLOR]
         .AutoFilter [COLOR="SeaGreen"][B]'16 : Supprime le filtre.[/B][/COLOR]
         With .Resize(.Rows.Count - 1, 1).Offset(1, 7) [COLOR="SeaGreen"][B]'17 : Décrit la partie de la colonne H "H2:Hn".[/B][/COLOR]
            For Each oCel In .Cells [COLOR="SeaGreen"][B]'18 : Cette boucle (lignes 18 à 20) place la date et l'heure dans
'toutes les cellules vides de la plage "H2:Hn".[/B][/COLOR]
               If IsEmpty(oCel.Value) Then oCel.Value = Format(Now(), "ddddd ttttt") '1 + WorksheetFunction.Max(.Cells)
            Next oCel [COLOR="SeaGreen"]'20[/COLOR]
         End With [COLOR="SeaGreen"]'21[/COLOR]
      End With [COLOR="SeaGreen"]'22[/COLOR]
   End With [COLOR="SeaGreen"]'23[/COLOR]
   Application.ScreenUpdating = True
End Sub[/COLOR]
ROGER2327
#1875
 
Re : recopie selon condition (novice macro)

C'est super sympa ROGER de me fournir toutes ces informations car le vba est une nouvelle langue que j'essaie d'apprendre et qui me pose beaucoup de problèmes (d'autant que je suis nul en anglais).
Aurait-tu une idée de tuto ou de site qui puisse m'aider à démarrer en vba.

@bientôt

Pat
 
Re : recopie selon condition (novice macro)

Bonjour à tous


Roger2327:

Une petit question : pourquoi préfères tu passer par une boucle ?
plutôt que comme ci-dessous (voir lignes en bleu)

Code:
Sub TRI_SELECTION()
   Application.ScreenUpdating = False '4
   With Sheets(3) '5 : Déclare la feuille de référence.
       With .Range(.Cells(1, 8), .Cells(Rows.Count, 1).End(xlUp))
       'reste du code inchangé
        [B][COLOR=Blue]With .Resize(.Rows.Count - 1, 1).Offset(1, 7).SpecialCells(xlCellTypeBlanks)
        .Value = Format(Now(), "ddddd ttttt") '17 : Décrit la partie de la colonne H "H2:Hn".
        End With[/COLOR][/B]
      End With '22
   End With '23
   Application.ScreenUpdating = True
End Sub
 
Re : recopie selon condition (novice macro)

Re...
Bonjour à tous


Roger2327:

Une petit question : pourquoi préfères tu passer par une boucle ?
plutôt que comme ci-dessous (voir lignes en bleu)

Code:
Sub TRI_SELECTION()
   Application.ScreenUpdating = False '4
   With Sheets(3) '5 : Déclare la feuille de référence.
       With .Range(.Cells(1, 8), .Cells(Rows.Count, 1).End(xlUp))
       'reste du code inchangé
        [B][COLOR=Blue]With .Resize(.Rows.Count - 1, 1).Offset(1, 7).SpecialCells(xlCellTypeBlanks)
        .Value = Format(Now(), "ddddd ttttt") '17 : Décrit la partie de la colonne H "H2:Hn".
        End With[/COLOR][/B]
      End With '22
   End With '23
   Application.ScreenUpdating = True
End Sub
Parce que.
(Ouvrez le classeur joint et cliquez sur "Sélection".)​
ROGER2327
#1886
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
208
Réponses
12
Affichages
409
Retour