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.FillDown

Cependant 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 Sub

Ré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 Sub

La 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 Sub

Je 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+

Rechercher des sujets similaires à "compter occurrences macro"