Recherche 3 critères ligne par ligne / couper et coller ...

Résolu/Fermé
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016 - 25 déc. 2016 à 12:22
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016 - 27 déc. 2016 à 09:26
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
A voir également:

2 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
25 déc. 2016 à 12:53
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.
0
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016
25 déc. 2016 à 15:15
Merci pour ta réponse, en effet ce n'est pas assez clair.

Mon but est de trouver dans chaque bloc ayant la meme référence de faire remonter en premier une ligne qui est mal positionné. qui devrait remonter en premier dans le bloc et non en dernier.


voici un exemple de quelques lignes (je n' arrive pas a partager mon fichier) où nous avons 3 colonnes (référence, Magasin et date).

Dans le premier bloc rien de spécial a changé mais dans le bloc 2 et 3 que j'ai espacé, on voit qu'ils ont tous la meme referénce (critère 1) et meme date (critere 2),
du coup il faut que les lignes qui contiennent un magasin (stock) remontent en premier dans le block.

ce code doit me permettre de parcourir un fichier qui peut contenir plus de 6000 lignes.

merci beaucoup



Référence Magasin Date

10268100 STOCK 16/02/2016
10159100 54242 17/05/2016
10196100 STOCK 10/06/2016
11998100 STOCK 21/06/2016
10077001 STOCK 26/06/2016
11882100 24150 27/06/2016


11925100 10711 08/07/2016
11925100 STOCK 08/07/2016


10273100 STOCK 29/07/2016
10324100 STOCK 01/08/2016
10205100 STOCK 19/08/2016
10063100 STOCK 19/08/2016
11855005 STOCK 02/09/2016
12122100 19450 08/09/2016


10273100 19454 12/09/2016
10273100 STOCK 12/09/2016

18070004 STOCK 15/09/2016
18070005 STOCK 15/09/2016
11685100 STOCK 17/09/2016
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
Modifié par yg_be le 25/12/2016 à 17:06
Je suppose que tu me montres la situation avant traitement, et que la situation après traitement est identique, à part que dans les blocs deux et quatre (tu as écrit 3), les deux lignes doivent être inversées. C'est juste?
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?
0
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016
25 déc. 2016 à 17:21
Je ne sais quoi répondre :) tu as fait la bonne déduction sur l'ensemble des points.

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
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
25 déc. 2016 à 19:22
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
0
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016
25 déc. 2016 à 19:34
merci infiniment, c'est vraiment sympa, je vais tester et partir de là.
0
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016
25 déc. 2016 à 20:34
Je te sollicite encore une fois.
En fait il y'a un blocage à l'execution, il n'y a pas de résultat car je crois qu'une fois à cette étape (je l'ai executé en mode pas a pas) , il n'execute pas ce qui suit mais dès qu'il arrive à cette condition

=> If (anc_ref = nv_ref) And (anc_date = nv_date) Then
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
25 déc. 2016 à 20:55
J'ai supposé que tes données commençaient en ligne 2. C'est exact? Sinon, change la ligne 17: remplace 3 par la deuxième ligne de données.
J'ai supposé que tes données étaient dans la feuille active au moment de l'appel du code. Tu peux changer la ligne 15 si nécessaire.
0
mat297 Messages postés 19 Date d'inscription dimanche 25 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016
25 déc. 2016 à 21:29
oui c est bien ca, les données commencent en ligne 2.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
25 déc. 2016 à 21:35
Quel est le blocage?
0