Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2820 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Trier 2 "bouts" de colonne par date

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Trier 2 "bouts" de colonne par date

n°1882875
Fouinette8​5
Posté le 11-05-2009 à 10:56:44  profilanswer
 

Bonjour,  
 
J'ai un petit problème de tri de colonne.  
J'ai deux colonnes comprenant des dates et j'aurais voulu les ranger en ordre décroissant.  
J'ai donc fait un code pour trier une colonne mais je n'arrive pas à l'adapter afin qu'il puise les données dans une autre colonne que la B lorsqu'il rencontre une cellule vide.  
Je vois met un print écrant du tableau à trier ainsi que l'ébauche de code que j'ai réalisé.
 

Code :
  1. Columns("B:B" ).Select
  2.         ActiveWorkbook.Worksheets("Fiche produit type" ).Sort.SortFields.Clear
  3.         ActiveWorkbook.Worksheets("Fiche produit type" ).Sort.SortFields.Add Key:=Range("B1" ), _
  4.             SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  5.         nbLigne = Range("B65536" ).End(xlUp).Row
  6.         With ActiveWorkbook.Worksheets("Fiche produit type" ).Sort
  7.             .SetRange Range("A2:E1" & nbLigne)
  8.             .Header = xlNo
  9.             .MatchCase = False
  10.             .Orientation = xlTopToBottom
  11.             .SortMethod = xlPinYin
  12.             .Apply
  13.         End With


 
http://download.yousendit.com/U0d3b244Nnk4NVYzZUE9PQ

mood
Publicité
Posté le 11-05-2009 à 10:56:44  profilanswer
 

n°1883267
Fouinette8​5
Posté le 11-05-2009 à 17:09:52  profilanswer
 

J'ai avancé un peu mais mon code bloque (à partir de la ligne 27) et je n'arrive pas à comprendre pourquoi.  
Je suis passée par une colonne intermédiaire réprennant les données des 2 colonnes à trier pour faire au plus simple.  
 

Code :
  1. Dim Ligne As Integer
  2. Dim produit As String
  3. produit = Sheets("reception_donnees" ).Range("D" & cellule).Value
  4.     If Range("B65536" ).End(xlUp).Row > Range("C65536" ).End(xlUp).Row Then
  5.     Ligne = Range("B65536" ).End(xlUp).Row
  6.     Else:
  7.     Ligne = Range("E65536" ).End(xlUp).Row
  8.     End If
  9.     For i = 1 To nbLigne
  10.     If Cells(i, 2) <> "" Then
  11.     Cells(i, 12) = Cells(i, 2)
  12.     ElseIf Cells(i, 5) <> "" Then
  13.     Cells(i, 12) = Cells(i, 5)
  14.     End If
  15.     Next i
  16.     Columns("A:L" ).Select
  17.     Selection.AutoFilter
  18.         ActiveWorkbook.Worksheets(produit).Sort.SortFields.Clear
  19. 'la macro s'exécute jusqu'ici
  20.     ActiveWorkbook.Worksheets(produit).AutoFilter.Sort.SortFields.Add Key:=Range _
  21.         ("L1:L20" ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
  22.         xlSortNormal
  23.     With ActiveWorkbook.Worksheets(produit).AutoFilter.Sort
  24.         .Header = xlYes
  25.         .MatchCase = False
  26.         .Orientation = xlTopToBottom
  27.         .SortMethod = xlPinYin
  28.         .Apply
  29.     End With


Message édité par Fouinette85 le 11-05-2009 à 17:10:24
n°1883327
Fouinette8​5
Posté le 11-05-2009 à 17:35:53  profilanswer
 

Produit est une variable qui traduit mon numéro de produit qui est également mon nom de feuille. Je ne pense pas que ce soit celà qui pose problème car je fonctionnement comme ça dans de nombreuses autres macros sans soucis et que la ligne précédente :  
 

Code :
  1. ActiveWorkbook.Worksheets(produit).Sort.SortFields.Clear


 
fonctionne normalement et me renvoi un numéro de produit correpondant à une feuille belle et bien créer.  
 
Merci du coup de main quand même

n°1883330
kiki29
Posté le 11-05-2009 à 17:37:44  profilanswer
 

Ok, je me suis enduit d'erreur
il faudrait un fichier même parcellaire

n°1883335
Fouinette8​5
Posté le 11-05-2009 à 17:46:39  profilanswer
 

Il est compliqué de fournir un fichier "parcellaire" car comme tu peux le constater mes macros font référence à pas mal de feuilles du fichier. Je t'envoi donc la version intégrale en espérent que le fichier ne t'effraira pas trop ^^
 
Je t'es affiché une feuille produit (n°758884) afin que tu vois ce que je devrais obtenir après l'application de ce bout de macro que tu peux trouver dans le module "fonction" => "Public Sub parcoursDonnees()"
 
http://www.yousendit.com/download/ [...] YUIzZUE9PQ


Message édité par Fouinette85 le 11-05-2009 à 17:47:14
n°1883378
kiki29
Posté le 11-05-2009 à 18:36:43  profilanswer
 

Salut, voir fichier modifié sur http://cjoint.com/?flsI5RwEiK
 


        For i = 1 To nbLigne
 


 remplacé par
 


        For i = 2 To Ligne
 


 
 


        ActiveWorkbook.Worksheets(produit).Sort.SortFields.Clear
        ActiveWorkbook.Worksheets(produit).AutoFilter.Sort.SortFields.Add Key:=Range _
                                                                               ("L1:L20" ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
                                                                          xlSortNormal
        With ActiveWorkbook.Worksheets(produit).AutoFilter.Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
 


 remplacé par
 


        ActiveWorkbook.Worksheets(produit).Sort.SortFields.Clear
        ActiveWorkbook.Worksheets(produit).Sort.SortFields.Add Key:=Range("L2:L20" ) _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         
        With ActiveWorkbook.Worksheets(produit).Sort
            .SetRange Range("A2:L20" )
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With


 
Mais l'erreur principale est dans  

For i = 1 To nbLigne


qui empiète sur le header avec en plus NbLigne qui reste à 0
 
Qqs utilitaires
SmartIndenter sur http://www.oaltd.co.uk/Indenter/Default.htm
MZ Tools for VBA sur  http://www.mztools.com/v3/mztools3.aspx  
 
Utiliser systématiquement Option Explicit
Te renseigner sur CodeName par exemple sur http://www.ozgrid.com/VBA/excel-vba-sheet-names.htm


Message édité par kiki29 le 11-05-2009 à 22:13:26
n°1883548
Fouinette8​5
Posté le 12-05-2009 à 09:33:46  profilanswer
 

Merci du coup de main je testerai tes utilitaires chez moi car au boulot je ne peux pas les installer. Mon problème n'est toujours pas résolu mais je continue de me pencher sur le sujet.

n°1883870
kiki29
Posté le 12-05-2009 à 21:01:26  profilanswer
 

Salut, qqs modifs : notamment j'ai remplacé ">" par ">=" ainsi que 65536 par Rows.Count et insertion de "Ligne" dans les procédures de tri


        'Tri par date de facturation ou proposition
        If Range("B" & Rows.Count).End(xlUp).Row >= Range("C" & Rows.Count).End(xlUp).Row Then
            Ligne = Range("B" & Rows.Count).End(xlUp).Row
        Else:
            Ligne = Range("E" & Rows.Count).End(xlUp).Row
        End If
 
        For i = 2 To Ligne
            If Cells(i, 2) <> "" Then
                Cells(i, 12) = Cells(i, 2)
            ElseIf Cells(i, 5) <> "" Then
                Cells(i, 12) = Cells(i, 5)
            End If
        Next i
 
        ActiveWorkbook.Worksheets(produit).Sort.SortFields.Clear
        ActiveWorkbook.Worksheets(produit).Sort.SortFields.Add Key:=Range("L2:L" & Ligne), _
                                                               SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets(produit).Sort
            .SetRange Range("A2:L" & Ligne)
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
 
        Columns("A:L" ).Select
        Selection.AutoFilter


Message édité par kiki29 le 12-05-2009 à 21:24:41
n°1884288
Fouinette8​5
Posté le 13-05-2009 à 16:14:25  profilanswer
 

Merci bien j'avais réussi à gérer le prob avec la fonction si mais j'utilise tes modifs de  Rows.Count à la place de  65536.  
Merci du coup de main


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Trier 2 "bouts" de colonne par date

 

Sujets relatifs
Requete SQL , PHP et Date (mois)convertir une date en seconde depuis 1970 !!!
requêtes d'insertions inexécutable concat date + comparaison avec nomEnregistrer date format fr dans BDD MySQL
[C] Créer un tableau + trier des données avant envoiDéplacer une colonne
DATE_FORMATboucle sur colonne
détermination d'une dateLargeur de colonne tableau - css
Plus de sujets relatifs à : Trier 2 "bouts" de colonne par date


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR