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).
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
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).
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
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).
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
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@@
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@@
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@@
voici les résultats des premiers tests:
(format du test : j/m/aa h:mm AM/PM)
*par défaut la saisie donne 12:00 AM, il me semble qu'elle devrait donner
0:00 AM
1/1/04
1 1
01/01/04 donnent 1/01/04 12:00 AM
*Avec le / il y a un problème quand une lettre existe:
12 12 P donne 12/12/04 12:00 PM
mais 12/12 p donne du texte 12/12 p
voici les résultats des premiers tests:
(format du test : j/m/aa h:mm AM/PM)
*par défaut la saisie donne 12:00 AM, il me semble qu'elle devrait donner
0:00 AM
1/1/04
1 1
01/01/04 donnent 1/01/04 12:00 AM
*Avec le / il y a un problème quand une lettre existe:
12 12 P donne 12/12/04 12:00 PM
mais 12/12 p donne du texte 12/12 p
voici les résultats des premiers tests:
(format du test : j/m/aa h:mm AM/PM)
*par défaut la saisie donne 12:00 AM, il me semble qu'elle devrait donner
0:00 AM
1/1/04
1 1
01/01/04 donnent 1/01/04 12:00 AM
*Avec le / il y a un problème quand une lettre existe:
12 12 P donne 12/12/04 12:00 PM
mais 12/12 p donne du texte 12/12 p
Bonjour Frédéric et merci pour tes idées
en testant ta proc sur des cellules formatées j/m/aa h:mm AM/PM :
5/12/04 donne 5/12/04 12:00 AM (??? pourquoi pas 00:00??)
5/12/04/2 donne 5/12/04 12:00 PM
je suis en XL 2K SP3 français,
j'ai d'ailleurs fait une remarque similaire à Daniel M
A force je vais finir par comprendre quelque chose
Mais réponds moi à voix basse que JPS ne me couvra pas d'opprobre ;-)
@+
J@@
j'ai retouché (un peu) ta proc, en espérant ne pas l'avoir dégradée ...
'*******
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim C As Range
Dim NbSep, dt
For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
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 If
Next C
End Sub
'*********
"Frédéric Sigonneau" <Les choses ayant l'air déjà bien avancées, mes deux centimes d'euros, au
caszoù...
Dans tes colonnes de saisies (A et B, K et L, ce que tu veux) est-il
imaginableque 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
à des1/2 journées sont retravaillées au fur et à mesure avec ce bout de code
pourobtenir, 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@@
Bonjour Frédéric et merci pour tes idées
en testant ta proc sur des cellules formatées j/m/aa h:mm AM/PM :
5/12/04 donne 5/12/04 12:00 AM (??? pourquoi pas 00:00??)
5/12/04/2 donne 5/12/04 12:00 PM
je suis en XL 2K SP3 français,
j'ai d'ailleurs fait une remarque similaire à Daniel M
A force je vais finir par comprendre quelque chose
Mais réponds moi à voix basse que JPS ne me couvra pas d'opprobre ;-)
@+
J@@
j'ai retouché (un peu) ta proc, en espérant ne pas l'avoir dégradée ...
'*******
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim C As Range
Dim NbSep, dt
For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
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 If
Next C
End Sub
'*********
"Frédéric Sigonneau" <
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@@
Bonjour Frédéric et merci pour tes idées
en testant ta proc sur des cellules formatées j/m/aa h:mm AM/PM :
5/12/04 donne 5/12/04 12:00 AM (??? pourquoi pas 00:00??)
5/12/04/2 donne 5/12/04 12:00 PM
je suis en XL 2K SP3 français,
j'ai d'ailleurs fait une remarque similaire à Daniel M
A force je vais finir par comprendre quelque chose
Mais réponds moi à voix basse que JPS ne me couvra pas d'opprobre ;-)
@+
J@@
j'ai retouché (un peu) ta proc, en espérant ne pas l'avoir dégradée ...
'*******
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim C As Range
Dim NbSep, dt
For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
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 If
Next C
End Sub
'*********
"Frédéric Sigonneau" <Les choses ayant l'air déjà bien avancées, mes deux centimes d'euros, au
caszoù...
Dans tes colonnes de saisies (A et B, K et L, ce que tu veux) est-il
imaginableque 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
à des1/2 journées sont retravaillées au fur et à mesure avec ce bout de code
pourobtenir, 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@@
voici les résultats des premiers tests:
(format du test : j/m/aa h:mm AM/PM)
*par défaut la saisie donne 12:00 AM, il me semble qu'elle devrait
donner
0:00 AM
1/1/04
1 1
01/01/04 donnent 1/01/04 12:00 AM
C'est à cause de ton format.
Tu peux en choisir un autre j/m/aa h:mm ' par exemple*Avec le / il y a un problème quand une lettre existe:
12 12 P donne 12/12/04 12:00 PM
mais 12/12 p donne du texte 12/12 p
Change
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
par
i = Len(Application.Substitute(Application.Substitute( _
C.Text, " ", ""), "/", ""))
If i = 0 Then C(1, 3).ClearContents: Exit Sub
If i < 8 Then ' une entrée abbréviée, qu'on doit convertir
Je me demande même si on ne devrait supprimer complètement ce test (i
< 8). On
pourrait le faire à la condition de toujours saisir selon les
recommandations et
ne pas indiquer de vraies dates complètes en K et L.
Les deux autres cas relèvent du même problème.
Salutations,
Daniel M.
voici les résultats des premiers tests:
(format du test : j/m/aa h:mm AM/PM)
*par défaut la saisie donne 12:00 AM, il me semble qu'elle devrait
donner
0:00 AM
1/1/04
1 1
01/01/04 donnent 1/01/04 12:00 AM
C'est à cause de ton format.
Tu peux en choisir un autre j/m/aa h:mm ' par exemple
*Avec le / il y a un problème quand une lettre existe:
12 12 P donne 12/12/04 12:00 PM
mais 12/12 p donne du texte 12/12 p
Change
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
par
i = Len(Application.Substitute(Application.Substitute( _
C.Text, " ", ""), "/", ""))
If i = 0 Then C(1, 3).ClearContents: Exit Sub
If i < 8 Then ' une entrée abbréviée, qu'on doit convertir
Je me demande même si on ne devrait supprimer complètement ce test (i
< 8). On
pourrait le faire à la condition de toujours saisir selon les
recommandations et
ne pas indiquer de vraies dates complètes en K et L.
Les deux autres cas relèvent du même problème.
Salutations,
Daniel M.
voici les résultats des premiers tests:
(format du test : j/m/aa h:mm AM/PM)
*par défaut la saisie donne 12:00 AM, il me semble qu'elle devrait
donner
0:00 AM
1/1/04
1 1
01/01/04 donnent 1/01/04 12:00 AM
C'est à cause de ton format.
Tu peux en choisir un autre j/m/aa h:mm ' par exemple*Avec le / il y a un problème quand une lettre existe:
12 12 P donne 12/12/04 12:00 PM
mais 12/12 p donne du texte 12/12 p
Change
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
par
i = Len(Application.Substitute(Application.Substitute( _
C.Text, " ", ""), "/", ""))
If i = 0 Then C(1, 3).ClearContents: Exit Sub
If i < 8 Then ' une entrée abbréviée, qu'on doit convertir
Je me demande même si on ne devrait supprimer complètement ce test (i
< 8). On
pourrait le faire à la condition de toujours saisir selon les
recommandations et
ne pas indiquer de vraies dates complètes en K et L.
Les deux autres cas relèvent du même problème.
Salutations,
Daniel M.
Ça semble être l'affichage par défaut de ce format (la barre de
formule indique
bien 0:00 pour l'heure).
Si tu tiens vraiment à un format qui mette en évidence les
demi-journées, tu
pourrais essayer ce format un peu 'tordu' (et assez disgracieux) pour
les
cellules de saisie
(mais plus aucune proc n'est nécessaire) :
j/mm/aa _h_m AM/PM
Ensuite, en A1 tu saisis
1/1/04 0:00 (début de l'arrêt le matin)
en A2
1/1/04 12:00 (début de l'arrêt l'AM)
En B1 tu saisis les dates de reprise (et non de fin d'arrêt)
3/1/04 0:00 (reprise le 3 au matin)
en B2
3/1/04 12:00 (reprise le 3 AM)
En C1 et C2 le nb de jours d'arrêt (2 jours dans les deux cas) par une
formule
B-A (et un format standard).
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 Frédéric et merci pour tes idées
en testant ta proc sur des cellules formatées j/m/aa h:mm AM/PM :
5/12/04 donne 5/12/04 12:00 AM (??? pourquoi pas 00:00??)
5/12/04/2 donne 5/12/04 12:00 PM
J@@
j'ai retouché (un peu) ta proc, en espérant ne pas l'avoir dégradée
...
'*******
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
Dim C As Range
Dim NbSep, dt
For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
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 If
Next C
End Sub
'*********
"Frédéric Sigonneau" <Dans tes colonnes de saisies (A et B, K et L, ce que tu veux)
est-il
imaginableque 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
à des1/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
--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????
Ça semble être l'affichage par défaut de ce format (la barre de
formule indique
bien 0:00 pour l'heure).
Si tu tiens vraiment à un format qui mette en évidence les
demi-journées, tu
pourrais essayer ce format un peu 'tordu' (et assez disgracieux) pour
les
cellules de saisie
(mais plus aucune proc n'est nécessaire) :
j/mm/aa _h_m AM/PM
Ensuite, en A1 tu saisis
1/1/04 0:00 (début de l'arrêt le matin)
en A2
1/1/04 12:00 (début de l'arrêt l'AM)
En B1 tu saisis les dates de reprise (et non de fin d'arrêt)
3/1/04 0:00 (reprise le 3 au matin)
en B2
3/1/04 12:00 (reprise le 3 AM)
En C1 et C2 le nb de jours d'arrêt (2 jours dans les deux cas) par une
formule
B-A (et un format standard).
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 Frédéric et merci pour tes idées
en testant ta proc sur des cellules formatées j/m/aa h:mm AM/PM :
5/12/04 donne 5/12/04 12:00 AM (??? pourquoi pas 00:00??)
5/12/04/2 donne 5/12/04 12:00 PM
J@@
j'ai retouché (un peu) ta proc, en espérant ne pas l'avoir dégradée
...
'*******
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
Dim C As Range
Dim NbSep, dt
For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
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 If
Next C
End Sub
'*********
"Frédéric Sigonneau" <
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
--
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????
Ça semble être l'affichage par défaut de ce format (la barre de
formule indique
bien 0:00 pour l'heure).
Si tu tiens vraiment à un format qui mette en évidence les
demi-journées, tu
pourrais essayer ce format un peu 'tordu' (et assez disgracieux) pour
les
cellules de saisie
(mais plus aucune proc n'est nécessaire) :
j/mm/aa _h_m AM/PM
Ensuite, en A1 tu saisis
1/1/04 0:00 (début de l'arrêt le matin)
en A2
1/1/04 12:00 (début de l'arrêt l'AM)
En B1 tu saisis les dates de reprise (et non de fin d'arrêt)
3/1/04 0:00 (reprise le 3 au matin)
en B2
3/1/04 12:00 (reprise le 3 AM)
En C1 et C2 le nb de jours d'arrêt (2 jours dans les deux cas) par une
formule
B-A (et un format standard).
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 Frédéric et merci pour tes idées
en testant ta proc sur des cellules formatées j/m/aa h:mm AM/PM :
5/12/04 donne 5/12/04 12:00 AM (??? pourquoi pas 00:00??)
5/12/04/2 donne 5/12/04 12:00 PM
J@@
j'ai retouché (un peu) ta proc, en espérant ne pas l'avoir dégradée
...
'*******
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
Dim C As Range
Dim NbSep, dt
For Each C In Target
If C.Column > 10 And C.Column < 13 And C.Row >= 13 Then
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 If
Next C
End Sub
'*********
"Frédéric Sigonneau" <Dans tes colonnes de saisies (A et B, K et L, ce que tu veux)
est-il
imaginableque 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
à des1/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
--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????