Tri et compteur de tri

Résolu
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009 - 20 mai 2008 à 12:19
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 4 juin 2008 à 23:42
Bonjour à tous,


Je suis débutant en VBA excel, j'aimerais effectuer plusieurs opérations en MACRO, afin d'automatiser un travail répétitif...


But  : effectuer plusieurs tri sur différentes colonnes : j'utilise ce code :

Sub test2()


Selection.AutoFilter Field:=3, Criteria1:="=bleu", Operator:=xlOr, _
Criteria2:="=rouge"


End Sub

Par contre je désire compter le résultat de ce trie et copier le résultat dans une cellule d'un autre onglet afin ensuite de faire une opération de division par exemple avec le résultat d'un autre tri...

Je sais que c'est possible, mais je ne sais pas par ou commencé, j'avoue être plus doué en coldfusion...

Merci pour vos réponses!!!

22 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
29 mai 2008 à 11:01
Sheets("Feuil2").Range("E1") = Compteur

si c'était dans un autre classeur, il faudrait aussi le spécifier
Workbooks("MonClasseur").Sheets("MaFeuille").Range("MaCellule") = Valeur

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
3
lotfibou Messages postés 1 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 20 mai 2008
20 mai 2008 à 12:39
Salut,
Votre demande n'est pas suffisament claire
essayez de detailler plus

Pour effectuer des tris c'est plus simple de cette sorte:

"Range("A11:i500").Sort Key1:=ActiveCell.Columns, key2:=Columns("a")"

resolvons d'abord cette etape

Salut!
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
20 mai 2008 à 16:25
Salut,
"Par contre je désire compter le résultat de ce trie et copier le résultat dans une cellule "

Pourrais-tu être plus precis sur le sens de cette phrase? "compter le résultat de ce trie "

Jimy
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
20 mai 2008 à 16:27
Lotfibou, je ne comprend pas le code ci dessus...
Comment renseigner les critères de tri???
On va considérer la colonne B, pour le tri sur plusieurs critères : bleu et rouge... ensuite je veux compter le nombre de cellule qui correspondent à ce tri et coller le résultat dans une cellule vide dans un autre onglet...

merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
20 mai 2008 à 16:37
A mon sens, ce sont deux choses bien distinct, il n'est pas nécessaire de trier ta colonnes pour compter les cellules remplissant les condions que tu souhaites!

Le tri est une fonction
Le comptage est une seconde fonctions qui doit être rapidement codable en scannant les cellules de ta colonne une à une et en verifiant qu'elle remplissent les conditions que tu souhaites. si oui, increment une variable que tu recopie ou bon te semble..

Jimy
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
20 mai 2008 à 21:57
merci, jimy

donc je créer une variable dans un compteur

je connais pas trop la procédure,
sub test()

dim ma variable

If "ma variable" = "bleu" then
i = i + 1
and if "ma variable" ="rouge" then
i=i+1
end if

end sub

je pense qu'il y a des erreurs, j'ai fais un peu de javascript & coldfusion + sql, mais VBA, je suis allergique...
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
20 mai 2008 à 22:07
Pas tout a fait,

J'imagine que tu souhaite connaitre le Nb de cellules rouges et le Nb de cellules bleu, il ne faut donc pas incrementer la même variable pour les deux.

Un exemple a adapter..

Dim NbRouge as integer
Dim NbBleu as Integer

for index=1 to X
If cells(index,colonne) est rouge then NbRouge=NbRouge +1
If cells(index,colonne) est bleu then NbBleu =NbBleu +1
Next index

Je te laisse le soin de remplacer "est rouge' par le code approprié.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
20 mai 2008 à 23:50
Il faut faire une distinction entre TRI et FILTRE
Le premier change la disposition des lignes selon les valeurs de tri demandées.
Le second ne fait que ressortir les valeurs recherchées sans changer la disposition.

Pour ce qui est des couleurs, est-ce que ce sont des mots ou des couleurs véritables ?
Si ce sont des mots, comme je pense, une simple formule NB.SI devrait faire l'affaire.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
26 mai 2008 à 19:21
exact, en fait je compte les cellules qui sont rempli avec les mots "rouge" et "bleu", mais elles peuvent etre rempli par les mots "ok" et "pas ok", peu importe, je veux compter le nombre de cellules qui sont renseigner par ces critères et coller ce resultats dans une autre cellule et un autre onglet!
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
27 mai 2008 à 00:12
Donc, dans ton autre feuille, tu n'as qu'à inscrire la formule
=NB.SI(Feuil1!A:A;"bleu")

Il ne te reste qu'à changer le nom de la feuille, la colonne et le mot recherché.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
27 mai 2008 à 23:01
Merci MPi, sa marche bien, par contre je fais insister sur le fais de construire un compteur, vu que je n'avance pas et que ce comptage devra avoir lieu par exemple en fonction du mois en cours, si mois d'avril, alors mon résultat s'inscrit dans l'onglet "avril".
Peut-on sinon utiliser cette formule en vba?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
27 mai 2008 à 23:25
C'est certain qu'en VBA, c'est possible, mais est-ce nécessaire dans ton cas ? Là, c'est toi qui a la réponse...

Si tu utilisais une colonne vide et que tu y insérais des 1, tu pourrais faire la somme des valeurs recherchées selon plusieurs critères avec SOMMEPROD

Imagine des noms de couleurs en A, des mois en B et des 1 en C
SOMMEPROD((A1:A100"bleu")*(B1:B100="avril")*(C1:C100))
Cette formule te donnera le nombre de fois (addition des 1) que le mot "bleu" apparaît lorsque le mois est "avril".

Mais comme je le disais, le faire par VBA demeure toujours possible...
Avec une boucle

For i = 1 to nbLignes    If LCase(range("A" & i)) "bleu" and LCase(Range("B" & i)) "avril" Then
       Compteur = Compteur + 1
    End If
Next

Range("D1")= Compteur

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
28 mai 2008 à 18:29
MPi, voila mon code :

Sub test9()


For i = 1 To nbLignes    If LCase(Range("C" & i)) "bleu" And LCase(Range("C" & i)) "vert" Then
       Compteur = Compteur + 1
    End If
Next


Range("E1").Select = Compteur


End Sub

J'ai une erreur : Objet requis

???
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
29 mai 2008 à 00:02
Rapidement, je vois 2 erreurs:
nbLignes n'est pas déclaré et initialisé

Dim nbLignes As Long
NbLignes = Cells(Rows.Count, "A").End(xlUp).row

2e: Dans ton IF tu mets un AND pour vérifier le contenu de C1
    C1 ne peut pas être "bleu" ET "vert"
    Si je comprend le sens de ton code, il faudrait utiliser OR    Ce qui donne «Si C1 bleu OU C1 vert»If LCase(Range("C" & i)) "bleu" OR LCase(Range("C" & i)) "vert" Then

Et une 3e finalement
Range("E1")<strike>.Select </strike>= Compteur
Range("E1") = Compteur  ' c'est mieux ainsi...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
29 mai 2008 à 10:36
MErci, sa marche impecable!!
par contre pour coller le résultat dans un autre onglet, faut-il indiquer :

Range("E1") = Compteur

du genre

Range(Sheet2"E1") = Compteur
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
2 juin 2008 à 12:28
merci, sa marche exactement comme je le souhaitais!!


 


Maintenant je vais modifier le code pour qu'au lancement de ma macro, les tris se fasse sur plusieurs colonnes et plusieurs critères...


en tout cas merci à tous pour l'aide
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
2 juin 2008 à 23:03
Par contre lors de l'initialisation de nblignes :

NbLignes = Cells(Rows.Count, "A").End(xlUp).row

à quoi sert le A, il m'oblige à avoir ma colonne A remplie, alors que je compte en colonne C, si cette colonne n'est pas remplie autant que la C, alors le compteur ne marche pas correctement...j'ai essayé en mettant C, à la place de A...mais sans résultat?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
3 juin 2008 à 00:29
Cette ligne de code se positionne à la dernière ligne de la feuille spécifiée ou de la feuille active si non spécifiée. Le "A" signifie que l'action se passe sur cette colonne. Le End(xlUp) remonte de la dernière ligne, toujours dans cette colonne jusqu'à la première donnée trouvée.

Si tu mets un C, tu devrais avoir le numéro de la dernière ligne contenant des données en C.

Si tu es certain d'avoir au moins UNE donnée dans la feuille, tu peux aussi utiliser ceci:
nbLignes = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Ceci te retournera la dernière ligne qui contient des données, peu importe la colonne.

Même chose pour les colonnes
nbColonnes = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
je182th Messages postés 13 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 20 février 2009
4 juin 2008 à 09:40
Aujourd'hui voila mon code pour parcourir la liste, par contre je parcours la liste de la colonne C, mais le compteur ne fonctionne plus, je ne sais pas comment faire le lien...par contre y'a t-il un moyen de  ne pas voir le traitement s'effectuer?


Sub test10()


Dim Ref As String


  'Parcours de la feuille : sheet1
   Sheets("sheet1").Select
   Range("C2").Select
   Do
      Ref = ActiveCell.Value
ActiveCell.Offset(1, 0).Select
      Loop Until IsEmpty(ActiveCell.Value)


For i = 1 To Ref
    If LCase(Range("C" & i)) = "bleu" Then
       Compteur = Compteur + 1
    End If
Next
Sheets("sheet2").Range("C5") = Compteur
  For i = 1 To Ref
    If LCase(Range("C" & i)) = "vert" Then
       Compteur2 = Compteur2 + 1
    End If
Next
Sheets("sheet2").Range("I5") = Compteur2


End Sub
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
4 juin 2008 à 11:04
Tu vois le traitement s'effectuer parce que tu utilises des Select. De plus les Select ralentissent l'application à cause des mouvements visibles au niveau graphique.

Une solution: mettre au début de la procédure
Application.ScreenUpdating = False
que tu remets à True en fin de procédure

Une autre méthode (et je la préfère...): tu enlèves les Select

'Remettre les "compteurs" à 0
Sheets("sheet2").Range("C5") = 0
Sheets("sheet2").Range("I5") = 0

nbLignes = Cells(Rows.Count, "C").End(xlUp).row

'Une seule boucle pour les différentes conditions
For i = 2 to nbLignes
    If LCase(Range("C" & i)) = "bleu" Then
       Sheets("sheet2").Range("C5") = Sheets("sheet2").Range("C5") + 1
    Elseif LCase(Range("C" & i)) = "vert" Then
       Sheets("sheet2").Range("I5") = Sheets("sheet2").Range("I5") + 1

    End If
Next

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Rejoignez-nous