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
J
Bonjour Daniel
j'ai retenu ta dernière proposition
actuellement les agents saisissaient
quand les journées sont entières
01/01 jour/mois/année
1/01
voire avec l'année 04 ou 2004

et quand c'est par demi journées
01/01/04 AM
01/01/04 PM
ou avec l'année 2004
on peut demander de simplifier la saisie, bine sûr

le Pb étant que je récupère ces données par une macro dans une feuille
de compil où se font des calculs sur ces données.
Ainsi j'ai besoin de rester en format date ( en K début d'arrêt et L fin
d'arrêt)

Pardonnes-moi, mais ma femme vient de me demander de participer au
tirage de la galette des rois
@+
J@@

"Daniel.M" <

Il y aurait également
If c.Column > 10 And c.Column < 13 And c.Row > Then

Je pense que tu y es presque.
Il reste à t'assurer que les différentes saisies soient bien
interprétées et que

la procédure y réagisse d'une façon appropriée. Pour cela, je te
suggères de te

bâtir une liste des saisies 'autorisées' et des résultats attendus.

Publie-la ici (la liste des différentes saisies et comment elles
devraient être

traduites).
Ainsi, on serait en mesure d'adapter le code initial de Michel pour
tenir compte

de toutes les possibilités que tu auras identifiées.

Salutations,

Daniel M.


"J@@" wrote in message
news:%
Bonjour Daniel
en fait mes saisies de dates sont seulement de K13:L13 à Kn:Ln
j'ai retouché une ligne


j'ai aussi retouché le format d/mm/yy h:mm, car j'ai l'impression
que


Excel confond jour et mois quand je n'ai qu'un caractère.

Ce qui reste ennuyeux c'est que la saisie doit-être très attentive :
si


oublie de l'année avant l'espace a ou p, crac. C'est aussi sensible
à la


casse..
Bon maintenant je modifie le code pour qu'il ne s'applique qu'aux
feuilles de saisies.

Merci beaucoup
@+
J@@

"Daniel.M" <> > J'espère juste que vu le nombre de feuilles (environ
100) je n'aurai pas
de problèmes de mémoire.


Avec 100 feuilles, j'aurais tendance à utiliser plutôt l'événement
SheetChange

du Workbook. Il te faudra placer ce code au niveau du WorkBook (on
revient au

départ :-))).

Vu que le code de Michel te va, je l'ai adapté pour l'événement
SheetChange (et

rajouté une vérification sur la colonne, qui doit < 3, donc les
premières).


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



Range)
Dim c As Range
For Each c In Target
If c.Column < 3 Then
If Not IsError(CDate(Left(c, Len(c) - 2))) Then
Application.EnableEvents = False
c.NumberFormat = "d/mm/yy h:mm"
Select Case Right(c, 1)
Case "a"
c = CDate(Left(c, Len(c) - 2))
Case "p"
c = CDate(Left(c, Len(c) - 2)) + 0.5
End Select
Application.EnableEvents = True
End If
End If
Next c
End Sub

Salutations,

Daniel M.












Avatar
Daniel.M
"J@@" wrote in message
news:%
Bonjour Daniel
j'ai retenu ta dernière proposition


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.

Pardonnes-moi, mais ma femme vient de me demander de participer au
tirage de la galette des rois


QUOI ???@@@@???
S'il faut que nos femmes s'en mêlent: on n'est pas sorti du bois. :-))

Salutations,

Daniel M.

Avatar
J
Bonsoir Daniel (coucher de soleil ici)
après une bonne galette et un coup de cidre (je suis le roi, je ne
dirais pas de quoi.. et puis ils mettent plusieurs fèves)

**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.

**Autre point,j'ai dû casser mon Excel, la proc de réalise plus les
actions souhaitées. Alors que j'y arrivais tout à l'heure (et avec F9,
je ne vois rien)
Me faudra des siècles de travail pour progresser sérieusement...

Merci pour ton aide
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.

Pardonnes-moi, mais ma femme vient de me demander de participer au
tirage de la galette des rois


QUOI ???@@@@???
S'il faut que nos femmes s'en mêlent: on n'est pas sorti du bois. :-))

Salutations,

Daniel M.





Avatar
J
Juste pour corriger, mon Excel fonctionne bien (c'est le cidre, ou la
fève??)
@+
J@@

"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.


"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.







Avatar
Daniel.M
Salut J@@,

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


Salutations,

Daniel M.

"J@@" wrote in message
news:%
Bonsoir Daniel (coucher de soleil ici)
après une bonne galette et un coup de cidre (je suis le roi, je ne
dirais pas de quoi.. et puis ils mettent plusieurs fèves)

**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.

**Autre point,j'ai dû casser mon Excel, la proc de réalise plus les
actions souhaitées. Alors que j'y arrivais tout à l'heure (et avec F9,
je ne vois rien)
Me faudra des siècles de travail pour progresser sérieusement...

Merci pour ton aide
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.

Pardonnes-moi, mais ma femme vient de me demander de participer au
tirage de la galette des rois


QUOI ???@@@@???
S'il faut que nos femmes s'en mêlent: on n'est pas sorti du bois. :-))

Salutations,

Daniel M.








Avatar
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 ;-))


Salut J@@,

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

Salutations,

Daniel M.

"J@@" wrote in message
news:%
Bonsoir Daniel (coucher de soleil ici)
après une bonne galette et un coup de cidre (je suis le roi, je ne
dirais pas de quoi.. et puis ils mettent plusieurs fèves)

**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.

**Autre point,j'ai dû casser mon Excel, la proc de réalise plus les
actions souhaitées. Alors que j'y arrivais tout à l'heure (et avec F9,
je ne vois rien)
Me faudra des siècles de travail pour progresser sérieusement...

Merci pour ton aide
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.

Pardonnes-moi, mais ma femme vient de me demander de participer au
tirage de la galette des rois


QUOI ???@@@@???
S'il faut que nos femmes s'en mêlent: on n'est pas sorti du bois. :-))

Salutations,

Daniel M.







--
Cordialement,

Michel Gaboly
http://www.gaboly.com






Avatar
Michel Gaboly
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 ;-))


Salut J@@,

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

Salutations,

Daniel M.

"J@@" wrote in message
news:%
Bonsoir Daniel (coucher de soleil ici)
après une bonne galette et un coup de cidre (je suis le roi, je ne
dirais pas de quoi.. et puis ils mettent plusieurs fèves)

**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.

**Autre point,j'ai dû casser mon Excel, la proc de réalise plus les
actions souhaitées. Alors que j'y arrivais tout à l'heure (et avec F9,
je ne vois rien)
Me faudra des siècles de travail pour progresser sérieusement...

Merci pour ton aide
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.

Pardonnes-moi, mais ma femme vient de me demander de participer au
tirage de la galette des rois


QUOI ???@@@@???
S'il faut que nos femmes s'en mêlent: on n'est pas sorti du bois. :-))

Salutations,

Daniel M.







--
Cordialement,

Michel Gaboly
http://www.gaboly.com




Avatar
J
Bonjour les amis,
j'ai remplacé B par P ici:
s = Application.Substitute(s, "P", " P")
et mis un format détaillé pour mieux suivre:
C.NumberFormat = "dd/mm/yyyy h:mm"
* evolution des tests:
1 => 01/01/1900
13 => 13/01/1900
1 1=> 01/01/2004 12:00 '?? par défaut il met 12:00, ce qui correspond à
ce qui se passe quand on vide la cellule
1 1A=> 01/01/2004 0:00
1 1P=> 01/01/2004 12:00
7 2P=> 07/02/2004 12:00
72P=> 12/03/2004 12:00
*= l'espace entre les chiffres est impératif sous peine d'erreur.
Ne devrait on pas l'imposer, ou imposer le / ??
*= impossible de vider une cellule ou de copier le format (pour
rallonger la feuille par exemple): la cellue contient automatiquement
04/01/2004 12:00 (et tjrs 12 !§?)


***autre remarque (avant de me faire tirer les oreilles au boulot:
j'avais dit: "> > ce qui est l'heure du début de l'action (arrêt ou
reprise), "
en fait mes colonnes sont "début et fin de l'arrêt (fin veut dire
dernière période incluse dans l'arrêt "

Décidément ce n'est pas simple
Je fonce chez FS chercher split97 (pour la machine destinataire de la
proc)
amicalement
merci encore
J@@



"Daniel.M" <>
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


Salutations,

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.










Avatar
J
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
Daniel.M
Salut J@@,

_________________________
j'ai remplacé B par P ici:
s = Application.Substitute(s, "P", " P")


Effectivement. Il y avait erreur.

_________________________
et mis un format détaillé pour mieux suivre:
C.NumberFormat = "dd/mm/yyyy h:mm"
OK.


_________________________
* evolution des tests:
...
C'est LE problème FONDAMENTAL et tes tests le prouvent.

Dans mon code, je pensais récupérer la saisie comme telle avec C.Text mais c'est
déjà formaté en date. C'est ce qui ne va pas et qui explique l'ensemble de tes
résultats.
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. :-(


_________________________
*= l'espace entre les chiffres est impératif sous peine d'erreur.


Cela me semble logique, sinon comment différencier
1 2 A ' 1 fev 2004 AM
12 A ' 12 jan 2004 AM

Ne devrait on pas l'imposer, ou imposer le / ??
Oui, il faut imposer l'espace.


_________________________
*= impossible de vider une cellule ou de copier le format (pour
Corrigé en testant sur len()> 0


_________________________
rallonger la feuille par exemple): la cellue contient automatiquement
04/01/2004 12:00 (et tjrs 12 !§?)


AM était false par défaut. C'est corrigé.

_________________________
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.

1 2 3 4 5