Copier/Coller de lignes d'un classeur à l'autre [Résolu]

Signaler
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008
-
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008
-
Bonsoir

Je débute, et VB et j'aimerais savoir si c'est possoble d'avoir de l'aide de vous tous sur un code qui me permet
de rechercher une valeur sur une colonne exemple 2008 parmi d'autres valeurs,  et de selectionner toute la ligne et copier et coller sur
sur une autre feuille intitulé echeance 2008.
ex:

               a                              b                     c                                      d                                  e
9           Jeremi                     en ordre           utilisé                            années                      prochaine utilisation

10         oui                              oui                  2007                                 1                                    2008
11         oui                              oui                  2008                                 1                                    2009
12         oui                              oui                  2007                                 1                                    2008

J'aimerais que la macro recherche dans la colonne   "e"   la valeur 2008 parmis et selectionne toute la ligne dans ce cas ligne "10"  & "12 " et me la colle tles eléments dans une autre feuille appelée echeance 2008.

merci de votre aide.

       

31 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
le code actuel est :
Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Dim i As Long
Dim nRow As Long
'# On voide la feuille de déstination
voSheetDst.Cells.Clear
'# i va prendre toutes les valeurs de 1 à l'indice de ligne de la dernière cellule (donc on parcoures toutes les lignes de la feuille source)
For i = 9 To voSheetSrc.Cells.SpecialCells(xlCellTypeLastCell).Row
'# Si le contenu de la cellule i,16 => ligne courante, troisème colonne, contien l'année recherchée, alors...
If voSheetSrc.Cells(i, 16) = vnYear Then
'# On ajoute 1 à nRow, qui stocke le numéro de la ligne a laquelle on va ecrire le résultat dans le classeur destination
nRow = nRow + 1
'# Ici, on on recopie(Copy) toute la ligne (EntireRow) dans la ligne nRow du classeur de destination
voSheetSrc.Cells(i, 16).EntireRow.Copy voSheetDst.Cells(nRow, 1)
End If
Next i
End Sub


la ligne
nRow = nRow + 1

permet de décaler l'ecriture, pour apsser a la ligne suivante.
je t'ai dit d'initialiser nRow à 8;

fais donc tout simplement :

Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Dim i As Long
Dim nRow As Long
nRow = 8
'# On voide la feuille de déstination
voSheetDst.Cells.Clear
'# i va prendre toutes les valeurs de 1 à l'indice de ligne de la dernière cellule (donc on parcoures toutes les lignes de la feuille source)
For i = 9 To voSheetSrc.Cells.SpecialCells(xlCellTypeLastCell).Row
'# Si le contenu de la cellule i,16 => ligne courante, troisème colonne, contien l'année recherchée, alors...
If voSheetSrc.Cells(i, 16) = vnYear Then
'# On ajoute 1 à nRow, qui stocke le numéro de la ligne a laquelle on va ecrire le résultat dans le classeur destination
nRow = nRow + 1
'# Ici, on on recopie(Copy) toute la ligne (EntireRow) dans la ligne nRow du classeur de destination
voSheetSrc.Cells(i, 16).EntireRow.Copy voSheetDst.Cells(nRow, 1)
End If
Next i
End Sub
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
52
Salut,
Regarde les possibilité apporté par l'objet Range
et notament,

.Find
.EntireRow
.Copy

avec cela tu devrais être capable d'avancer.
@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
méthode "naïve" qui ne requiert pas de connaissances particulières (hormis l'algorithmie de base)

Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Dim i As Long
Dim nRow As Long
voSheetDst.Cells.Clear
For i = 1 To voSheetSrc.Cells.SpecialCells(xlCellTypeLastCell).Row
If voSheetSrc.Cells(i, 3) = vnYear Then
nRow = nRow + 1
voSheetSrc.Cells(i, 3).EntireRow.Copy voSheetDst.Cells(nRow, 1)
End If
Next i
End Sub

Sub test()
TransferLinesByYear Worksheets("Feuil1"), Worksheets("Feuil2"), 2008
End Sub
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

je vais essayer ce code
merci encore
mais pourrais tu m'expliquer la prième ligne
Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long) =????

Je débute par des petites macros et de la documentation, peut-être naïve pour toi mas pour moi !!!
en tout cas merci encore je vais  l'essayer
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

resalut
voSheetSrc.Cells(i, 3).EntireRow.Copy voSheetDst.Cells(nRow, 1)  =cette ligne ne marche pas
Au fait quand la macro fera la copie 2008 sur l'autre page 2008 , 2008 pourra etre n'importe ou sur n'importe quelle ligne
car j'ai 6500 lignes

est-ce que je me fais compreendre ou ??
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Bon, alors, reprenons. Je vais t'expliquer mon code, le but etant que tu en comprenne le fonctionnement.

Son but déjà: Recopier les lignes d'une feuille d'un classeur a l'autre.
Pour se faire, il recherche une année spécifique, en regardant dans la troisième colonne du classeur source.
Pour être facilement réutilisable, il se présente sous la forme d'une procédure, prenant en parametre deux objetx WorkSheet (un classeur),
ainsi que l'année recherchée. On pourrais éventuellement y ajouter l'indice de la colonne de recherche, la ligne de départ (Offset) a utiliser dans la seconde feuillé, etc

'# Déclaration de notre procédure de transfert
Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Dim i As Long
Dim nRow As Long
'# On voide la feuille de déstination
voSheetDst.Cells.Clear
'# i va prendre toutes les valeurs de 1 à l'indice de ligne de la dernière cellule (donc on parcoures toutes les lignes de la feuille source)
For i = 1 To voSheetSrc.Cells.SpecialCells(xlCellTypeLastCell).Row
'# Si le contenu de la cellule i,3 => ligne courante, troisème colonne, contien l'année recherchée, alors...
If voSheetSrc.Cells(i, 3) = vnYear Then
'# On ajoute 1 à nRow, qui stocke le numéro de la ligne a laquelle on va ecrire le résultat dans le classeur destination
nRow = nRow + 1
'# Ici, on on recopie(Copy) toute la ligne (EntireRow) dans la ligne nRow du classeur de destination
voSheetSrc.Cells(i, 3).EntireRow.Copy voSheetDst.Cells(nRow, 1)
End If
Next i
End Sub


'# Exemple d'utilisation
Sub test()
'# Ici, on lance le transfert des lignes du classeur nommé Feuil1 concernant l'année 2008 vers le classeur nommé Feuil2
TransferLinesByYear Worksheets("Feuil1"), Worksheets("Feuil2"), 2008
End Sub



veilles bien, donc, a appeler la procédure en lui fournissant les bons noms de feuille.
attention également a adapter le code à tes besoins: ici, on recherche par exemple dans la troisème colonne.

"cette ligne ne marche pas" => c'est pas très informatique comme notion... donne moi du concret, un code d'erreur, un message quelconque...



enfin, pour ta question :
"Au fait quand la macro fera la copie 2008 sur l'autre page 2008 , 2008 pourra etre n'importe ou sur n'importe quelle ligne
car j'ai 6500 lignes"

a la lecture éclairée du code, tu ne peux que constater que ce point est pris en compte.

en tous cas, j'ai testé ce code lors de sa mise au point, avec un classeur bidon, des données fictives, mais avec diverses années, mises en vrac, et ca fonctionnais... donc normallement, y'a pas de raison que ca coince chez toi^^
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
ah oui, en passant, j'ai fait du ménage, changé le titre, la catégorie...
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

Bonsoir, à cette ligne il crée un message d'erreur

 TransferLinesByYear

Qui est    ERREUR DE COMPILATION :
               SUB OU FONCTION NON DEFINIE

voilà.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
ba je sais pas ou tu as collé ca, parce que la sub est bel et bien défini quelques lignes plus haut :

Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

Bonsoir Renfield,
 Le voila ton code

Sub Tri_echeance2008()


'
' Tri_echeance2008 Macro
' Macro enregistrée le 03.04.2008 par CARLOS CIDADES
'




Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Dim i As Long
Dim nRow As Long
    '# On voide la feuille de déstination
    voSheetDst.Cells.Clear
    '# i va prendre toutes les valeurs de 1 à l'indice de ligne de la dernière cellule (donc on parcoures toutes les lignes de la feuille source)
    For i = 9 To voSheetSrc.Cells.SpecialCells(xlCellTypeLastCell).Row
'# Si le contenu de la cellule i,3 => ligne courante, troisème colonne, contien l'année recherchée, alors...
        If voSheetSrc.Cells(i, 16) = vnYear Then
    '# On ajoute 1 à nRow, qui stocke le numéro de la ligne a laquelle on va ecrire le résultat dans le classeur destination
            nRow = nRow + 1
            '# Ici, on on recopie(Copy) toute la ligne (EntireRow) dans la ligne nRow du classeur de destination
            voSheetSrc.Cells(i, 16).EntireRow.Copy voSheetDst.Cells(nRow, 1)
        End If
    Next i
End Sub




'# Exemple d'utilisation
    '# Ici, on lance le transfert des lignes du classeur nommé Feuil1 concernant l'année 2008 vers le classeur nommé Feuil2
    TransferLinesByYear Worksheets("Recap"), Worksheets("echeance 2008"), 2008
End Sub

Que je n'arrivempas a faire fonctionner même en le modifiant.
Je vais bâcher.
Je n'y arrive pas. Merci
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
manque une Sub là...

'# Exemple d'utilisation
'# Ici, on lance le transfert des lignes du classeur nommé Feuil1 concernant l'année 2008 vers le classeur nommé Feuil2
TransferLinesByYear Worksheets("Recap"), Worksheets("echeance 2008"), 2008
End Sub


mets plutot (par exemple)

'# Exemple d'utilisation
Private sub Test()
'# Ici, on lance le transfert des lignes du classeur nommé Feuil1 concernant l'année 2008 vers le classeur nommé Feuil2
TransferLinesByYear Worksheets("Recap"), Worksheets("echeance 2008"), 2008
End Sub
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

Bonsoir renfield,
j'ai essayé ta drenière ligne, ca a marche correctement 1 seule fois, après ca crée une erreur de compilation end sub attendu.
Voilà et ca ne marche plus
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

Sub Tri_echeance_2008()


'
' Tri_echeance_2008 Macro
' Macro enregistrée le 03.04.2008
'




Private Sub TransferLinesByYear(ByRef voSheetSrc As Worksheet, ByRef voSheetDst As Worksheet, ByVal vnYear As Long)
Dim i As Long
Dim nRow As Long
    '# On voide la feuille de déstination
    voSheetDst.Cells.Clear
    '# i va prendre toutes les valeurs de 1 à l'indice de ligne de la dernière cellule (donc on parcoures toutes les lignes de la feuille source)
    For i = 9 To voSheetSrc.Cells.SpecialCells(xlCellTypeLastCell).Row
'# Si le contenu de la cellule i,16 => ligne courante, troisème colonne, contien l'année recherchée, alors...
        If voSheetSrc.Cells(i, 16) = vnYear Then
    '# On ajoute 1 à nRow, qui stocke le numéro de la ligne a laquelle on va ecrire le résultat dans le classeur destination
            nRow = nRow + 1
            '# Ici, on on recopie(Copy) toute la ligne (EntireRow) dans la ligne nRow du classeur de destination
            voSheetSrc.Cells(i, 16).EntireRow.Copy voSheetDst.Cells(nRow, 1)
        End If
    Next i
End Sub




'# Exemple d'utilisation
Private Sub Test()
    '# Ici, on lance le transfert des lignes du classeur nommé recap concernant l'année 2008 vers le classeur nommé echeance 2008
    TransferLinesByYear Worksheets("Recap"), Worksheets("echeance 2008"), 2008
End Sub

Voila ta macro complete. t'est presque près du but, par contre je ne compreends pas pourquoi elle a marche une fois et après plus.
Je te remercie si tu peux encore essaier, car là je suis dépassé.
merci beaucoup de ton aide
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
MA MACRO ?

euh....

TU as ajouté

Sub Tri_echeance_2008()

et il lui manque un End Sub, effectivement.....
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

C'était sans méchanceté, au contraire.
C'est toi qui l'a crée, je ne sais simplement pas la faire bien marcher.
Mais je te remercie beaucoup de ton aide.
Tu veux dire quoi par j'ai ajouté Sub Tri_echeance_2008()
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
que cette ligne n'a rien a faire ici ^^ tout simplement

elle indique le début d'une procédure nommée Tri_echeance_2008
mais elle n'est pas fermée (End Sub)
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

Ok. je l'ai fermé,
la il ne copie rien  non plus.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
tu lances bien la procédure "test", nous sommes d'accord ?
Messages postés
18
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
21 avril 2008

Je ne vois pas ce que tu veux dire par là
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
comment lances-tu l'execution du transfert ?