Recherche 3 critères ligne par ligne / couper et coller ...
Résolu
mat297
Messages postés
19
Date d'inscription
Statut
Membre
Dernière intervention
-
mat297 Messages postés 19 Date d'inscription Statut Membre Dernière intervention -
mat297 Messages postés 19 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je travail sur un fichier excell de 6000 lignes,
Je cherche a créer un code pour qu'il prenne la premiere ligne, qu'il fausse une recherche sur les autres lignes et s'il trouve, il inverse l'odre des lignes.
idem, il doit faire une recherche en prenant les critères de la deuxieme ligne, 3 eme ...jusqu'a la la dernière ligne (grosso modo 6000).
Ce qui est copmliqué est qu'une macro ne fonctionne pas car les critères vont changer suivant la ligne recherchée.
le but recherché es que pour le bloc de 4 ou 5 ligne trouvé, il mette en en premier (dans le bloc) le ligne qui a critère différent.
des idées ? je vous remercie
Je travail sur un fichier excell de 6000 lignes,
Je cherche a créer un code pour qu'il prenne la premiere ligne, qu'il fausse une recherche sur les autres lignes et s'il trouve, il inverse l'odre des lignes.
idem, il doit faire une recherche en prenant les critères de la deuxieme ligne, 3 eme ...jusqu'a la la dernière ligne (grosso modo 6000).
Ce qui est copmliqué est qu'une macro ne fonctionne pas car les critères vont changer suivant la ligne recherchée.
le but recherché es que pour le bloc de 4 ou 5 ligne trouvé, il mette en en premier (dans le bloc) le ligne qui a critère différent.
des idées ? je vous remercie
A voir également:
- Recherche 3 critères ligne par ligne / couper et coller ...
- Partager photos en ligne - Guide
- Mètre en ligne - Guide
- Aller à la ligne excel - Guide
- Apparaitre hors ligne instagram - Guide
- Couper photo en 3 instagram en ligne - Guide
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Cela ne me semble pas particulièrement compliqué à faire en VBA.
Le plus dur sera que tu expliques ce que tu attends. Tu écris "faire une recherche, trouver", et "faire une recherche en prenant les critères de la deuxième ligne" : cela signifie quoi?
Par "inverser l'ordre des lignes", veux-tu dire "intervertir les lignes, remplacer l'une par l'autre"?
Tu parles de "blocs de lignes" : veux-tu dire qu'il ne faut pas travailler sur les 6000 lignes en une fois, mais sur des blocs? Comment séparer ces blocs?
Le plus simple serait sans doute que tu partages ton fichier, et que tu y ajoutes des exemples du résultat final que tu attends.
Le plus dur sera que tu expliques ce que tu attends. Tu écris "faire une recherche, trouver", et "faire une recherche en prenant les critères de la deuxième ligne" : cela signifie quoi?
Par "inverser l'ordre des lignes", veux-tu dire "intervertir les lignes, remplacer l'une par l'autre"?
Tu parles de "blocs de lignes" : veux-tu dire qu'il ne faut pas travailler sur les 6000 lignes en une fois, mais sur des blocs? Comment séparer ces blocs?
Le plus simple serait sans doute que tu partages ton fichier, et que tu y ajoutes des exemples du résultat final que tu attends.
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Je propose ceci:
Option Explicit Const stock As String = "STOCK" Const cref As Long = 1 Const cmag As Long = 2 Const cdat As Long = 3 Sub mat297() Dim ws As Worksheet Dim anc_ref, anc_date Dim nv_ref, nv_date Dim lig As Long Dim dansbloc As Boolean Dim ligstock As Long ' ligne avant laquelle il faut deplacer les lignes avec "stock" Set ws = ActiveSheet dansbloc = False lig = 3 anc_ref = ws.Cells(lig - 1, cref) anc_date = ws.Cells(lig - 1, cdat) nv_ref = ws.Cells(lig, cref) nv_date = ws.Cells(lig, cdat) Do While nv_ref <> "" If (anc_ref = nv_ref) And (anc_date = nv_date) Then If Not dansbloc Then ' deuxieme ligne d'un bloc dansbloc = True If ws.Cells(lig - 1, cmag) = stock Then ligstock = lig Else ligstock = lig - 1 End If End If If ws.Cells(lig, cmag) = stock Then If ligstock <> lig Then ' déplacer lig avant ligstock 'Debug.Print "deplacer " & lig & " avant " & ligstock ws.Rows(ligstock).Insert xlShiftDown ws.Rows(lig + 1).Copy ws.Rows(ligstock) ws.Rows(lig + 1).Delete xlShiftUp End If ligstock = ligstock + 1 End If Else dansbloc = False anc_ref = nv_ref anc_date = nv_date End If lig = lig + 1 nv_ref = ws.Cells(lig, cref) nv_date = ws.Cells(lig, cdat) Loop 'Do While wb.Cells(lig, 1) <> "" End Sub
Je suppose qu'il n'y a pas de ligne blanche dans ton fichier. C'est exact?
Si je résume, tu veux que, quand plusieurs lignes successives ont les mêmes valeurs en colonnes 1 et 3, celles qui contiennent "STOCK" en colonne 2 soient présentes avant les autres.
Bête question : pourquoi ne fais-tu pas simplement un tri de tout, c'est parce que tu veux préserver l'ordre des blocs, et ne changer l'ordre qu'à l'intérieur des blocs?
En effet, c est avant traitement. Je me suis trompé désolé, le bloc 3 est ok c est plutot le bloc 4. Il n'y a en effet pas ligne blanche, j'ai espacé pour rendre clair ma demande..et effectivement je ne peux pas faire de tri sur le fichier car ca casserait la structure du fichier, dommage que je n'arrive pas a joindre le fichier. sinon oui c est bien ca, si memes valeurs en colonne 1 et 3 celles qui contiennent "stock" en colonne 2 doivent etre présentes devant les autres. merci beaucoup