je182th
Messages postés13Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention20 février 2009
-
20 mai 2008 à 12:19
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 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 :
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...
je182th
Messages postés13Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention20 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jimy neutron
Messages postés491Date d'inscriptionmercredi 1 février 2006StatutMembreDernière intervention18 novembre 20161 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 neutron
Messages postés491Date d'inscriptionmercredi 1 février 2006StatutMembreDernière intervention18 novembre 20161 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é.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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
je182th
Messages postés13Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention20 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!
je182th
Messages postés13Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention20 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?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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
je182th
Messages postés13Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention20 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?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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
je182th
Messages postés13Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention20 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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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