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
Clément Marcotte
Bonjour,

'breakpoint' (c'est quoi la traduction en
français? :-( ).


Point d'arrêt

Avatar
Daniel.M
Merci Clément. Un jour, j'aurai accès à une version française du logiciel ...

Salutations,

Daniel M.

"Clément Marcotte" wrote in message
news:
Bonjour,

'breakpoint' (c'est quoi la traduction en
français? :-( ).


Point d'arrêt




Avatar
J
Bonjour Daniel et Clément,
une fois de plus à la rescousse :-)))
Le code de Michel était parfait, mais stupide que je suis, je l'avais
test dans Thisworkbook, dans un module normal, bref n'importe où sauf
dans le code de la feuille.

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

encore merci , pour le point d'arrêt aussi :-)
@+
J@@

"Daniel.M" <

Pour tout dire, j'ai testé ta proc mais je ne vois rien sauf quand
je


fais des calculs sur les dates comportant A ou B : #VALEUR!
Et je ne sais, pas comment faire de pas à pas sur ce type de proc
(que


j'ai bien sûr mise dans ThisWorkbook)
Peut - tu m'orienter??


Très important: Mets-là dans le code de ta _FEUILLE_ (pas le code du
classeur).


Pour faire du pas à pas, insère un 'breakpoint' (c'est quoi la
traduction en

français? :-( ). On peut l'insérer par la touche F9 (trouve une ligne
au début

de ta proc.

Pour le reste, j'ai pas suivi.

Salutations,

Daniel M.





Avatar
Daniel.M
Bonsoir J@@,

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/m/yy h:mm"
Select Case Right(c, 1)
Case "A"
c = CDate(Left(c, Len(c) - 2))
Case "B"
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
J
Bonjour à tous
maintenant (merci Daniel de m'avoir ouvert les yeux) que la proc
suivante est dans la feuille, elle fonctionne
c'est à dire: saisie de
1/01 A donne 1/01/04 0:00
2/01/04 B donne 2/01/04 12:00

**Mais comment réduire l'action de cette macro à la *range K13:Lnn* (il
s'agit d'une feuille de congés individuelle, il ne devrait pas y avoir
65536 saisies)
car j'ai plantage dès qu'une donnée est entrée ailleurs dans la feuille.
J'ai essayé ceci en y ajoutant/retirant des "", mais c'est nul
'Dim c("k13", "L65536") As Range
'dim c as Range("k13","L65536")

Merci pour le coup de main
@+
J@@


"Michel Gaboly" <> Tu peux utiliser l'événement Change de la feuille
concernée :

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim c As Range
For Each c In Target
If Not IsError(CDate(Left(c, Len(c) - 2))) Then
Application.EnableEvents = False
c.NumberFormat = "d/m/yy h:mm"
Select Case Right(c, 1)
Case "A"
c = CDate(Left(c, Len(c) - 2))
Case "B"
c = CDate(Left(c, Len(c) - 2)) + 0.5
End Select
Application.EnableEvents = True
End If
Next c
End Sub

Dans cet exemple j'ai utilisé A pour le matin et B pour l'après-midi
(Case "A" et Case "B").

Le principe est le suivant : quand une ou plusieurs cellules sont
modi-

fiées, on les examine une par une (Boucle For Each c In Target).

Pour chaque cellule, on teste si la conversion en date après avoir
éliminé les 2 derniers caractères (Espace + "A" ou "B" en
l'occurrence)

n'aboutit pas une erreur.

On remplace alors espace + "A" par rien, ce qui correspond à la date à
0 heure et espace + "B" par 0,5, ce qui correspond à la date à midi.

Les calculs sur les 1/2 journées sonr alors possibles.


problème de calcul de congés:

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

l'arrêt peut être seulement de la matinée, ou de l'après-midi,
ou 3 jours 1/2...

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






Avatar
Daniel.M
Bonsoir J@@,

**Mais comment réduire l'action de cette macro à la *range K13:Lnn* (il
s'agit d'une feuille de congés individuelle, il ne devrait pas y avoir
65536 saisies)




Dans la toute dernière réponse que je t'ai fournie, remplace
If c.Column < 3 Then
par
If Not InterSect(c,sh.Range("K13:L"&nn)) is nothing Then


Ceci dit, je suppose que tu connais Lnn (moi ça ne me dit rien ;-)).

Salutations,

Daniel M.

Avatar
J
Bonjour Daniel
en fait mes saisies de dates sont seulement de K13:L13 à Kn:Ln
j'ai retouché une ligne
If c.Column > 10 And c.Column < 13 Then

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
J
Bonsoir Daniel (j'ai 16:36 à ma montre :-))

If Not Intersect(c, Sh.Range("K13:L" & nn)) Is Nothing Then
**Erreur 1004
J'envoie tout de même le bonjour à Lnn
:-))
J@@

"Daniel.M" <>
**Mais comment réduire l'action de cette macro à la *range K13:Lnn*
(il

s'agit d'une feuille de congés individuelle, il ne devrait pas y
avoir


65536 saisies)


Dans la toute dernière réponse que je t'ai fournie, remplace
If c.Column < 3 Then
par
If Not InterSect(c,sh.Range("K13:L"&nn)) is nothing Then

Ceci dit, je suppose que tu connais Lnn (moi ça ne me dit rien ;-)).

Salutations,

Daniel M.





Avatar
Daniel.M
Salut J@@,

If c.Column > 10 And c.Column < 13 Then



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:
Bonsoir Daniel (j'ai 16:36 à ma montre :-))
Et moi 21:47 :-)



If Not Intersect(c, Sh.Range("K13:L" & nn)) Is Nothing Then
**Erreur 1004


Il faudrait que nn soit défini quelque part!
C'est pas grave: j'ai vu dans l'autre sous-ficelle que tu as résolu ce petit
problème en comparant la valeur des colonnes : perfecto.

Salutations,

Daniel M.

1 2 3 4 5