PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008
-
31 mars 2008 à 22:34
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008
-
21 avril 2008 à 21:28
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
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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 avril 2008 à 06:16
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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 avril 2008 à 09:54
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
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008 3 avril 2008 à 20:42
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008 3 avril 2008 à 22:20
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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 avril 2008 à 06:37
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^^
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008 7 avril 2008 à 22:49
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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 8 avril 2008 à 05:49
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
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008 9 avril 2008 à 21:45
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
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008 9 avril 2008 à 21:51
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
PQI
Messages postés18Date d'inscriptionlundi 31 mars 2008StatutMembreDernière intervention21 avril 2008 10 avril 2008 à 20:44
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()