Calculer le nombre d'identifiants dans une plage horaire

Résolu/Fermé
Fabienne1213 Messages postés 2 Date d'inscription lundi 23 décembre 2013 Statut Membre Dernière intervention 24 décembre 2013 - 23 déc. 2013 à 14:11
Fabienne1213 Messages postés 2 Date d'inscription lundi 23 décembre 2013 Statut Membre Dernière intervention 24 décembre 2013 - 24 déc. 2013 à 14:00
Bonjour,

Je suis une débutante en VBA et je souhaite avoir une correction sur ma macro.
J'ai une base de données et j'essaie de definir le nombre d'identifiants dans une plage horaire.
Ma BDD se compose de :
- En colonne A : les numéro d'identifiants
- En colonne K : les heures (ex : 16:08:09)

Je souhaite obtenir le nombre d'identifiants sur 4 différentes plages horraires :
- de 9h à midi
- de midi à 16h
- de 16h à 18h
- > à 18h

Voici ma macro :
Sub plage_horaires()
Dim I As Integer
'h1 correspond à la colonne K à étudier
Dim h1 As Integer
' H correspond à la plage 9h à 12h, H_1 de 12h à 16h, H_2 de 16h à 18h et H_3 > à 18h.
Dim H As Integer
Dim H_1 As Integer
Dim H_2 As Integer
Dim H_3 As Integer
Dim Hour1 As Variant
Dim totalh As Variant
'On observe les heures de la colonne K
h1 = 11
'WorksheetFunction.CountA(Columns(1)) compte le nombre de cellules non vides de la colonne 1 (nombre d'identifiants)
For I = 2 To WorksheetFunction.CountA(Columns(1))
Hour1 = Cells(I, h1).Value
totalh = WorksheetFunction.CountA(Columns(1)) - 1
If Hour1 <= 12 Then
H = H + 1
End If
If Hour1 <= 16 Then
H_1 = H_1 + 1
End If
If Hour1 <= 18 Then
H_2 = H_2 + 1
End If
If Hour1 > 18 Then
H_3 = H_3 + 1
End If
Next I
MsgBox ("Booking hours : 9am to 12am = " & H & ", 12am to 4pm = " & H_1 & ", 4pm to 6pm = " & H_2 & ", > 6pm = " & H_3 & ", Total = " & totalh)
End Sub

Mon bug : le résultat que j'obtiens représente le nombre total de ligne...

Pouvez-vous m'éclairer, svp ?

Merci d'avance

2 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
24 déc. 2013 à 08:57
Bonjour,

Si tes heures sont bien au format 11:12:13 , cad du type date:

Une date + heure par ex 24/12/13 11:12:13 est inscrite dans la mémoire sous la forme d'un nombre réel: la partie entière désigne le jour depuis 1900 et la partie décimale les heures
par ex:
24/12/2013 08:40:30
est noté en mémoire:
41632,36146

Donc midi=0,5 soit 12/24 (+ facile à lire !)
9h =0,375 soit 9/24

donc tout ce qui concerne les heures doit être déclaré en tant que double
dim H1 as double

-----
For I = 2 To WorksheetFunction.CountA(Columns(1))

si tu as des vides ton résultat sera faux ! puisque ta boucle s'incrémente d'une ligne à la fois!

il te faut chercher la dernière ligne occupée dans la colonne par une instructiion du genre
derlig=Columns("A").find("*",,,,,xlprevious).row
For I=2 to derlig

et tenir compte d'un cellule vide (sinon comptage+1 avec le test inférieur à midi)
If cells(I,"K")<>"" then....

Il y a d'autres trucs à améliorer mais si tu débutes, ton code est déjà pas mal ;o)

plus tard , à l'occasion regarde les instructions "select case"
1
Fabienne1213 Messages postés 2 Date d'inscription lundi 23 décembre 2013 Statut Membre Dernière intervention 24 décembre 2013
24 déc. 2013 à 14:00
Merci beaucoup !!! Avec quelques modifications ça marche parfaitement !
0
Bonjour,
select count(id) from nomtable where nomtable.heur between heur1 and heur2;

tu peut toujours faire plusieurs requêtes ça se complique un peu si tu veux tous faire en 1;

Ce serait

select count(id) A.heur, B.heur, C.heur from nomtable A, nomtable B, nomtabe C where A.heur between heur1 and heur2 and B.heur between heur3 and heur4 and C.heur between heur5 and heur6 group by A.heur, B.heur, C.heur;
-3