Comment journaliser les résultats d'un compteur quotidien
Bonjour,
Débutant sur VBA, je cherche le moyen de créer une macro qui me permettrait d'une part - d'effectuer le comptage quotidien d'appels téléphoniques et de passages de clients - et d'autre part - de renvoyer les résultats journaliers dans un fichier de suivi mensuel. Je pense avoir réussi à réaliser la première partie mais je bute sur la seconde. Quelqu'un aurait-il une solution à me proposer?
Je joints un fichier pour illustrer ma demande.
Merci par avance de votre aide.
Bonjour,
Une première proposition :
Sub CompteJournalier()
Dim d, ap, f%, j%
With ActiveSheet
d = .Range("C6")
ap = Array(.Range("C4"), .Range("G4"))
End With
f = Month(d) + 1
j = Day(d) + 2
Worksheets(f).Range("D" & j).Resize(, 2).Value = ap
End SubA affecter à un bouton sur la feuille Compteur.
En fait, il me semble qu'il faudrait que ce décompte journalier fasse la remise à zéro dans la foulée...
(donc supprimer les boutons actuels).
Il faudrait aussi sécuriser... : empêcher que l'on continue à compter aux compteurs si entre deux appuis la date à changé, et éventuellement que le vidage se fasse par addition sur la journée (cas où l'on viderait en cours de journée).
Mais teste d'abord ceci : qui calcule l'emplacement à partir de la date et affecte globalement les valeurs.
Cordialement.
Merci de cette réponse rapide.
Je vais tester cette proposition et revenir vers toi.
Merci
J'ai testé cette macro et elle fonctionne, c'est super.
Mais je pense effectivement que tes propositions de sécuriser et de faire la remise à zéro par e même bouton sont judicieuses. Cela permettra en outre d'avoir moins de boutons sur la feuille.
Comment dois-je m'y prendre?
Aussi, si tu en as le temps et la volonté pourrais-tu m'expliquer le sens des différentes valeurs et balises du code?
Je ne voudrais pas utiliser une solution qu'on me propose sans en avoir compris le principe.
Merci
Bonjour,
Je ne sais pas très bien, vu mes périgrinations récentes si j'avais fini le réaménagement commencé sur ton fichier, mais il semble tout de même.
J'ai renommé les boutons conservés (les + et -) et la même macro leur est affectée, c'est elle qui détecte qui l'a lancée, et donc ce qu'il y a à faire. Rien de nouveau pour les +, ça ajoute et ça modifie l'heure... Pour les - en revanche j'ai bloqué la possibilité de réduire si le nombre est à 0, et introduit une demande de confirmation de la correction négative avant de l'opérer.
Le bouton d'enregistrement lance l'enregistrement des appels et passages et remet les compteurs à 0. Les enregistrements peuvent être faits n'importe quand, ils se cumulent (par date). J'ai ajouté une visualisation de l'état des enregistrés du jour...
A l'ouverture du classeur, en début de journée, cet état des enregistrés est calculé (il est normalement à 0 si la journée débute, mais ce peut ne pas être le cas si on a fermé et rouvert en cours de journée.
Pour la sécurité, il est vérifié si les compteurs sont à zéro avant fermeture du classeur. S'ils ne le sont pas, un enregistrement est effectué avant fermeture.
Cordialement.
Merci, c'est super! L'application est plus aboutie maintenant.
Merci encore pour ton aide.
Tu crois que tu pourrais m'indiquer entre guillemets le rôle de chaque commande dans vba?
Les boutons d'incrémentation sont nommés : AppPlus et AppMoins, PasPlus et PasMoins. Tous vont lancer la procédure Incrémenter.
L'argument de la procédure : Optional m As Boolean est un simple truc pour que la procédure n'apparaisse pas dans la boîte de dialogue macro (et qu'elle ne puisse être lancée en dehors des boutons par inadvertance...). On ajoute cet argument après avoir réalisé l'affectation aux boutons.
La ligne :
btn = Application.Callerpermet de récupérer dans la variable btn le nom du bouton ayant lancé la procédure. Si le nom commence par "App" on affecte aux variable plages (Range) Nb et der les cellules à servir de la zone Appels, si c'est par "Pas" on leur affecte les cellules de la zone Passages [en utilisant leurs noms puisqu'elles sont nommées].
Les tests sur le nom utilisent l'opérateur Like pour le comparer à une chaîne modèle. Exemple : "App*" (si le nom commence par App et comporte ou non d'autres caractères à la suite, la condition sera vraie) ou bien : "*Plus" (ici si le nom se termine par Plus la condition sera vraie). A noter que l'on est dans le mode de comparaison binaire (par défaut en VBA), donc majuscules et minuscules sont distinguées.
On regarde ensuite si le nom se termine par "Plus" : si c'est le cas, on incrémente le nombre d'appels ou de passages de 1 (on n'a pas à se précoccuper s'il s'agit d'appels ou de passages, on vient de le faire ci-dessus, et on a affecté les plages définies à des variables qu'on utilise maintenant) et on inscrit la date et l'heure.
Si le nom se termine par "Moins", on regarde si le nombre d'appels ou de passages est égal à 0 : dans ce cas on ne désincrémente pas et on le signale à l'utilisateur. Si le nombre est supérieur à 0, on demande à l'utilisateur de confirmer le retrait de 1 et s'il confirme on l'opère.
Voilà pour cette procédure.
Pour la suite, je reviens demain...
Le bouton Enregistrer lance la procédure Enregistrer :
Sub Enregistrer(Optional m As Boolean)
Dim Nb As Range, der As Range, d, f%, j%, k%
' On affecte à des variables plage les plages nommées de la zone Appel
'(pour éviter de répéter la procédure pour chaque zone...)
Set Nb = [NbApp]: Set der = [derApp]
' On initialise un boucle, de 4 à 5 car les appels vont en col. 4 sur les feuilles mensuelles
'et les passages en col. 5
For k = 4 To 5
' On extrait la date de la dernière valeur temps inscrite
d = Int(der.Value)
' Le mois de la date + 1 correspond au rang de la feuille mensuelle dans le classeur
'Le jour de la date +2 correspond au numéro de ligne sur la feuille à servir
f = Month(d) + 1: j = Day(d) + 2
' On cible la cellule d'enregistrement et on y ajoute le nombre non encore inscrit
'(d'appels au premier tour de boucle, de passages au second)
With Worksheets(f).Cells(j, k)
.Value = .Value + Nb
End With
' On efface ces données de la zone (Appels ou Passages selon le tour)
Nb.ClearContents: der.ClearContents
' Si l'on termine à l'issue du premier tour de boucle (Appels)
'on réaffecte les variables plage pour traiter les passages au tour suivant
If k = 4 Then
Set Nb = [NbPas]: Set der = [derPas]
End If
Next k
' On lance la procédure d'affichage du total enregistré de la journée en cours
AfficherTotalJour
End SubCette procédure est également lancée à la fermeture du classeurs dans le cas où il y a des appels et/ou passages non enregistrés sur les feuilles mensuelles. L'enregistrement et la remise à zéro sont donc assurés à la fermeture.
Sub AfficherTotalJour()
Dim d, f%, j%, k%, aps(1) As Integer
' On relève le temps (date et heure) de prélèvement des données enregistrées
' Hui est le nom de la plage qui contient la date du jour (formule)
'on prélève le mois +1 et le jour +2... comme précédemment
d = Now: f = Month([Hui]) + 1: j = Day([Hui]) + 2
' On va affecter les valeurs Appels et Passages enregistrées à cette date à
'un tableau à 2 éléments
With Worksheets(f)
For k = 4 To 5
aps(k - 4) = .Cells(j, k)
Next k
End With
' On affecte les valeurs contenues dans le tableau aux cellules destinées à les afficher...
With Worksheets("Compteur")
For k = 0 To 1
.Cells(12, 2 + k * 4) = d: .Cells(12, 3 + k * 4) = aps(k)
Next k
End With
End SubCette procédure est également lancée à l'ouverture du classeur. S'il s'agit de la première ouverture du jour, les valeurs seront 0 (ce qui réinitialise l'affichage des enregistrements déjà effectués. Par la suite cela affichera le nombre déjà enregistré.
Cordialement.