OVH Cloud OVH Cloud

Dates : 1/2 journée, affichage et calcul

46 réponses
Avatar
J
Bonjour à tous et bienvenue dans cette nouvelle année

J'ai un problème de calcul de congés:

en A: date du jour de début de l'arrêt, actuellement 01/01/04
en B: date du jour de fin de l'arrêt
ensuite j'ai un calcul C=B-A

Mais l'arrêt peut être seulement de la matinée, ou de l'après-midi, ou 3
jours 1/2...
Avec le format jj/mm/aa h: AM/PM , la saisie est très lourde (détail de
l'heure), et l'affichage encombrant.
Or la 1/2 journée n'est pas divisible, donc pas besoin de l'heure.

Pourrait-on saisir seulement 01/01 A (et encore seulement lorsque des
1/2 journées sont concernées) et obtenir 01/01/04 AM tout en permettant
le calcul sur cette donnée????

Je veux éviter que les gentilles secrétaires abîment leurs beaux ongles
vernis en tapant des tonnes de trucs impossibles à exploiter ensuite.

Merci pour votre solidarité
J@@

10 réponses

1 2 3 4 5
Avatar
sabatier
:-)))))
si tu as reçu le calendrier 2004 du mpfe, J@@, tu auras dû remarquer qu'il
n'y a pas que le classeur qui est boursoufflé...
jps

"J@@" wrote:

Bonsoir JPS, pas encore couché??
tu te souvient de l'épopée De Caunes à Eiao??
je n'y suis jamais allé, les chèvres ont de bonnes dents :-))
Cette proc est plus belle de jour en jour, mon classeur, depuis le
temps, est boursoufflé de mefc, boutons, proc diverses et quand on
l'ouvre on a l'impression d'une Chevrolet Corvette qui prépare un 400
départ arrété: ça glougloutte de partout et ça sent la nitro :-)
j'ai donné des gants et des chaussures de pilote à la secrétaire, qui
doit boucler sa ceinture (on est jamais trop prudent) et mettre un
casque.
Ca arrache
:-)))
J@@

"sabatier" <...
'tain, qu'est ce qu'on est choyé quand on est à dache...tu devrais
pousser jusqu'à

Eiao, J@@, là tu es sûr que le trop rare ttigre serait archi battu
quant à la

construction de cette proc qui n'en finit pas de finir...
jps

Michel Gaboly wrote:

Bonjour J@@,

J'étais absent depuis vendredi soir ; c'est pour cela que je n'ai
pas réagi depuis.


A nouveau à ta disposition pour finaliser la procédure si nécessaire
;-))



La procédure suivante considère le premier nombre comme le Jour,
le 2e comme le



Mois, le 3e comme l'Année.
L'omission d'un des 3 nombres retourne l'entrée courante (jour
courant, mois



courant, année courante).
Donc 3 nombres ==> le jour + le mois + l'année
Donc 2 nombres ==> le jour + le mois, puis année courante
Donc 1 nombre ==> le jour, puis mois et année courante

Si tu mets un A: c'est une entrée AM. Si tu mets un P, c'est une
entrée PM.




Exemples:
A ==> 4 jan 2004 0:00 AM
P ==> 4 jan 2004 12:00 PM

6 A ==> 6 jan 2004 0:00 AM
7P ==> 7 jan 2004 12:00 PM
7 2P ==> 7 fév 2004 12:00 PM
... etc

Le code suivante utilise Split() disponible depuis Excel 2000. Si
tu as un Excel



plus vieux, remplace par Split97() que tu vas récupérer sur le
site de Frédéric



Sigonneau.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target
As Range)



Dim C As Range, s As String, V As Variant
Dim Valide As Boolean, AM As Boolean, i As Integer
Dim lAn As Integer, leMois As Integer, leJour As Integer

For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then

If Len(Application.Substitute(C.Text, " ", "")) < 6 Then
' une entrée abbréviée, qu'on doit convertir
s = Application.Substitute(UCase(C.Text), "A", " A")
s = Application.Substitute(s, "B", " B")
V = Split(s, " ")
Valide = True
For i = LBound(V) To UBound(V)
If IsNumeric(V(i)) Then ' Un chiffre
If leJour = 0 Then
leJour = V(i)
ElseIf leMois = 0 Then
leMois = V(i)
ElseIf lAn = 0 Then
lAn = V(i)
Else
Valide = False
End If
Else ' indicateur AM ou PM
If V(i) = "A" Then
AM = True
ElseIf V(i) = "P" Then
AM = False
ElseIf V(i) <> "" Then 'autre chose==> erreur!
Valide = False
End If
End If
Next i

' mets les entrées par défaut (i.e. le jour courant)
' pour celles qui ne sont pas saisies
If leJour = 0 Then leJour = Day(Date)
If leMois = 0 Then leMois = Month(Date)
If lAn = 0 Then lAn = Year(Date)

'Si pas valide, on ne touche à rien
If Valide Then
Application.EnableEvents = False
C = DateSerial(lAn, leMois, leJour) + IIf(AM, 0,
0.5)



Application.EnableEvents = True
' on devrait mettre le bon format ici
'C.NumberFormat = "le format qu'on veut"
End If
End If
End If
Next C
End Sub
Daniel M.

"J@@" <> > > > **situation:
jours 1 à 31 => saisir 2 chiffres
mois 1 à 12 => saisir 2 chiffres
pour les jours entiers, il n'est pas nécessaire de préciser A,
le pb se pose si le matin seulement est concerné, donc la saisie
de la




date de reprise contient P.

saisie:
20 01 (option 04) (option p ou P)
possibilité d'ajouter l'année quand risque d'ambiguïté 04 05 ...
ou P ou p pour être insensible à la casse)
omettre le slash / gagne du temps mais cela ne risque t il pas
de




perturber les utilisateurs??

résultat:
20/01/04 0:00
20/01/04 12:00
ce qui est l'heure du début de l'action (arrêt ou reprise),
c'est bien




visuel, et cela se calcule.
J@@

"Daniel.M" <...
"J@@" <> Alors, j'attends que tu identifies ici les manières
abrégées





d'inscription des
entrées et les résultats finaux (i.e. des dates qui pourront
ensuite





être
traités par une macro qui fait des compilation).
Cette liste comprend :
Types d'inscription DÉSIRÉES (pas celles qu'elles faisaient
auparavant, celles

qu'elles doivent faire selon TOI) et les transformations
attendues





(comment les
nouvelles entrées sont interprétées pour donner des dates)

Les exemples que tu donnes sont DÉJÀ des dates. Si tu veux
simplifier





la saisie,
tu t'attends à ce qu'on soit bref dans la saisie.
1 1 A ==> 1 jan 2004 0:00 AM ' par exemple
4 5 P ==> 4 mai 2004 12:00 PM ' par exemple

C'est juste des exemples, j'attends les tiens.
Daniel M.

--



Cordialement,

Michel Gaboly
http://www.gaboly.com










Avatar
sabatier
oui, oui, je me souviens : nous étions jeunes et beaux et avions à l'époque,
nous aussi, comme tes chèvres, de bonnes dents...
jps

"J@@" wrote:

Bonsoir JPS, pas encore couché??
tu te souvient de l'épopée De Caunes à Eiao??
je n'y suis jamais allé, les chèvres ont de bonnes dents :-))


Avatar
Daniel.M
J@@,

La procédure suivante ne règle pas le problème fondamental (auquel je
réfléchi)

mais corrige les petits bobos.



Aurais-tu objection à avoir utiliser une colonne supplémentaire?
La première col K conserve les saisies et la deuxième (M) est celle où apparaît
la bonne traduction. Même chose entre colonnes L et N.

J'attends ta réponse.

Salutations,

Daniel M.

Avatar
sabatier
m'est avis qu'on va passer le prochain réveillon avec cette ficelle...on
a encore de la chance que le tahitien soit décalé de quelques heures, un
peu moins, d'ailleurs, pour daniel M que pour nous ici...
enfin, je garde l'espoir que ttigre va intenter un procès à J@@ pour
plagiat abusif...
jps

Daniel.M a écrit:
J@@,


La procédure suivante ne règle pas le problème fondamental (auquel je


réfléchi)

mais corrige les petits bobos.




Aurais-tu objection à avoir utiliser une colonne supplémentaire?
La première col K conserve les saisies et la deuxième (M) est celle où apparaît
la bonne traduction. Même chose entre colonnes L et N.

J'attends ta réponse.

Salutations,

Daniel M.





Avatar
J
Bonjour Daniel
ça a bien avancé.
imposer l'espace est logique, ainsi qu'une saisie minimale? jour et mois
et A ou P??
à force de taper j'ai même obtenu 00/01/1900 13:00...
amicalement
@+
J@@



"Daniel.M" <> _________________________
La question est donc: comment on fait pour voir une différence entre
les deux

saisies suivantes:
1
1900/01/01
Surtout lorsque la cellule est déjà formattée en date.
Présentement, je ne le sais pas. Sinon passer par un UserForm à chaque
fois. :-(

Ouh la la, cela serait bien lourd
_________________________
*= l'espace entre les chiffres est impératif sous peine d'erreur.
Oui, il faut imposer l'espace.

OK

_________________________
Décidément ce n'est pas simple
En effet, le problème fondamental demeure.

Comment savoir ce qui est VRAIMENT saisi AVANT qu'Excel ne le
transforme.

La procédure suivante ne règle pas le problème fondamental (auquel je
réfléchi)

mais corrige les petits bobos.


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)

Dim C As Range, s As String, V As Variant
Dim Valide As Boolean, AM As Boolean, i As Integer
Dim lAn As Integer, leMois As Integer, leJour As Integer

For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
' Debug.Print C.Text, C.Value
i = Len(Application.Substitute(C.Text, " ", ""))
If i < 6 And i > 0 Then ' une entrée abbréviée, qu'on doit
convertir

s = Application.Substitute(UCase(C.Text), "A", " A")
s = Application.Substitute(s, "P", " P")
V = Split(s, " ")
Valide = True
AM = True
For i = LBound(V) To UBound(V)
If IsNumeric(V(i)) Then ' Un chiffre
If leJour = 0 Then
leJour = V(i)
ElseIf leMois = 0 Then
leMois = V(i)
ElseIf lAn = 0 Then
lAn = V(i)
Else
Valide = False
End If
Else ' indicateur AM ou PM
If V(i) = "A" Then
AM = True
ElseIf V(i) = "P" Then
AM = False
ElseIf V(i) <> "" Then 'autre chose==> erreur!
Valide = False
End If
End If
Next i

' mets les entrées par défaut (i.e. le jour courant)
If leJour = 0 Then leJour = Day(Date)
If leMois = 0 Then leMois = Month(Date)
If lAn = 0 Then lAn = Year(Date)

'Si pas valide, on ne touche à rien
If Valide Then
Application.EnableEvents = False
C = DateSerial(lAn, leMois, leJour) + IIf(AM, 0, 0.5)
Application.EnableEvents = True
' on devrait mettre le bon format ici
C.NumberFormat = "dd/mm/yyyy h:mm"
End If
End If
End If
Next C
End Sub

Salutations,

Daniel M.





Avatar
J
Bonjour Daniel
La forme de mon formulaire m'est imposée.
Je pourrai toutefois garder les colonnes masquées, mais sans pouvoir
contrôler aisément la saisie.
Pas moyen d'éviter??
@+
J@@


"Daniel.M" <>
La procédure suivante ne règle pas le problème fondamental (auquel
je


réfléchi)
mais corrige les petits bobos.


Aurais-tu objection à avoir utiliser une colonne supplémentaire?
La première col K conserve les saisies et la deuxième (M) est celle où
apparaît

la bonne traduction. Même chose entre colonnes L et N.

J'attends ta réponse.

Salutations,

Daniel M.





Avatar
Daniel.M
Salut J@@,

La forme de mon formulaire m'est imposée.


Ton formulaire? Parles-tu d'un UserForm ou de la disposition de ta feuille?


Je pourrai toutefois garder les colonnes masquées, mais sans pouvoir
contrôler aisément la saisie.


J'ai pas compris.

Pas moyen d'éviter??


Lors d'une saisie dans une cellule, je ne crois pas que l'on puisse obtenir
exactement ce que l'usager inscrit. On est 'condamné' à utiliser
l'interprétation première que Excel fait de cette saisie.

C'est pourquoi un UserForm te simplifierait la vie.
Ou l'utilisation de 2 colonnes supplémentaires dans lesquelles les
transformations appropriées seraient générées automatiquement (par le code dans
l'événement).
Il suffirait de mettre les colonnes de saisie sous format Texte (pour éviter
l'interprétation première d'Excel).

AMA, cette dernière solution me paraît convenable. L'usager saisie la forme
abrégée en K:L et la 'bonne' date est générée automatiquement en M:N (ou
ailleurs sur la feuille).

Laisse-moi savoir si ça te convient.

Salutations,

Daniel M.

Avatar
J
Bonjour Daniel
"Daniel.M" <

La forme de mon formulaire m'est imposée.
Ton formulaire? Parles-tu d'un UserForm ou de la disposition de ta

feuille?

la disposition de la feuille (excuxe l'imprécision)


Je pourrai toutefois garder les colonnes masquées, mais sans pouvoir
contrôler aisément la saisie.
J'ai pas compris.

Les agents qui réalisent ce travail sont facilement déroutés par une

présentation qui parait complexe.
Ainsi je pensais ne garder visible que les colonnes de saisie, mais de
ce fait on ne verra pas si une saisie est erronnée (01/01/1900)

Pas moyen d'éviter??


Lors d'une saisie dans une cellule, je ne crois pas que l'on puisse
obtenir

exactement ce que l'usager inscrit. On est 'condamné' à utiliser
l'interprétation première que Excel fait de cette saisie.

C'est pourquoi un UserForm te simplifierait la vie.
Ou l'utilisation de 2 colonnes supplémentaires dans lesquelles les
transformations appropriées seraient générées automatiquement (par le
code dans

l'événement).
Il suffirait de mettre les colonnes de saisie sous format Texte (pour
éviter

l'interprétation première d'Excel).

AMA, cette dernière solution me paraît convenable. L'usager saisie la
forme

abrégée en K:L et la 'bonne' date est générée automatiquement en M:N
(ou

ailleurs sur la feuille).
Laisse-moi savoir si ça te convient.
Ma foi, oui; le but est d'arriver à avoir des résultats fiables et

calculables.

Encore merci à toi
@+
J@@


Avatar
Frédéric Sigonneau
Bonjour,

Les choses ayant l'air déjà bien avancées, mes deux centimes d'euros, au cas
zoù...
Dans tes colonnes de saisies (A et B, K et L, ce que tu veux) est-il imaginable
que tes secrétaires adoptent une petite convention de saisie :

- journée entière d'arrêt : 1/1/04
- demi journée d'arrêt : 1/1/04/2 (1/1/04 divisée par 2)

Dans le module de code de la feuille de saisie, les saisies correspondant à des
1/2 journées sont retravaillées au fur et à mesure avec ce bout de code pour
obtenir, par ex, 1/1/04 12:00 :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim NbSep, dt
NbSep = _
Len(Target.Text) - Len(Application.Substitute(Target.Text, "/", ""))
If NbSep = 3 Then
dt = CDate(Left(Target.Text, Len(Target.Text) - 2))
Target.Value = dt + 0.5
End If
End Sub

Tu obtiens ainsi, par exemple :

A1 -> 1/1/04
B1 -> 3/1/04/2 -> 3/1/04 12:00
C1 -> B1-A1 (soit 2,5 dans cet exemple).

ou

A2 -> 5/1/04/2 -> 5/1/04 12:00
B2 -> 8/1/04/2 -> 8/1/04 12:00
C2 -> B2-A2 ( = 3)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour à tous et bienvenue dans cette nouvelle année

J'ai un problème de calcul de congés:

en A: date du jour de début de l'arrêt, actuellement 01/01/04
en B: date du jour de fin de l'arrêt
ensuite j'ai un calcul C=B-A

Mais l'arrêt peut être seulement de la matinée, ou de l'après-midi, ou 3
jours 1/2...
Avec le format jj/mm/aa h: AM/PM , la saisie est très lourde (détail de
l'heure), et l'affichage encombrant.
Or la 1/2 journée n'est pas divisible, donc pas besoin de l'heure.

Pourrait-on saisir seulement 01/01 A (et encore seulement lorsque des
1/2 journées sont concernées) et obtenir 01/01/04 AM tout en permettant
le calcul sur cette donnée????

Je veux éviter que les gentilles secrétaires abîment leurs beaux ongles
vernis en tapant des tonnes de trucs impossibles à exploiter ensuite.

Merci pour votre solidarité
J@@


Avatar
Daniel.M
Salut J@@,

Ou l'utilisation de 2 colonnes supplémentaires dans lesquelles les
transformations appropriées seraient générées automatiquement
(par le code dans l'événement).
Il suffirait de mettre les colonnes de saisie sous format
Texte (pour éviter l'interprétation première d'Excel).


Laisse-moi savoir si ça te convient.


Ma foi, oui; le but est d'arriver à avoir des résultats fiables et
calculables.



J'ai changé à peine la routine.
Tu devrais formatter tes colonnes K:L sous forme Texte et mettre tes colonnes
M:N sous un format Date.

Laisse-moi savoir si la proc suivante fait l'affaire: elle accepte désormais les
"/" et les traite comme des espaces.

Salutations,

Daniel M.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim C As Range, s As String, V As Variant
Dim Valide As Boolean, AM As Boolean, i As Integer
Dim lAn As Integer, leMois As Integer, leJour As Integer

For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
i = Len(Application.Substitute(C.Text, " ", ""))
If i = 0 Then C(1, 3).ClearContents: Exit Sub
If i < 6 Then ' une entrée abbréviée, qu'on doit convertir
s = Application.Substitute(UCase(C.Text), "A", " A")
s = Application.Substitute(s, "P", " P")
s = Application.Substitute(s, "/", " ")
V = Split(s, " ")
Valide = True
AM = True
For i = LBound(V) To UBound(V)
If IsNumeric(V(i)) Then ' Un chiffre
If leJour = 0 Then
leJour = V(i)
ElseIf leMois = 0 Then
leMois = V(i)
ElseIf lAn = 0 Then
lAn = V(i)
Else
Valide = False
End If
Else ' indicateur AM ou PM
If V(i) = "A" Then
AM = True
ElseIf V(i) = "P" Then
AM = False
ElseIf V(i) <> "" Then 'autre chose==> erreur!
Valide = False
End If
End If
Next i

' mets les entrées par défaut (i.e. le jour courant)
If leJour = 0 Then leJour = Day(Date)
If leMois = 0 Then leMois = Month(Date)
If lAn = 0 Then lAn = Year(Date)

'Si valide, mets la date 2 colonnes à droite
If Valide Then
C(1, 3) = DateSerial(lAn, leMois, leJour) + IIf(AM, 0, 0.5)
Else ' si non valide mets le contenu de C 2 colonnes à droite
C(1, 3) = C.Value
End If
Else
C(1, 3) = C.Value
End If ' bonne longueur
End If ' bonnes colonnes et ligne
Next C
End Sub


1 2 3 4 5