Compter nombre de lignes selon un critère

Résolu
Akalia Messages postés 34 Statut Membre -  
Akalia Messages postés 34 Statut Membre -
Bonjour,

Je suis déjà venu pour demander de l'aide pour compter des lignes, mais là c'est différent, j'essaye de compter en fonction du critère dans la colonne. Je m'explique: j'ai une grosse base de données avec plus de 10 000 lignes allant jusqu'au colonnes CX. Mon but est de réaliser des indicateurs, pour cela, en général, une certaine colonne va être le jalon me permettant de définir mon indicateur, (exemple: le statut en "terminé", "lancé", "non lancé"), cependant, je fais déjà un premier tri en VBA, je copie colle les colonnes que je désire voir (environ 10) dans une nouvelle feuille qui sera une nouvelle BDD. Et c'est sur cette BDD que je veux effectuer mes traitements, toujours sur l'exemple des statuts, je veux être capable de compter le nombre de lignes qu'il y a avec le statut "lancé", celles avec le statut "non lancé" et le statut "terminé", et que ça me renvoit la valeur dans une cellule. Là où je bloque sur le code, c'est pour qu'il me calcule le nombre de lignes, je vous donne ce que j'ai pu effectuer.

Dim lg as Integer
Dim dernligne as Integer
Dim n as Integer
Dim NbLig As Integer

       'variable de ligne pour synthèse
       lg = 1
        'recherche dernière ligne remplie dans Base
       dernligne = Sheets("Nouvelle BDD").Range("A" & Rows.Count).End(xlUp).Row
        ' boucle sur les lignes d'Application
       For n = 1 To dernligne
        'si statut correpond à celui déterminé au clic dans bouton option
       If Sheets("Nouvelle BDD").Range("D" & n).Value = "Lancé" Then
            'incrementation de la ligne dans synthèse
        lg = lg + 1
       NbLig = Sheets("Nouvelle BDD").Range("D1", [D1].End(xlDown)).Rows.Count
    
    'Copie dans l'indicateur
    Sheets("Indicateur OF").Select
    Range("D6").Select
    Selection.Value = NbLig4 - 1  'Car je ne désire pas la première valeur puisque c'est l'entête
    Selection.Copy
    'Mise à jour dans bilan
    Sheets("Bilan des indicateurs").Select
    Range("D24").Select
    ActiveSheet.Paste


           End If

       Next n


J'ai beau avoir cherché, j'ai essayé de tordre, modifier mon code avec des solutions existantes, ça ne collait pas du tout avec ce que je désirais. Déjà ce code, ne veut même pas prendre en compte ma condition et me comptait le nombre de lignes avec le statut "Lancé", en revanche il me compte toutes les lignes confondues.

Donc je sais que ça pêche à ce niveau, mais je vois pas comment faire, si déjà je m'y suis bien pris, et si oui comment faire pour arriver à la solution que je recherche.

En vous remerciant d'avance pour prendre le temps de lire mon pavé!

Cordialement,

2 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    comme tu sembles travaillé que sur la colonne "D" nommée statut, tu aurais attaqué directement sur la BDD originale a moins que tu ais besoin de la nouvelle pour autre chose

    Proposition non testée (je n'ai pas ton classeur)
    Option Explicit
    '----------
    Sub compter_statuts()
    Dim derligne As Integer, T_statut
    Dim cptr As Byte, Statut As String
    Dim Idx As Integer, Nbre As Integer

    Application.ScreenUpdating = False
    Dernligne = Sheets("Nouvelle BDD").Range("A" & Rows.Count).End(xlUp).Row
    T_statut = Application.Transpose(Range("D2:D" & derlig))
    For cptr = 1 To 3
    Statut = Choose(cptr, "terminé", "Lancé", "non lancé")
    For Idx = 1 To UBound(T_statut)
    If T_statut(Idx) = Statut Then nbre = nbre + 1
    Next
    With Sheets("Indicateur OF")
    .Cells(5+cptr,"C")=statut
    .Cells(5 + cptr, "D") = nbre
    nbre = 0
    End With
    Next
    End Sub


    Si problèm dans mon bidouillage

    mettre le classeur sans données confidentielles en pièce jointe sur
    https://www.cjoint.com/
    puis copier l'adresse du lien et la coller dans le message de réponse


    Michel
    0
  2. Akalia Messages postés 34 Statut Membre
     
    Bonjour Michel!

    Merci d'avoir réagit une fois de plus pour mon cas, mais du coup, j'ai préféré envoyé mon fichier très très simplifié, car il est plus facile de se concentrer sur ce que je désire faire sur le comptage du nombre de lignes, donc tout est expliqué en commentaire texte. Et j'effectue le comptage avec un bouton commande en première feuille "Choix des indicateurs".

    Ci-joint

    https://www.cjoint.com/?DGwjsgDWfc0

    Merci d'avance.
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,

      Suis absent cet après-midi : je regarderai peut-être en fin d'après-midi ou demain...

      edit 11:10h
      viote fait sans VBA
      en D10
      =NB.SI('BDD OF'!$D:$D;"terminé")

      ?
      0
    2. Akalia Messages postés 34 Statut Membre
       
      Ca ne marche pas pour le statut "Lancé", et je vois pas pourquoi ça ne marcherait pas :/
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      dans la feuille BDD_OF "lancé a un espace parasite à la fin soit 6 caractères au lieu de 5

      en D6
      =NB.SI('BDD OF'!$D:$D;B5)
      à copier coller en D10,D14,D18
      0
    4. Akalia Messages postés 34 Statut Membre
       
      En effet, ça marche mieux sans l'espace parasite. Je pense prendre cette solution vu que je travaille en délai très court, mais je vais quand même essayer de trouver comment obtenir la valeur via VBA et non par une formule, car admettons que la bdd change, la formule peut peut être poser problème, et puis j'aime essayer de coder donc je vais chercher!

      Merci encore Michel!
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      tant que la recherche se fait sur la colonne D, la formule reste valable
      quant au code tu as juste à modifier la fin du mien....

      style
      .Cells(6 + (cptr-1)*4), "D") = nbre
      0