Filtre automatique, tri et VBA

Filtre automatique, tri et VBA - VB/VBA/VBS - Programmation

Marsh Posté le 19-01-2006 à 22:14:14    

Bonjour,
 
J'ai un fichier avec plus de 2000 lignes. Dans la colonne 2 de chaque ligne, le status est écrit. À l'aide d'un filtre automatique, je peux faire afficher les lignes pour le status que je veux uniquement. Jusque là, pas de problème. Ma macro le fait très bien.
 
Je dois ajouter un commentaire à toutes les lignes visibles suite au filtre automatique. Pour cela, je dois lire les lignes une à une. Pour ce faire, j'utilise ActiveCell.Offset(0, -1). Sauf qu'en faisant cela, Excel s'arrête au ligne qui sont cachés. Pour remédier à cela, j'ai laissé tomber le filtre automatique et j'ai ajouté une instruction qui supprime les lignes non voulues. Mais là ça prend un éternité à faire rouler la macro.
 
Comment je peux passer d'une ligne à une autre en allant seulement aux lignes sélectionnées par le filtre automatique?
 
Existe-t-il une façon de changer l'ordre d'un tri? Par exemple: je voudrais que le status "non actif" s'affiche en premier en faisant un tri.
 
merci

Reply

Marsh Posté le 19-01-2006 à 22:14:14   

Reply

Marsh Posté le 20-01-2006 à 09:43:53    

Salut Zangel
 
Pour tester des cellules et ajouter des commentaire uniquement sur certaines cellules tu n'as pas besoin en VBA de trier ou de filtrer les colone il suffit de faire un test de valeur.
 
Je te propose le code suivant qui fait la mise en place de commentaires. Tu devrais pouvoir le modifier en fonction de tes besoins :)
 

Code :
  1. Sub CommentaireSelonContenu()
  2. 'Déclaration des variable
  3. Dim i As Integer 'Variable pour la boucle
  4. Dim DerniereLigne As Double
  5. Dim TexteCommentaire As String
  6. 'Mise en place de la boucle pour parcourir le tableau
  7. With Sheets(1) 'définir la feuille à traiter
  8.     DerniereLigne = .Cells(65536, 1).End(xlUp).Row
  9.     For i = 1 To DerniereLigne
  10.         Select Case .Cells(i, 1).Value 'mettons que le critère soi dans la colonne 1
  11.             Case Is = 0
  12.                 TexteCommentaire = "Affaire terminée"
  13.             Case Is = 1
  14.                 TexteCommentaire = "Attente paiement"
  15.             '...
  16.             '...
  17.             Case Else
  18.                 TexteCommentaire = ""
  19.         End Select
  20.         If TexteCommentaire <> "" Then
  21.             With .Cells(i, 2) 'Mettons que tu veuilles le commentaire sur la colone B
  22.                 .Select
  23.                 .ClearComments  'enleve les commentaire s'il y en avait avant
  24.                 .AddComment
  25.                 .Comment.Text Text:=TexteCommentaire
  26.             End With
  27.         Else
  28.         End If
  29.     Next i
  30. End With
  31. End Sub


@+


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 20-01-2006 à 22:17:47    

Watashi,
 
Oui je sais que je n'ai pas besoin de trier ou de filtrer les colonnes, mais étant donné que j'ai tellement de lignes à traiter, je préfère enlever les lignes inutiles pour accélérer la procédure. Ça prend environ 10 minutes à rouler toute la procédure. J'ai plusieurs critères en prendre en considération dans ma macro et j'ai plusieurs sous-macros reliées à cette procédure. C'est pour ça que ça prend autant de temps.
 
J'ai découvert qu'on pouvait faire un tri personnalisé (Outils, Options, Liste pers). Cette option est merveilleuse. J'ai fait une liste pour le tri personnalisé avec l'ordre que je veux (le status que je veux en premier). Dans ma macro, quand je suis rendu à un status non voulu, j'efface les lignes de la ligne active jusqu'à la fin. Ainsi, je sauve beaucoup de temps. J'ai fait le test et maintenant, ça me prendre 3-4 minutes pour rouler toute la procédure.  
 
Zangel
 

watashi a écrit :


Pour tester des cellules et ajouter des commentaire uniquement sur certaines cellules tu n'as pas besoin en VBA de trier ou de filtrer les colone il suffit de faire un test de valeur.
@+


Reply

Marsh Posté le 23-01-2006 à 08:57:36    

ok :) bon courage :)
il est vrai que 10 minutes d'exécution de macro c'est très long. Une astuce que j'ai trouvé pour accélerer le traitement de grand tableau est de travailler sur des Arrays faire travailler la macros sur des données en "virtuel" et éviter les multiples lectures-écriture.
@+


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 23-01-2006 à 11:20:56    

zangel_xyz a écrit :


Existe-t-il une façon de changer l'ordre d'un tri? Par exemple: je voudrais que le status "non actif" s'affiche en premier en faisant un tri.


 
salut zangel_xyz,
pour cela tu fais :
 
Columns("A:A" ).Select
Selection.Sort Key1:=Range("A1" ), Order1:=xlDescending
 
cela te fais un tri décroissant (xlAscending pour tri croissant) sur la colonne A
car je suposse que tes status sont "non actif" at "actif"

Reply

Marsh Posté le 23-01-2006 à 14:11:23    

Watashi,
 
des arrays... hum ça pourrait m'intéressée, sauf que j'en ai jamais entendu parler. As-tu des site Web à me suggérer pour comprendre le tout?
 
merci.
 

watashi a écrit :

ok :) bon courage :)
il est vrai que 10 minutes d'exécution de macro c'est très long. Une astuce que j'ai trouvé pour accélerer le traitement de grand tableau est de travailler sur des Arrays faire travailler la macros sur des données en "virtuel" et éviter les multiples lectures-écriture.
@+


Reply

Marsh Posté le 23-01-2006 à 16:11:43    

zangel_xyz a écrit :

Watashi,
 
des arrays... hum ça pourrait m'intéressée, sauf que j'en ai jamais entendu parler. As-tu des site Web à me suggérer pour comprendre le tout?
 
merci.


Salut zangel, les arrays sont des tableaux stockés en mémoire tu trouveras de bonne info dans l'aide de visual Basic dans excel. Pour ce qui est des sites web tu as les classiques VBFrance et Excellabo qui ont quelques informations dessus.
 
Voilà l'exemple d'une macro qui rempli un array à partir des données contenues dans 16 colonnes sur autant de ligne que besoin

Code :
  1. Dim MonArray() as variant
  2. Dim DeniereLigne as Double
  3. Derniereligne = cells(65536,1).End(xlup).row
  4. Dim c as integer
  5. Dim l as integer   
  6. With Workbooks(1).Sheets(1)
  7.            ReDim Preserve Nomen(15, DerniereLigne - 1)  '-2 si tu as une ligne de titre
  8.            For l = 1 to Deniereligne Step 1    ' l = 2 si tu as une ligne de titre
  9.                 For c = 1 To 16 Step 1
  10.                     MonArray(l - 1, c - 1) = .Cells(l, c).Value 'l-2 si ligne de titre
  11.                 Next c
  12.             Next l
  13. End With


 
Si tu as besoin d'infos en plus hesites pas ;)
@+


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Sujets relatifs:

Leave a Replay

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