Nombre occurrences sous double condition - Une meilleur idée?

max.lander

XLDnaute Occasionnel
Bonjour à tous,

J'ai dans une colonne une notion de moment (journée, matin, nuit, après-midi, soirée...) et dans l'autre des noms d'opérateurs, je souhaite compter le nombre d’occurrence en fonction de chaque opérateur.

Aujourd'hui, j'utilise le code ci-dessous que je trouve long et lourd (je dois le répéter pour chaque type de données : journée, matin...)


Avez-vous une idée pour simplifier et surtout fiabilisé ?


VB:
Sub Nombre_Journée()

Dim derligne As Integer
Dim Opérateur As String
Dim Compteur_J As Integer

Compteur_J = 0

derligne = Sheets("Base WPL").Range("A" & Rows.Count).End(xlUp).Row
Opérateur = Planner.ComboBox_SelectPersonnel.Value

For i = 2 To derligne
If Sheets("Base WPL").Cells(i, 2).Value = Opérateur And Sheets("Base WPL").Cells(i, 5).Value = "Journée" Then

Compteur_J = Compteur_J + 1

Else

End If


Next

Planner.TextBox_Nb_Journée.Value = Format(Compteur_J, "###0.00")



End Sub
 

Paf

XLDnaute Barbatruc
bonjour max.lander, WTF

en supposant qu'il existe autant de textbox que de "moments" et qu'elles sont nommées du nom de ce moment (par ex:
TextBox_Nb_Journée pour Journée, TextBox_Nb_Matin pour matin ...), un essai à tester et adapter:

VB:
Sub DécompteMoment()
Dim Periode, Tablo, Dico, Clé As String, i As Long, j As Long

Set Dico = CreateObject("Scripting.Dictionary")
Periode = Array("journée", "matin", "nuit", "après-midi", "soirée") ' à adapter
opérateur = Planner.ComboBox_SelectPersonnel.Value
With Sheets("Base WPL")
Tablo = .Range("B2:E" & .Range("A" & Rows.Count).End(xlUp).Row)
End With
For i = LBound(Tablo) To UBound(Tablo)
    If Tablo(i, 1) = opérateur Then
        Clé = opérateur & " " & Tablo(i, 4)
        Dico(Clé) = Dico(Clé) + 1
    End If
Next
For j = LBound(Periode) To LBound(Periode)
    Clé = opérateur & Periode(j)
    If Dico.exists(Clé) Then Me("TextBox_Nb_" & Periode(j)) = Dico(Clé)
Next
End Sub

un classeur sans données confidentielles permettrait de tester ce code

A+

Edit : Les erreurs sont corrigées (a priori) dans le classeur du post #5
 
Dernière édition:

max.lander

XLDnaute Occasionnel
Merci pour vos retours,

WTF je souhaite vraiement rester sur du code enfin de fiabiliser le process.

Paf, merci pour ta proposition, je viens d'ajouter un fichier excel pour tester.
Ton code est très intéressant mais j'ai un peu de mal à m'y retrouver :

tu peux nous commenter cette partie :
VB:
        Clé = opérateur & " " & Tablo(i, 4)
        Dico(Clé) = Dico(Clé) + 1
    End If
Next
For j = LBound(Periode) To LBound(Periode)
    Clé = opérateur & Periode(j)
    If Dico.exists(Clé) Then Me("TextBox_Nb_" & Periode(j)) = Dico(Clé)
Next


Merci par avance
 

Pièces jointes

  • Test nombre sil.xlsm
    16.2 KB · Affichages: 36

Paf

XLDnaute Barbatruc
re,

Avec
Code:
For i = LBound(Tablo) To UBound(Tablo)
    If Tablo(i, 1) = opérateur Then
        Clé = opérateur & " " & Tablo(i, 4) ' concaténation du nom de la personne et du 'moment'
        Dico(Clé) = Dico(Clé) + 1
    End If
Next
on obtient un dictionnaire contenant si on a sélectionner Julie en combobox :
Code:
Clé                         Item (ou Dico(Clé))
Julie après-midi     1
Julie journée        5
Julie matin         1
Julie nuit           4


avec
Code:
For j = LBound(Periode) To LBound(Periode)
    Clé = opérateur & Periode(j)
    If Dico.exists(Clé) Then Me("TextBox_Nb_" & Periode(j)) = Dico(Clé)
Next

dans le principe dans la boucle des différents 'moments', on recrée une clé composée du nom de la personne et du nom du moment

si cette clé existe dans le dictionnaire qu'on a crée précédemment, on affiche alors la valeurs de l'item du dico correspondant à la clé, dans la textbox se nommant TextBox_Nb_suivi du nom du moment de la boucle.

Concrètement au premier 'tour' de boucle,
Clé = opérateur & Periode(0) => Clé = "Julie journée"
If Dico.exists(Clé) => Si la clé existe dans le dico, en regardant le petit tableau précédant, on voit que oui
Me("TextBox_Nb_" & Periode(j)) = Dico(Clé) => TextBox_Nb_journée=5

après tests et corrections, ça fonctionne pour tous les moments, y compris pour après-midi oùdans la feuille WPL on écrit après-midi et dans l'USF on a la Textbox TextBox_NB_APM.

A+
 

Pièces jointes

  • MaxLander.xls
    53.5 KB · Affichages: 34

eriiic

XLDnaute Barbatruc
Bonjour,

et pourquoi pas un TCD plus simple et plus rapide ?
Au pire la macro se résume à son actualisation à l'activation de la feuille.
eric

edit : ajout fichier exemple
edit2 : ah, je viens de voir que tu voulais dans un userform
 

Pièces jointes

  • Test nombre sil.xlsm
    23.1 KB · Affichages: 36
Dernière édition:

Paf

XLDnaute Barbatruc
Re,

pour les dictionnaires, il faut pratiquer un peu pour bien comprendre le mécanisme.
un site, entre autres : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm

pour faire court, un dico est une sorte de tableau à deux colonnes,qui ne contient que des clés uniques auxquelles on peut affecter des valeurs

Dico(Clé) = "" signifie qu'on insère une clé (si elle n'existe pas) et qu'on lui affecte la valeur"" (donc vide) comme item (ou valeur liée). Dico(Clé) représente donc l'item ( la valeur liée à la clé).

si on écris dico("pomme")=0 on aura dans le dico
Clé Item
pomme 0

quand on écrit dico("pomme") = dico("pomme") + 1, on n'ajoute pas 1 à pomme mais à l'item de pomme qui, comme on l'a vu juste avant, vaut 0 ; on pourrait lire cette instruction comme :
valeur de l'item lié à pomme =valeur de l'item lié à pomme + 1

A+
 

Discussions similaires