VBA : compter nombre occurrences +

max.lander

XLDnaute Occasionnel
Bonjour à tous,

Je souhaite remplir une dizaine de Textbox en VBA avec les données d'une feuille.
Tantôt en comptant le nombre d’occurrences tantôt en effectuant une somme.

Ceci en fonction de l'opérateur sélectionné dans le combox

Le résultat est affiché en heure


Pour celà je repete les potions de code ci-dessous, 'j'aimerai simplifier tout ça et éviter la multiplication du code bêtement.

S'il y a des idées de simplification je suis preneur.

Vous trouverez en PJ un fichier exemple.





Somme des heures :

VB:
Sub Heures_Travaillés()
Planner.TextBox_H_réalisées.Value = "00:00"
Dim derligne As Integer
Dim Opérateur As String

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

Sommes_Heures = Application.WorksheetFunction _
.SumIf(Sheets("Base WPL").Range("B1:B" & derligne), Opérateur, Sheets("Base WPL").Range("G1:G" & derligne))


y = Int(Sommes_Heures) * 24

z = Format(Sommes_Heures - Int(Sommes_Heures), "hh:mm")

total_heures = y + Split(z, ":")(0) & ":" & Split(z, ":")(1)


Planner.TextBox_H_réalisées.Value = total_heures
Planner.TextBox_H_réalisées.Locked = True

End Sub


Nombre occurrences "journée"

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")
Planner.TextBox_Nb_Journée.Locked = True



End Sub
 

Pièces jointes

  • XLD-COMPTAGE-SOMME .xlsm
    56.3 KB · Affichages: 65

Staple1600

XLDnaute Barbatruc
Bonsoir à tous


Suggestion en passant
Si j'étais moi, j’essaierai de me persuader de plutôt écrire la ligne ci-dessous
Dim derligne As Integer
assurément comme cela ;)
Dim derligne As Long

Pour savoir pourquoi, demander au Loup-Solitaire ;)
(ou sinon chercher les explications sur le net)
 

Hieu

XLDnaute Impliqué
salut,

Une première idée; Pour le code Heures_25_Percent et Heures_50_Percent, je les regrouperai en 1 seule, avec une variable, en input, du style :
VB:
Sub Heures_Percent(val)
Set wf = WorksheetFunction
Dim derligne As Integer
Dim Opérateur As String

derligne = Sheets("Base WPL").Range("A" & Rows.Count).End(xlUp).Row

Opérateur = Planner.ComboBox_SelectPersonnel.Value

'somme.si
Select Case val
    Case 25: Sommes_Heures = wf.SumIf(Sheets("Base WPL").Range("B1:B" & derligne), Opérateur, Sheets("Base WPL").Range("J1:J" & derligne))
    Case 50: Sommes_Heures = wf.SumIf(Sheets("Base WPL").Range("B1:B" & derligne), Opérateur, Sheets("Base WPL").Range("K1:K" & derligne))
End Select

y = Int(Sommes_Heures) * 24

z = Format(Sommes_Heures - Int(Sommes_Heures), "hh:mm")


total_heures = y + Split(z, ":")(0) & ":" & Split(z, ":")(1)


Select Case val
    Case 25
        Planner.TextBox_H_25_Percent.Value = total_heures
        Planner.TextBox_H_25_Percent.Locked = True
    Case 50
        Planner.TextBox_H_50_Percent.Value = total_heures
        Planner.TextBox_H_50_Percent.Locked = True
End Select

End Sub

Et du coup, le code principal deviendrait :
VB:
Private Sub ComboBox_SelectPersonnel_Change()

Call Heures_Travaillés
Call Heures_Percent (25)
Call Heures_Percent (50)
Call Nombre_Journée
Call Nombre_AprèsMidi
Call Nombre_Soirée
Call Nombre_Matin
Call Heures__Sup_46ème

End Sub


Edit : Salut Staple ^^
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour à tous, max.lander, Hieu

Non, c'est pas cela que mon message évoquait
Donc pour être clair et précis
Integer: Entier de -32 768 à 32 767
Long
: Entier de -2 147 483 648 à 2 147 483 647

Maintenant fais ce ce test
VB:
Sub a()
MsgBox Format(Rows.Count, "#,##0")
End Sub

Maintenant tu comprends pourquoi il vaut mieux utiliser : Dim derligne As Long

NB: Quant à simplifier les choses, si j'étais moi, je commencerai par virer l'userform et le VBA, et j'utiliserai simplement un TCD, formules et autres filtres élaborés
Mais cela, c'est si j'étais moi et ceci est une autre histoire ;)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 158
Messages
2 085 831
Membres
102 996
dernier inscrit
Zabouille73