Rangement d'un tableau

faneva

XLDnaute Nouveau
Bonjour,
J'ai besoin de votre aide pour le probleme suivant
j'ai tableau de type
2 b 1 e - -
1 a 4 f 2 y
4 d - - 5 z
3 c - - 3 w
je voudrais le mettre dans une autre feuille et de type
1 a e -
2 b - y
3 c - w
4 d f -
5 - - z
c'est à dire
les numeros seront rangés dans la colonne 1 par ordre croisssant

J'ai proposé ce code
Mais Lig = Application.WorksheetFunction.Match(libel, range("A:A"), 0), il marche pas


code

Dim Ligne As Integer



Dim l As Long
Dim c As Long





l = 2
c = 1

Dim i As Long
Dim j As Long
Dim lt As Long
Dim ct As Long
Dim lbel as long
Dim ltA As Long
Dim tablout1 As Variant
Dim tablout As Variant
Dim Lig As Integer




Set plage = range("a1:a" & range("a1").End(xlDown).Row)
nbrligne = plage.Cells.Count


colatraiter = 0
indice = 0
Ligne = 1
test = False
j = 1 UBound(tablout, 2) Step 2

i = 1 UBound(tablout, 1) step1


Do While (Worksheets("data").Cells(l, c).value <> "")
l = 2
Do While (Worksheets("data").Cells(l, c).value <> "")
'Do While Application.CountA(Sheets("data").Columns(c)) <> Application.CountA(Sheets("output").Columns(c))
colatraiter = c + 2
libel = Worksheets("data").Cells(l, c).value




value = Worksheets("data").Cells(l, colatraiter).value
If (value <> "") Then
If (value >= 2) Then

montab(indice, c) = libel
montab(indice, c) = ligne

ligne = ligne + 1


indice = indice + 1




Worksheets("output").Select
lt = Sheets("output").Cells(37500, j).End(xlUp).Row + 1
tablout = Sheets("output").range(Cells(1, 1), Cells(lt, ct)).value

ltA = UBound(tablout, 1)




lt = Sheets("output").range(ActiveCell, ActiveCell.End(xlUp)).Row + 1
ct = Sheets("output").range("a1").CurrentRegion.Columns.Count + 1





tablout1 = Sheets("output").range("a1", Cells(range("C65536").End(xlUp).Row)).value

For i = 1 To ltA
If Application.CountIf(range("A:A"), libel) > 0 Then
Lig = Application.WorksheetFunction.Match(libel, range("A:A"), 0)

tablout(Lig, j + 1) = cells(c,l)
ReDim Preserve tablout(1 To lt, 1 To ct)
range(Cells(1, 1), Cells(lt, ct)).value = tablout

Else
tablout(ltA, 1) = libel
ReDim Preserve tablout(1 To lt, 1 To ct)
range(Cells(1, 1), Cells(lt, ct)).value = tablout


End If
Next i



ReDim Preserve tablout(1 To lt, 1 To ct)
range(Cells(1, 1), Cells(lt, ct)).value = tablout

End If


End If





l = l + 1

Loop



c = c + 2
indice = 1
Ligne = 1


j = j + 1
l = 2
i = 1


Loop



End Sub






Merci pour votre aide
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Re : Rangement d'un tableau

Bonjour,

Impossible de comprendre la logique dans ta façon de tirer tes colonnes.
Si tu pouvais expliquer un peu mieux ton méthode de trie, ça serait peut être plus simple pour nous.
Pourquoi passes tu de 4 lignes au départ à 5 après le tri ?
Pourquoi le 1 et 4 de la colonne 3 ont disparu après le tri ?
Sur quels critères te bases tu pour faire "apparaître" le ligne 5 ?
Pourquoi cette ligne est elle 5--Z ? (Pourquoi pas 5-z- ou 5z--...)

N.B. : Penses à mettre la balise Code car là, c'est vraiment inbuvable
 

faneva

XLDnaute Nouveau
Re : Rangement d'un tableau

je te remercie de ton intérêt pour mon pb
J'essaie d'être clair
Les numeros sont des identifiants, et je voudrais tous les metttre au col1 par ordre croissant
a , e x sont des valeurs liés à chaque identifiant et doivent rester dans les col2, col 3 et col 4
Tout se passe comme si on supprime tous les colonnes des chiffres et les mettre en colonne 1

toujours disponible à d'autres questions
 

faneva

XLDnaute Nouveau
Re : Rangement d'un tableau

et voila
VB:
 Dim Ligne As Integer



Dim l As Long
Dim c As Long





l = 2
c = 1

Dim i As Long
Dim j As Long
Dim lt As Long
Dim ct As Long
 Dim lbel as long
 Dim ltA As Long
 Dim tablout1 As Variant
Dim tablout As Variant
 Dim Lig As Integer
 
 
 

Set plage = range("a1:a" & range("a1").End(xlDown).Row)
 nbrligne = plage.Cells.Count


colatraiter = 0
indice = 0
Ligne = 1
test = False
j = 1  UBound(tablout, 2)  Step 2

 i = 1  UBound(tablout, 1) step1


Do While (Worksheets("data").Cells(l, c).value <> "")
    l = 2
    Do While (Worksheets("data").Cells(l, c).value <> "")
    'Do While Application.CountA(Sheets("data").Columns(c)) <> Application.CountA(Sheets("output").Columns(c))
         colatraiter = c + 2
       libel = Worksheets("data").Cells(l, c).value
        

  
                        
         value = Worksheets("data").Cells(l, colatraiter).value
         If (value <> "") Then
            If (value >= 2) Then
             
            montab(indice, c) = libel
              montab(indice, c) = ligne

                ligne = ligne + 1
                
                
                indice = indice + 1
                    
            
            
                
 Worksheets("output").Select
 lt = Sheets("output").Cells(37500, j).End(xlUp).Row + 1
 tablout = Sheets("output").range(Cells(1, 1), Cells(lt, ct)).value
 
 ltA = UBound(tablout, 1)
 

 

lt = Sheets("output").range(ActiveCell, ActiveCell.End(xlUp)).Row + 1
ct = Sheets("output").range("a1").CurrentRegion.Columns.Count + 1





    tablout1 = Sheets("output").range("a1", Cells(range("C65536").End(xlUp).Row)).value

    For i = 1 To ltA
        If Application.CountIf(range("A:A"), libel) > 0 Then
            Lig = Application.WorksheetFunction.Match(libel, range("A:A"), 0)
            
            tablout(Lig, j + 1) = cells(c,l)
            ReDim Preserve tablout(1 To lt, 1 To ct)
range(Cells(1, 1), Cells(lt, ct)).value = tablout
        
        Else
            tablout(ltA, 1) = libel
 ReDim Preserve tablout(1 To lt, 1 To ct)
range(Cells(1, 1), Cells(lt, ct)).value = tablout
        
        
        End If
    Next i



ReDim Preserve tablout(1 To lt, 1 To ct)
range(Cells(1, 1), Cells(lt, ct)).value = tablout

End If


End If
     
                
            
        
        
        l = l + 1
    
    Loop
  
   
    
    c = c + 6
    indice = 1
    Ligne = 1
        
        
        j = j + 6
        l = 2
        i = 1

    
Loop



End Sub






Merci pour votre aide
 

GeoTrouvePas

XLDnaute Impliqué
Re : Rangement d'un tableau

De rien et merci pour les précisions.

Si j'ai bien tout compris, ça reviendrait un peu à :

1) Trier les colonnes 1 et 2, en fonction de la colonne 1
2) Prendre les lettres de la colonne 4 et les placer sur la ligne correspondant l'identifiant de la colonne 3
3) Faire de mêmes avec les lettres des colonnes 5 et 6
4) Supprimer les colonnes 3 et 5

J'avoue qu'en cette fin de semaine, j'ai un peu le cerveau en compote et j'ai du mal à modéliser la routine qu'il faudrait suivre.

Afin de ne pas pousser la réflexion plus loin qu'il ne serait utile, pourrais tu nous dire quels sont les éléments qui risquent de varier entre l'exemple que tu présentes et les cas sur lesquels tu devras effectivement bosser ?

Va - t - il y avoir toujours le même nombre de lignes et de colonnes ?
Est ce que ça sera toujours des chiffres et des lettres ?
..........
 

faneva

XLDnaute Nouveau
Re : Rangement d'un tableau

il y aura 20000 lignes
les colonnes (en lettre) peuvent varier de 2 à 10
il n'y a que des chiffres. j'ai mis seulement les lettre pour les distinguer des identifiants
Tu décris bien le truc. Mais les 2 tableaux ne se trouvent pas sur une même feuille.
Je suis en mode lecture sur la feuille"data"
merci encore
 

GeoTrouvePas

XLDnaute Impliqué
Re : Rangement d'un tableau

Heureusement que je t'ai demandé ces précisions car elles ont finalement de l'importance. C'est un piège dans lequel je suis souvent tombé dans les questions que j'ai pu poser sur XLD : Trop simplifier les exemples que l'on donne peut parfois entraîner une réponse inadaptée au problème d'orogine.

Je vais essayer de voir ce que je peux faire et je repasse.
 

faneva

XLDnaute Nouveau
Re : Rangement d'un tableau

vous avez raison
je vous envoie un fichier d'exemple
Le tableau initial est seulement en mode lecture
cordialement
 

Pièces jointes

  • essai.xls
    13.5 KB · Affichages: 88
  • essai.xls
    13.5 KB · Affichages: 86
  • essai.xls
    13.5 KB · Affichages: 84

GeoTrouvePas

XLDnaute Impliqué
Re : Rangement d'un tableau

Salut MJ13 ! ça faisait looooongtemps !

Pour faire court parce que je vais pas vraiment avoir le temps cette aprèm, je pense que le meilleur moyen serait de faire ce genre de routine :

1) Insérer une colonne avant la colonne 1
2) Recopier les colonnes 4 et 5 à la suite des colonnes 2 et 3. Sur chacune des lignes qui viennent d'être rajoutées, place un "2" dans la colonne 1.
3) Trier le tableau en fonction des valeurs de la colonne 2.
4) Boucler sur toutes les lignes en disant (exemple pour la ligne X) :
Code:
If Cells(X, 2) = Cells(X - 1, 2) Then
    Cells(X - 1, Cells(X, 1)) = Cells(X, 2)
    Rows(X).Delete Shift:=xlUp
Else
    X = X + 1
End If
5) Supprimer les colonnes 4 et 5 et reprendre au point 2) pour les colonnes suivantes
....

Pour moi, ça serait la façon la plus simple de faire le tri.

Je suis désolé mais je n'ai vraiment pas le temps cet aprèm d'écrire et de tester ce code.

Dis moi ce que tu en penses et si tu arrives à le mettre en oeuvre.

++
 
Dernière édition:

faneva

XLDnaute Nouveau
Re : Rangement d'un tableau

Peut être que je n'ai pas bien compris tes explications
Donc après avoir mis le "2" et le"3" dans la colonne 1, j'ai quelques choses comme "23"" en face de l'identifiant 5 par exemple.
Même manuellement avec l'exemple, les instruction 1,2,3 me semblent difficile à réaliser
Merci de mieux m'eclaircir
cordialement
 

Statistiques des forums

Discussions
312 488
Messages
2 088 847
Membres
103 972
dernier inscrit
steeter