Gestion de tableau avec tri automatique

Gestion de tableau avec tri automatique - VB/VBA/VBS - Programmation

Marsh Posté le 02-10-2011 à 01:17:28    

Bonjour,
 
Je vous contacte car débutant en macro VB Excel, je souhaiterai avoir vos conseil pour régler le problème suivant:
 
-> Dans une worksheet, j'ai un tableau de la forme suivante
 
titreA titreB titreC titreD titreE
vache ble 10.2.1 ville valide
cheval mais VIDE ferme valide
vache ble 5.2.1 ferme valide
vache mais VIDE ville valide
vache ble 5.4.6 ville valide
cheval seigle 100.0.7 ferme valide
cheval mais 3.6.1 ville valide
 
Hypotheses:
* L'espace doit etre interprété comme séparateur de cellule
*La taille du tableau peut varier et l'emplacement des colonnes aussi. Ici on va travailler avec les colonnes nommées: "titreA" et "titreC", mais leur emplacement peut varier (seul leur nom est connu et fixe). Pour ça j'avais pensé à l'utilisation d'une fonction de calcul de la taille du tableau et une fonction de recherche de titre de colonne.
* Quand j'écris VIDE: cela signifie que le contenu de la cellule est réellement vide
 
1/ Je souhaite trouver la colonne "titreC" et utiliser un filtre automatique pour ne garder QUE les lignes NON vide (similaire à l'option "Non Blank" du filtre automatique sous Office 2003). Dans notre cas les lignes 3 et 5 ne doivent plus apparaitre.
 
2/ Je souhaite trier la colonne "titreC" préalablement filtré de façon croissante. Le probleme qu'on rencontre ici (existant d'ailleurs aussi avec le filtre automatique) c'est que par ex: 10.2.1 sera devant 5.2.1, ce que je voudrai éviter.
 
3/ Enfin, j'aimerai bien pouvoir filtrer de nouveau le résultat de l'étape précédente suivant la colonne "titreA" en ne gardant que les lignes avec le mot "vache". J'imagine qu'ici aussi la fonction de filtre automatique va être utile
 
Le resultat obtenu des 3 étapes précédentes devrait avoir la forme suivante:
 
titreA titreB titreC titreD titreE
vache ble 5.2.6 ferme valide
vache ble 5.22.3 ville valide
vache ble 10.2.1 ville valide
 
4/Une fois ce tri effectué, je souhaiterai copier ce résultat dans une autre worksheet et supprimer les colonnes "titreB" et "titreD", afin d'obtenir dans une nouvelle worksheet créé:
 
titreA titreC titreE
vache 5.2.6 valide
vache 5.22.3 valide
vache 10.2.1 valide
 
5/ Et dernière étape (si pas trop compliqué), je souhaiterai pouvoir insérer une ligne (de la longueur du tableau où toutes les cellules sont fusionnées) et où serait écrit le numéro de section basé UNIQUEMENT sur le premier nombre des cellules de la colonne "titreC" (ex: 5.2.6 -> nombre 5, 10.2.1 -> nombre 10). Cette ligne devra être affiché des que le nombre change.
Donc dans l'exemple cela donnerait:
 
titreA titreC titreE
*** SECTION 5 *********
vache 5.2.6 valide
vache 5.22.3 valide
*** SECTION 10 *******
vache 10.2.1 valide
 
Je me suis fais une macro sous Excel en mode enregistrement automatique résolvant mon problème, mais le code est vraiment moche!
Donc voilà je me demandais si quelqu'un pourrait m'aider à construire une macro un peu plus propre.
 
Merci d'avance pour votre aide,  
 
 :bounce:  :bounce:  :bounce:

Reply

Marsh Posté le 02-10-2011 à 01:17:28   

Reply

Marsh Posté le 02-10-2011 à 02:45:50    

Salut, cela te fera un excellent exercice d'optimisation manuelle du code généré par l'enregistreur de macros plutôt que d'attendre du tout cuit


---------------
Myanmar 90/91 : http://gadaud.gerard.free.fr/publi [...] index.html
Reply

Marsh Posté le 02-10-2011 à 10:57:20    

Salut kiki29,
 
Je n'attends pas du tout cuit, mais vois tu la dernière fois où j'ai codé cela remonte à plus de 10 ans durant mes études où j'ai fais plusieurs années de C, de Java,... Et honnêtement j'adorais la prog. Mais voila, dans mon travail je ne suis plus du tout amener à programmer et donc j'ai perdu mes réflexes même si les principes de programmation, c'est comme le vélo on n'oublie pas.
 
Donc vois-tu l'idée en venant sur ce forum à la rencontre de gars expérimentés et passionnés qui eux ont tous les reflexes, je recherche avant tout une aide pour la structure de mon code avec des fonctions de bases que bien entendu par la suite je vais devoir adapter.
Par ailleurs tu t'imagines bien que mon probleme de base est un peu plus compliqué que trier des "vaches" dans un tableau de 6 lignes.
Donc bien entendu je compte mettre les mains dans le cambouis. Mais je sais qu'à l'époque ou je programmais, pour résoudre un énoncé comme ça il m'aurait fallu moins de 30min .... maintenant malheureusement (étant en plus newbie en VBA), le temps qui m'est nécessaire en partant de zéro est considérablement plus long que si j'arrive à partir avec une base assez bien faite.
 
En tout cas merci d'avance, pour toute personne ayant l'expérience lui permettant de m'aider sur ce problème sans que cela lui bouffe une journée ;-)

Reply

Marsh Posté le 02-10-2011 à 15:47:07    

Pour les passionnés, je vous donne un bout de code qu'un certain Mercatog m'a gentil fournit sur un autre forum:
 

Code :
  1. '---------------------------------------------------------------------------------------
  2. 'Sub qui permet de copier les données de la feuille SOURCE vers la feuille DESTINATION et reformatage des données suivant les explications fournies
  3. '//!\\ Adapter dans cette sub les noms des 2 feuilles SOURCE et DESTINATION
  4. '      Adapter aussi les mots  TitreC  et  vache
  5. '---------------------------------------------------------------------------------------
  6. '
  7. Private Sub FormaterDonnees()
  8. Dim c As Range, v As Range
  9. Dim i As Integer
  10. Dim Tb
  11. Application.ScreenUpdating = False
  12. 'On efface le contenu éventuel de la feuille Destination
  13. Worksheets("DESTINATION" ).UsedRange.Clear
  14. With Worksheets("SOURCE" )
  15.     'On recherche la colonne TitreC
  16.     Set c = .UsedRange.Find("TitreC", LookIn:=xlValues, lookat:=xlWhole)
  17.     If Not c Is Nothing Then
  18.         c.CurrentRegion.Copy Worksheets("DESTINATION" ).Range("A1" )
  19.         Set c = Nothing
  20.     End If
  21. End With
  22. With Worksheets("DESTINATION" )
  23.     'Suppression des colonnes D ensuite B
  24.     .Columns(4).Delete
  25.     .Columns(2).Delete
  26.     Set c = .Range("A1" ).CurrentRegion
  27.     'Suppression des lignes ne contenant pas vache en colonne TitreA (colonne 1)
  28.     Call SupprFiltre(c, 1, "vache" )
  29.     'Suppression des lignes vides de la colonne TitreC (Colonne 2, qui était colonne 3 avant la suppression de la colonne TitreB)
  30.     Call SupprFiltre(c, 2, "*" )
  31.     'On éclate les nombres séparés par le point dans les colonnes D,E et F
  32.     For Each v In Intersect(c, .Range("B:B" ))
  33.         Tb = Split(v, "." )
  34.         For i = 0 To UBound(Tb)
  35.             v.Offset(0, i + 2) = Tb(i)
  36.         Next i
  37.     Next v
  38.     Set c = c.Resize(c.Rows.Count, c.Columns.Count + 3)
  39.     'On tri sur D, puis E enfin F
  40.     c.Sort Key1:=.Range("D1" ), Order1:=xlAscending, Key2:=.Range("E1" ), Order2:=xlAscending, Key3:=.Range("F1" ), Order3:=xlAscending, Header:=xlYes
  41.     'On insère une ligne entre sections
  42.     Call SepareSections(c)
  43.     'On supprime les colonnes D,E et F
  44.     .Range("D:F" ).EntireColumn.Delete
  45.     Set c = Nothing
  46. End With
  47. End Sub
  48. '---------------------------------------------------------------------------------------
  49. 'Sub qui permet de supprimer les lignes de LaPlage
  50. 'dont les cellules de la colonne LaColonne ne répondant
  51. 'pas au critères LeCritere
  52. '---------------------------------------------------------------------------------------
  53. '
  54. Private Sub SupprFiltre(LaPlage As Range, ByVal LaColonne As Integer, ByVal LeCritere As String)
  55. With LaPlage
  56.     .AutoFilter Field:=LaColonne, Criteria1:="<>" & LeCritere
  57.     .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
  58.     .Parent.AutoFilterMode = False
  59. End With
  60. End Sub
  61. '---------------------------------------------------------------------------------------
  62. 'Sub qui permet d'insérer une ligne de titre entre chaque section
  63. '---------------------------------------------------------------------------------------
  64. '
  65. Private Sub SepareSections(Plage As Range)
  66. Dim i As Integer, N As Integer
  67. With Plage
  68.     N = .Rows.Count
  69.     With .Parent
  70.         For i = N To 2 Step -1
  71.             If .Range("D" & i) <> .Range("D" & i - 1) Then
  72.                 .Rows(i).Insert
  73.                 .Range("A" & i) = "SECTION " & .Range("D" & i + 1)
  74.                 With .Range("A" & i & ":C" & i)
  75.                     .HorizontalAlignment = xlCenterAcrossSelection
  76.                     .Font.Bold = True
  77.                 End With
  78.             End If
  79.         Next i
  80.     End With
  81. End With
  82. End Sub


 
 
Merci d'avance pour toute aide complémentaire ou remarque.
 
Bonne journée,
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed