Compter Occurrences MACRO
Bonjour, j'aimerai créer une macro pour compter les occurrences d'articles situés dans la colonne B et de les afficher dans la colonne A
Avec l'enregistreur de macro j'obtiens le code suivant :
Sheets("Données").Range("A2").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(R2C2:R29926C2,RC[1])"
Range("A2").Select
Selection.FillDownCependant le nombre de ligne du tableau (ici 29 926) est variable; Comment faire pour que cette formule prenne en compte toute la colonne jusqu'à la dernière ligne non vide
Bien cordialement,
Nicolas
Bonjour
Essaie ça :
Sub ess()
Dim derln&
With Sheets("Données")
derln = .Range("B" & Rows.Count).End(xlUp).Row
.Range("A2").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(R2C2:R" & derln & "C2,RC[1])"
.Range("A2:A" & derln).FillDown
End With
End SubRésultat ?
Bye !
Bonjour,
Il faut créer, hors VBA, un champ nommé (Formules/Gestionnaire de noms) et créer un champ variable en utilisant la formule décaler, nommé MaPlage dans l'exemple
=DECALER(Feuil1!$B$2;;;NBVAL(Feuil1!$B:$B)-1)
Ensuite mettre le nom du champ nommé dans la formule "=COUNTIF(MaPlage,RC[1])"
Il y a -1 pour ne pas prendre en compte l'entête (ligne 1).
L'autre solution est de prendre toute la colonne plutôt qu'une plage de cellules : $B:$B
Benead
Bonjour, merci à vous deux
J'ai opté pour une solution proche de celle de gmb :
Sub RemplirOccurrences3()
If NumeroColonne("Occurrences Article", "Données_F", xlWhole) = 0 Then
Sheets("Données_F").Columns(1).Insert
Sheets("Données_F").Cells(1, 1) = "Occurrences Article"
End If
Sheets("Données_F").Activate
Range("A2").FormulaR1C1 = "=COUNTIF(R2C3:R29926C3,RC[2])"
Range("A2").AutoFill Destination:=Range("A2:A" & Range("C" & Rows.Count).End(xlUp).Row)
End SubLa différence entre la solution de gmb et la mienne, est que celle de gmb n'est pas dynamique, si tu ajoutes des lignes sans modifier les formules existantes, elles ne prendront pas en compte ces nouvelles lignes dans le calcul, c'est peut-être ce que tu souhaites, il faut juste que tu le saches.
Benead
Bonjour Benead,
En effet votre remarque est pertinente. J'essaye donc d'implémenter votre code mais les cases se remplissent avec des #NOM?
Sub RemplirOccurrences3()
If NumeroColonne("Occurrences Article", "Données_F", xlWhole) = 0 Then
Sheets("Données_F").Columns(1).Insert
Sheets("Données_F").Cells(1, 1) = "Occurrences Article"
End If
Sheets("Données_F").Activate
MaPlage = "=DECALER(Feuil1!$B$2;;;NBVAL(Feuil1!$B:$B)-1)"
Range("A2").FormulaR1C1 = "=COUNTIF(MaPlage,RC[2])"
Range("A2").AutoFill Destination:=Range("A2:A" & Range("C" & Rows.Count).End(xlUp).Row)
End SubJe pense que j'ai mal défini MaPlage mais je ne sas pas comment faire avec une formule Excel..
Cordialement
Bonjour,
Comme je l'ai dit dans mon message précédent, il faut définir MaPlage manuellement dans Excel (Ruban Formules/Gestionnaire de noms).
Dans VBA tu fais simplement référence à ta plage.
Benead
Rebonjour Benead,
Mon soucis c'est que la plage peut varier, notamment le nombre de lignes de cette plage. Je cherche donc à la définit automatiquement pour qu'elle couvre toutes mes données dans tous les cas.
J'ai cru que votre formule : =DECALER(Feuil1!$B$2;;;NBVAL(Feuil1!$B:$B)-1) la définissait
Bien cordialement
Bonjour Nicolebendo,
Je te joins un fichier avec un exemple VBA et un exemple formule reprenant le champ dynamique MaPlage, Ce champ nommé ne peut être visible que par le ruban
Si tu ajoutes une année ou en enlève une, MaPlage en tiendra compte car on compte le nb de cellules non vides.
Formule/NomDéfinis/Gestionnaire de noms.
Benead
Re !
Merci beaucoup je vois mieux où vous vouliez en venir :)
Mais j'ai maintenant un autre soucis.. La plage à définir se trouve dans une feuille qui apparait et est remplie au cours de la macro
Je ne peux donc pas la définir manuellement puisque la feuille n'existe même pas encore à ce moment
Y'aurait-il donc un moyen d'automatiser la création d'une plage ? En appelant le gestionnaire de noms dans la macro par exemple ?
Coridalement
Ou alors un code du genre
Range("A2").FormulaR1C1 = "=COUNTIF(R2C3:R29926C3,RC[2])"
remplacé par :
Range("A2").FormulaR1C1 = "=COUNTIF(R2C3:R & Cells(Rows.Count, 1).End(xlUp).Row &C3,RC[2])"Comme le proposait gmb, je ne vois pas pourquoi ce ne serait pas dynamique puisqu'il parcourt la colonne jusqu'à la denière cellule non vide
Mais je ne suis pas certain pour la synthaxe
bonjour,
gmb t'a donné la bonne syntaxe.
Range("A2").FormulaR1C1 = "=COUNTIF(R2C3:R" & Cells(Rows.Count, 1).End(xlUp).Row & "C3,RC[2])"Et oui merci h2so4 ca fonctionne très bien !
J'avais la solution sous les yeux depuis le début de cette conversation :)
A+