Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Appel au secours des pros codes

22 réponses
Avatar
George
Hello a tous.

Il y a qq temps, j'ai reçu pour faire un tableau, un code à insérer.

Jusqu'à hier, et multiples changements dans mon tableau (pas le code), je
n'avais aucun problème.

Ce code sert principalement à changer le format 3.30 en 3: 30 (format
horaire)

Mais voilà.

J'ai envoyé cette feuille Excel et je l'ai reçue en retour sans le code.
J'ai trouvé judicieux de le remettre, mais voilà. Toutes mes pages excels me
changent le "." en ":"

Mais à la base, cette action n'aurait dû être active que sur une seule
feuille et non tout Excel.

Qui pourrait m'aider à trouver une solution pour corriger mon erreur.

Salutations et merci à tous.

George

10 réponses

1 2 3
Avatar
George
Je viens d'essayer,

de coller ce code et il me donne pour un horaire de 2.15 (deux heures et
quinze minutes)
42036:

Help, je fais quoi maintenant?

Salutations

George


"Michel Gaboly" a écrit dans le message de
news:
Re,

Le Maître est de trop, à moins qu'il soit ironique, ce que j'espère ;-))

1 - Tu devrais avoir l'"ultra simplicité" réclamée.

2 - Le code n'aura d'effet que sur les feuilles dont le module associé
contiendra le code indiqué, rien sur les éventuelles autres feuilles
du ou des classeur(s) concerné(s), ni sur rien d'autre.

3 - La fonction Replace n'est disponible en VBA qu'à partir d'Excel
2000, et uniquement pour les versions Windows. C'est pourquoi
avec Excel 97 ou une version Mac, il faut faire appel à la fonction
SUBSTITUE() disponible dans les feuilles de calcul, à laquelle on
accède ainsi :

Application.WorksheetFunction.Substitute()

qui peut également être utilisée dans les versions ultérieures. La prin-
cipale raison d'utiliser plutôt Replace est qu'on obtient ainsi un code +
concis, mais inutilisable avec Excel 97 et Excel Mac.

4 - Pour que le code fonctionne sur les 4 machines, dont 1 sous Excel
97, tu ne peux donc pas utiliser la fonction Replace, ce qui ne t'empêche
nullement d'avoir une version unique pour les 4 postes. Simplement,
cette version devra utiliser Application.WorksheetFunction.Substitute()


Copie ceci (qui tient compte de la plage C9:AG30), dans le module associé
à la feuille concernée. Si plusieurs feuilles sont concernées, le code
doit

être copié dans chacune module associé à l'une des feuilles en question :


Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, Pos As Integer
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("C9:AG30")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
On Error Resume Next
Pos = Application.WorksheetFunction.Search(Sep, c)
If Pos = 0 And c <> "" Then
c = c & ":" ' Heure entière
Else
CorrectionDizaine c
c = Application.WorksheetFunction. _
Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le résultat est
9:02 au lieu de 9:20

' il faut donc rajouter 9 fois le nb erroné de
minutes pour passer

' de 2 à 20. Une unité représentant 1 jour, il
faut diviser par

' 1440 (24 *60, nb de minutes par jour), pour
ajouter des minutes.

If Dizaine Then
c = c + (Minute(c) * 9) / 1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 10 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub

Je viens de tester ce code (légèrement modifié), sur Excel 98 (MacOS 9.1),
homologue d'Excel 97 sur PC et sur un poste sous Win 98 et Excel 2000.
Semble bien fonctionner dans les 2 cas.

Ensuite, tu pourras faire 3 "Enregistrer sous..." pour avoir les 3 exem-
plaires destinés aux autres postes.


Cher Maître Gaboly,

Un grand merci pour tes explications.

Je dois t'avouer que tu me parles un langage que je vais devoir prendre
du


temps et passer au mois des mois à comprendre ce que tu m'as écrit. Non
sans


mauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encore


et toujours nul en code et formules complexes).

Par contre, je vais essayer de m'y atteler dans les prochaines semaines,
mais je ne garantirais pas les résultats pour le début. Mon soucis,
c'est


que maintenant suivant tes explicatifs, les lignes de codes que tu m'as
données, auront-elles les résultats que je souhaite ?

1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm) selon le
pavé numérique
(donc changement du double point à la place point en ayant le double
point


qui s'inscrit) [est-ce que je me suis bien fait comprendre??]

2. Cette façon de faire, sera t'elle uniquement possible sur le
"Classeur


Excel" et les feuilles qui s'y rapportent, sans être automatiquement
répercutées sur les autres documents?

3. Selon tes explications, mon soucis actuelle vient du fait que tu m'as
embrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP ainsi
que


2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97 avec
Win


98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003 (le
mien)


/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce que
tu


m'as dit avant.

4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour la
version définitive)

Je choisis quoi? Je pensais qu'il suffisait juste "Enregistrer sous....
"


version précédente, pour avoir mes quatre copies de fichiers que
j'installerais par la suite sur les autres PC.

Cher Michel, je réitère encore mes remerciements pour tes lumières.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Bonjour George,

Il y a plusieurs insuffisances de conception : seule une partie
des cas sont traités, et certains remplacement sont faits à
tort (remplacement des ":" par un point si on entre dans une
cellule de la plage A1:A10 du texte comportant un point).

Le principe est que si on sélectionne une cellule (et une seule)
de la plage A1:A10, on modifie les règles de correction automa-
tique pour remplacer le point, "." par deux points, ":".

Les défauts sont les suivants :

Si on sélectionne ensuite une plage de plusieurs cellules, la cor-
rection auto n'est pas annulée, à cause d'une sortie intempestive
de la procédure _SelectionChange() :

If zz.Count > 1 Then Exit Sub

Par ailleurs, si après avoir entré quelque chose dans une cellule
de la plage A1:A10, on sélectionne une autre feuille du même clas-
seur ou un autre classeur, la correction n'est pas non + annulée,
car l'événement SelectionChange ne survient pas. L'événement est
alors Deactivate de la feuille ou du classeur, qui ne sont gérés ni
l'un ni l'autre, celui du classeur devant l'être dans le module
ThisWorkbook.

D'autre part, si on entre une même valeur dans plusieurs cellules
à la fois de la plage A1:A10, un horaire initial comme 9.30 par
exemple, le remplacement n'est pas non + fait, à cause de la même
sortie de la procédure, cette fois dans _Change() :

If zz.Count > 1 Then Exit Sub

Enfin, _SelectionChange() touche à la correction automatique sans
se préoccuper des options antérieures : si sur un poste existe une
correction auto qui remplace le point par une virgule (par exemple),
cette correction sera détruite.


Le plus simple consiste probablement à abandonner :

- La correction automatique, pour ne pas remettre en cause l'exis-
tant, ni l'appliquer à une saisie de texte.

- L'appel à SelectionChange() qui implique de gérer aussi l'événe-
ment Deactivate de la feuille et celui du classeur pour avoir un
résultat correct.


Voici ce que je te propose :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) Then

Application.EnableEvents = False
If IsError(Application.Find(".", c))
Then



c = c & ":" ' Heure entière
Else
c > > Application.WorksheetFunction.Substitute(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Application.WorksheetFunction.Substitute est utilisé pour des raisons
de



compatibilé avec Excel 97 et les versions Mac (Excel 98 à Excel 2004).

Sur PC, avec Excel 2000 ou + récent, tu peux rempacer Application.
WorksheetFunction.Substitute par Replace, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".", c))
Then



c = c & ":" ' Heure entière
Else
c = Replace(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Tu peux également modifier la procédure en faisant que c'est le point
ou la virgule qui est remplacée, selon le séparateur décimal défini
sur



le poste, ce qui donne (version avec Replace)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sep as string, c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep, c))
Then



c = c & ":" ' Heure entière
Else
c = Replace(c, Sep, ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Malheureusement Application.WorksheetFunction.Substitute (pas
testé avec Replace) traite mal les dizaines de minutes : 9,2 ou 9,20
aboutissent à 9:02.

Une correction s'impose alors. Voici dans ces conditions le contenu
final du module (version avec Application.WorksheetFunction.
Substitute) :

Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c)) Then
c = c & ":" ' Heure entière
MsgBox Sep
Else
CorrectionDizaine c
c > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultat



est 9:02 au lieu de 9:20
' il faut donc rajouter 9 fois le
nb



erroné de minutes pour passer
' de 2 à 20. Une unité
représentant 1



jour, il faut diviser par
' 1440 (24 *60, nb de minutes par
jour), pour ajouter des

' minutes.
If Dizaine Then
c = c + (Minute(c) * 9) /
1440



End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 6 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub


Dis-moi si cela te convient.



Cher Philippe,

voilà que je viens de réessayer de mettre ma macro dans le tableau.
Cela




fonctionne
mais voilà, elle me change aussi la boite de dialogue "Correction
Automatique" (le point en double point).

En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'est




que
cette macro ne soit active que dans la feuille de calcul
sélectionnée et




non
pas dans tous les programmes offices.

devrais-je faire des réglages au niveau des acceptations de macros
dans




outil. Là, je suis complétement perdu.

C'est la deuxième fois que j'enlève dans "Correction automatique"
cette




commande.

Salutations

George

P.S.

AV, cela fait déjà qq jours que je ne le vois plus ici.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
George
Michel selon le code,

lorsque je rentre les chiffres suivants voici les résultats.

0.10 = 0:10
0.70 = 1:10
0.75 = 1:15
0.90 = 1:30
0.100 = 0:10
1.25 = 45658:


Michel au secours, je fais quoi ?

Salutations

George





"Michel Gaboly" a écrit dans le message de
news:
Re,

Le Maître est de trop, à moins qu'il soit ironique, ce que j'espère ;-))

1 - Tu devrais avoir l'"ultra simplicité" réclamée.

2 - Le code n'aura d'effet que sur les feuilles dont le module associé
contiendra le code indiqué, rien sur les éventuelles autres feuilles
du ou des classeur(s) concerné(s), ni sur rien d'autre.

3 - La fonction Replace n'est disponible en VBA qu'à partir d'Excel
2000, et uniquement pour les versions Windows. C'est pourquoi
avec Excel 97 ou une version Mac, il faut faire appel à la fonction
SUBSTITUE() disponible dans les feuilles de calcul, à laquelle on
accède ainsi :

Application.WorksheetFunction.Substitute()

qui peut également être utilisée dans les versions ultérieures. La prin-
cipale raison d'utiliser plutôt Replace est qu'on obtient ainsi un code +
concis, mais inutilisable avec Excel 97 et Excel Mac.

4 - Pour que le code fonctionne sur les 4 machines, dont 1 sous Excel
97, tu ne peux donc pas utiliser la fonction Replace, ce qui ne t'empêche
nullement d'avoir une version unique pour les 4 postes. Simplement,
cette version devra utiliser Application.WorksheetFunction.Substitute()


Copie ceci (qui tient compte de la plage C9:AG30), dans le module associé
à la feuille concernée. Si plusieurs feuilles sont concernées, le code
doit

être copié dans chacune module associé à l'une des feuilles en question :


Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, Pos As Integer
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("C9:AG30")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
On Error Resume Next
Pos = Application.WorksheetFunction.Search(Sep, c)
If Pos = 0 And c <> "" Then
c = c & ":" ' Heure entière
Else
CorrectionDizaine c
c = Application.WorksheetFunction. _
Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le résultat est
9:02 au lieu de 9:20

' il faut donc rajouter 9 fois le nb erroné de
minutes pour passer

' de 2 à 20. Une unité représentant 1 jour, il
faut diviser par

' 1440 (24 *60, nb de minutes par jour), pour
ajouter des minutes.

If Dizaine Then
c = c + (Minute(c) * 9) / 1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 10 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub

Je viens de tester ce code (légèrement modifié), sur Excel 98 (MacOS 9.1),
homologue d'Excel 97 sur PC et sur un poste sous Win 98 et Excel 2000.
Semble bien fonctionner dans les 2 cas.

Ensuite, tu pourras faire 3 "Enregistrer sous..." pour avoir les 3 exem-
plaires destinés aux autres postes.


Cher Maître Gaboly,

Un grand merci pour tes explications.

Je dois t'avouer que tu me parles un langage que je vais devoir prendre
du


temps et passer au mois des mois à comprendre ce que tu m'as écrit. Non
sans


mauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encore


et toujours nul en code et formules complexes).

Par contre, je vais essayer de m'y atteler dans les prochaines semaines,
mais je ne garantirais pas les résultats pour le début. Mon soucis,
c'est


que maintenant suivant tes explicatifs, les lignes de codes que tu m'as
données, auront-elles les résultats que je souhaite ?

1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm) selon le
pavé numérique
(donc changement du double point à la place point en ayant le double
point


qui s'inscrit) [est-ce que je me suis bien fait comprendre??]

2. Cette façon de faire, sera t'elle uniquement possible sur le
"Classeur


Excel" et les feuilles qui s'y rapportent, sans être automatiquement
répercutées sur les autres documents?

3. Selon tes explications, mon soucis actuelle vient du fait que tu m'as
embrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP ainsi
que


2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97 avec
Win


98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003 (le
mien)


/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce que
tu


m'as dit avant.

4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour la
version définitive)

Je choisis quoi? Je pensais qu'il suffisait juste "Enregistrer sous....
"


version précédente, pour avoir mes quatre copies de fichiers que
j'installerais par la suite sur les autres PC.

Cher Michel, je réitère encore mes remerciements pour tes lumières.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Bonjour George,

Il y a plusieurs insuffisances de conception : seule une partie
des cas sont traités, et certains remplacement sont faits à
tort (remplacement des ":" par un point si on entre dans une
cellule de la plage A1:A10 du texte comportant un point).

Le principe est que si on sélectionne une cellule (et une seule)
de la plage A1:A10, on modifie les règles de correction automa-
tique pour remplacer le point, "." par deux points, ":".

Les défauts sont les suivants :

Si on sélectionne ensuite une plage de plusieurs cellules, la cor-
rection auto n'est pas annulée, à cause d'une sortie intempestive
de la procédure _SelectionChange() :

If zz.Count > 1 Then Exit Sub

Par ailleurs, si après avoir entré quelque chose dans une cellule
de la plage A1:A10, on sélectionne une autre feuille du même clas-
seur ou un autre classeur, la correction n'est pas non + annulée,
car l'événement SelectionChange ne survient pas. L'événement est
alors Deactivate de la feuille ou du classeur, qui ne sont gérés ni
l'un ni l'autre, celui du classeur devant l'être dans le module
ThisWorkbook.

D'autre part, si on entre une même valeur dans plusieurs cellules
à la fois de la plage A1:A10, un horaire initial comme 9.30 par
exemple, le remplacement n'est pas non + fait, à cause de la même
sortie de la procédure, cette fois dans _Change() :

If zz.Count > 1 Then Exit Sub

Enfin, _SelectionChange() touche à la correction automatique sans
se préoccuper des options antérieures : si sur un poste existe une
correction auto qui remplace le point par une virgule (par exemple),
cette correction sera détruite.


Le plus simple consiste probablement à abandonner :

- La correction automatique, pour ne pas remettre en cause l'exis-
tant, ni l'appliquer à une saisie de texte.

- L'appel à SelectionChange() qui implique de gérer aussi l'événe-
ment Deactivate de la feuille et celui du classeur pour avoir un
résultat correct.


Voici ce que je te propose :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) Then

Application.EnableEvents = False
If IsError(Application.Find(".", c))
Then



c = c & ":" ' Heure entière
Else
c > > Application.WorksheetFunction.Substitute(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Application.WorksheetFunction.Substitute est utilisé pour des raisons
de



compatibilé avec Excel 97 et les versions Mac (Excel 98 à Excel 2004).

Sur PC, avec Excel 2000 ou + récent, tu peux rempacer Application.
WorksheetFunction.Substitute par Replace, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".", c))
Then



c = c & ":" ' Heure entière
Else
c = Replace(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Tu peux également modifier la procédure en faisant que c'est le point
ou la virgule qui est remplacée, selon le séparateur décimal défini
sur



le poste, ce qui donne (version avec Replace)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sep as string, c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep, c))
Then



c = c & ":" ' Heure entière
Else
c = Replace(c, Sep, ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Malheureusement Application.WorksheetFunction.Substitute (pas
testé avec Replace) traite mal les dizaines de minutes : 9,2 ou 9,20
aboutissent à 9:02.

Une correction s'impose alors. Voici dans ces conditions le contenu
final du module (version avec Application.WorksheetFunction.
Substitute) :

Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c)) Then
c = c & ":" ' Heure entière
MsgBox Sep
Else
CorrectionDizaine c
c > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultat



est 9:02 au lieu de 9:20
' il faut donc rajouter 9 fois le
nb



erroné de minutes pour passer
' de 2 à 20. Une unité
représentant 1



jour, il faut diviser par
' 1440 (24 *60, nb de minutes par
jour), pour ajouter des

' minutes.
If Dizaine Then
c = c + (Minute(c) * 9) /
1440



End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 6 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub


Dis-moi si cela te convient.



Cher Philippe,

voilà que je viens de réessayer de mettre ma macro dans le tableau.
Cela




fonctionne
mais voilà, elle me change aussi la boite de dialogue "Correction
Automatique" (le point en double point).

En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'est




que
cette macro ne soit active que dans la feuille de calcul
sélectionnée et




non
pas dans tous les programmes offices.

devrais-je faire des réglages au niveau des acceptations de macros
dans




outil. Là, je suis complétement perdu.

C'est la deuxième fois que j'enlève dans "Correction automatique"
cette




commande.

Salutations

George

P.S.

AV, cela fait déjà qq jours que je ne le vois plus ici.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
Michel Gaboly
Re,

Dans le code que je t'ai proposé, la saisie est prévue en heures et minutes.

Si j'ai bien compris, 0.59 doit être converti en 0:59 (59 minutes)
et 1.12 en 1:12 (1 heure 12 minutes).

Si 0:59 équivaut à 59 minutes,
0.70 équivaut à 70 minutes, soit 1 heure 10
0.75 équivaut à 75 minutes, soit 1 heure 15
0.90 équivaut à 90 minutes, soit 1 heure 30
0.10 équivaut à 10 minutes, soit 0 heure 10
...

Par contre, 1.25 donne bien 1:25 chez moi ou + exactement,
1,25 donne 1:25 chez moi, car sur mes machines, le point du
pavé numérique donne une virgule.

Est-ce que cette touche donne une virgule ou un point chez toi ?
Et comment sont réglés tes paramètres régionaus (dans le panneau
de configuration) ?

Enfin, j'aimerais bien comprendre, moi aussi, et j'allais te deman-
der si tu étais en région parisienne, mais je vois que tu as une adresse
suisse.

Tu es dans quelle région ? Je serai dans le Valais la semaine pro-
chaine.



Michel selon le code,

lorsque je rentre les chiffres suivants voici les résultats.

0.10 = 0:10
0.70 = 1:10
0.75 = 1:15
0.90 = 1:30
0.100 = 0:10
1.25 = 45658:

Michel au secours, je fais quoi ?

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Re,

Le Maître est de trop, à moins qu'il soit ironique, ce que j'espère ;-))

1 - Tu devrais avoir l'"ultra simplicité" réclamée.

2 - Le code n'aura d'effet que sur les feuilles dont le module associé
contiendra le code indiqué, rien sur les éventuelles autres feuilles
du ou des classeur(s) concerné(s), ni sur rien d'autre.

3 - La fonction Replace n'est disponible en VBA qu'à partir d'Excel
2000, et uniquement pour les versions Windows. C'est pourquoi
avec Excel 97 ou une version Mac, il faut faire appel à la fonction
SUBSTITUE() disponible dans les feuilles de calcul, à laquelle on
accède ainsi :

Application.WorksheetFunction.Substitute()

qui peut également être utilisée dans les versions ultérieures. La prin-
cipale raison d'utiliser plutôt Replace est qu'on obtient ainsi un code +
concis, mais inutilisable avec Excel 97 et Excel Mac.

4 - Pour que le code fonctionne sur les 4 machines, dont 1 sous Excel
97, tu ne peux donc pas utiliser la fonction Replace, ce qui ne t'empêche
nullement d'avoir une version unique pour les 4 postes. Simplement,
cette version devra utiliser Application.WorksheetFunction.Substitute()


Copie ceci (qui tient compte de la plage C9:AG30), dans le module associé
à la feuille concernée. Si plusieurs feuilles sont concernées, le code
doit

être copié dans chacune module associé à l'une des feuilles en question :


Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, Pos As Integer
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("C9:AG30")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
On Error Resume Next
Pos = Application.WorksheetFunction.Search(Sep, c)
If Pos = 0 And c <> "" Then
c = c & ":" ' Heure entière
Else
CorrectionDizaine c
c = Application.WorksheetFunction. _
Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le résultat est
9:02 au lieu de 9:20

' il faut donc rajouter 9 fois le nb erroné de
minutes pour passer

' de 2 à 20. Une unité représentant 1 jour, il
faut diviser par

' 1440 (24 *60, nb de minutes par jour), pour
ajouter des minutes.

If Dizaine Then
c = c + (Minute(c) * 9) / 1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 10 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub

Je viens de tester ce code (légèrement modifié), sur Excel 98 (MacOS 9.1),
homologue d'Excel 97 sur PC et sur un poste sous Win 98 et Excel 2000.
Semble bien fonctionner dans les 2 cas.

Ensuite, tu pourras faire 3 "Enregistrer sous..." pour avoir les 3 exem-
plaires destinés aux autres postes.


Cher Maître Gaboly,

Un grand merci pour tes explications.

Je dois t'avouer que tu me parles un langage que je vais devoir prendre
du


temps et passer au mois des mois à comprendre ce que tu m'as écrit. Non
sans


mauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encore


et toujours nul en code et formules complexes).

Par contre, je vais essayer de m'y atteler dans les prochaines semaines,
mais je ne garantirais pas les résultats pour le début. Mon soucis,
c'est


que maintenant suivant tes explicatifs, les lignes de codes que tu m'as
données, auront-elles les résultats que je souhaite ?

1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm) selon le
pavé numérique
(donc changement du double point à la place point en ayant le double
point


qui s'inscrit) [est-ce que je me suis bien fait comprendre??]

2. Cette façon de faire, sera t'elle uniquement possible sur le
"Classeur


Excel" et les feuilles qui s'y rapportent, sans être automatiquement
répercutées sur les autres documents?

3. Selon tes explications, mon soucis actuelle vient du fait que tu m'as
embrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP ainsi
que


2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97 avec
Win


98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003 (le
mien)


/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce que
tu


m'as dit avant.

4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour la
version définitive)

Je choisis quoi? Je pensais qu'il suffisait juste "Enregistrer sous....
"


version précédente, pour avoir mes quatre copies de fichiers que
j'installerais par la suite sur les autres PC.

Cher Michel, je réitère encore mes remerciements pour tes lumières.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Bonjour George,

Il y a plusieurs insuffisances de conception : seule une partie
des cas sont traités, et certains remplacement sont faits à
tort (remplacement des ":" par un point si on entre dans une
cellule de la plage A1:A10 du texte comportant un point).

Le principe est que si on sélectionne une cellule (et une seule)
de la plage A1:A10, on modifie les règles de correction automa-
tique pour remplacer le point, "." par deux points, ":".

Les défauts sont les suivants :

Si on sélectionne ensuite une plage de plusieurs cellules, la cor-
rection auto n'est pas annulée, à cause d'une sortie intempestive
de la procédure _SelectionChange() :

If zz.Count > 1 Then Exit Sub

Par ailleurs, si après avoir entré quelque chose dans une cellule
de la plage A1:A10, on sélectionne une autre feuille du même clas-
seur ou un autre classeur, la correction n'est pas non + annulée,
car l'événement SelectionChange ne survient pas. L'événement est
alors Deactivate de la feuille ou du classeur, qui ne sont gérés ni
l'un ni l'autre, celui du classeur devant l'être dans le module
ThisWorkbook.

D'autre part, si on entre une même valeur dans plusieurs cellules
à la fois de la plage A1:A10, un horaire initial comme 9.30 par
exemple, le remplacement n'est pas non + fait, à cause de la même
sortie de la procédure, cette fois dans _Change() :

If zz.Count > 1 Then Exit Sub

Enfin, _SelectionChange() touche à la correction automatique sans
se préoccuper des options antérieures : si sur un poste existe une
correction auto qui remplace le point par une virgule (par exemple),
cette correction sera détruite.


Le plus simple consiste probablement à abandonner :

- La correction automatique, pour ne pas remettre en cause l'exis-
tant, ni l'appliquer à une saisie de texte.

- L'appel à SelectionChange() qui implique de gérer aussi l'événe-
ment Deactivate de la feuille et celui du classeur pour avoir un
résultat correct.


Voici ce que je te propose :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) Then

Application.EnableEvents = False
If IsError(Application.Find(".", c))
Then



c = c & ":" ' Heure entière
Else
c > > > Application.WorksheetFunction.Substitute(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Application.WorksheetFunction.Substitute est utilisé pour des raisons
de



compatibilé avec Excel 97 et les versions Mac (Excel 98 à Excel 2004).

Sur PC, avec Excel 2000 ou + récent, tu peux rempacer Application.
WorksheetFunction.Substitute par Replace, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".", c))
Then



c = c & ":" ' Heure entière
Else
c = Replace(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Tu peux également modifier la procédure en faisant que c'est le point
ou la virgule qui est remplacée, selon le séparateur décimal défini
sur



le poste, ce qui donne (version avec Replace)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sep as string, c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep, c))
Then



c = c & ":" ' Heure entière
Else
c = Replace(c, Sep, ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Malheureusement Application.WorksheetFunction.Substitute (pas
testé avec Replace) traite mal les dizaines de minutes : 9,2 ou 9,20
aboutissent à 9:02.

Une correction s'impose alors. Voici dans ces conditions le contenu
final du module (version avec Application.WorksheetFunction.
Substitute) :

Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c)) Then
c = c & ":" ' Heure entière
MsgBox Sep
Else
CorrectionDizaine c
c > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultat



est 9:02 au lieu de 9:20
' il faut donc rajouter 9 fois le
nb



erroné de minutes pour passer
' de 2 à 20. Une unité
représentant 1



jour, il faut diviser par
' 1440 (24 *60, nb de minutes par
jour), pour ajouter des

' minutes.
If Dizaine Then
c = c + (Minute(c) * 9) /
1440



End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 6 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub


Dis-moi si cela te convient.



Cher Philippe,

voilà que je viens de réessayer de mettre ma macro dans le tableau.
Cela




fonctionne
mais voilà, elle me change aussi la boite de dialogue "Correction
Automatique" (le point en double point).

En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'est




que
cette macro ne soit active que dans la feuille de calcul
sélectionnée et




non
pas dans tous les programmes offices.

devrais-je faire des réglages au niveau des acceptations de macros
dans




outil. Là, je suis complétement perdu.

C'est la deuxième fois que j'enlève dans "Correction automatique"
cette




commande.

Salutations

George

P.S.

AV, cela fait déjà qq jours que je ne le vois plus ici.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
George
re,

je rentre le point pour un point et non une virgule, effectivement j'ai une
adresse suisse. Et
je me suis permis via ton site à t'envoyer un message.


Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.


Il s'agit de mettre une heure quarante-cinq comme ceci

1.45

et le changement donne 1:45

Mais lorsque je mets 3.45 cela me donne vraiment un autre chiffre comme
expliqué précédemment. Un truc avec 5 chiffres et deux points (45896:)

Chose drôle, se résultat n'interagit pas sur le résultat définitif.

Mes paramètres régionaux, sont français suisse, le point pour le point.

Salutations

George


"Michel Gaboly" a écrit dans le message de
news:
Re,

Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.


Si j'ai bien compris, 0.59 doit être converti en 0:59 (59 minutes)
et 1.12 en 1:12 (1 heure 12 minutes).

Si 0:59 équivaut à 59 minutes,
0.70 équivaut à 70 minutes, soit 1 heure 10
0.75 équivaut à 75 minutes, soit 1 heure 15
0.90 équivaut à 90 minutes, soit 1 heure 30
0.10 équivaut à 10 minutes, soit 0 heure 10
...

Par contre, 1.25 donne bien 1:25 chez moi ou + exactement,
1,25 donne 1:25 chez moi, car sur mes machines, le point du
pavé numérique donne une virgule.

Est-ce que cette touche donne une virgule ou un point chez toi ?
Et comment sont réglés tes paramètres régionaus (dans le panneau
de configuration) ?

Enfin, j'aimerais bien comprendre, moi aussi, et j'allais te deman-
der si tu étais en région parisienne, mais je vois que tu as une adresse
suisse.

Tu es dans quelle région ? Je serai dans le Valais la semaine pro-
chaine.



Michel selon le code,

lorsque je rentre les chiffres suivants voici les résultats.

0.10 = 0:10
0.70 = 1:10
0.75 = 1:15
0.90 = 1:30
0.100 = 0:10
1.25 = 45658:

Michel au secours, je fais quoi ?

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Re,

Le Maître est de trop, à moins qu'il soit ironique, ce que j'espère
;-))




1 - Tu devrais avoir l'"ultra simplicité" réclamée.

2 - Le code n'aura d'effet que sur les feuilles dont le module associé
contiendra le code indiqué, rien sur les éventuelles autres feuilles
du ou des classeur(s) concerné(s), ni sur rien d'autre.

3 - La fonction Replace n'est disponible en VBA qu'à partir d'Excel
2000, et uniquement pour les versions Windows. C'est pourquoi
avec Excel 97 ou une version Mac, il faut faire appel à la fonction
SUBSTITUE() disponible dans les feuilles de calcul, à laquelle on
accède ainsi :

Application.WorksheetFunction.Substitute()

qui peut également être utilisée dans les versions ultérieures. La
prin-



cipale raison d'utiliser plutôt Replace est qu'on obtient ainsi un
code +



concis, mais inutilisable avec Excel 97 et Excel Mac.

4 - Pour que le code fonctionne sur les 4 machines, dont 1 sous Excel
97, tu ne peux donc pas utiliser la fonction Replace, ce qui ne
t'empêche



nullement d'avoir une version unique pour les 4 postes. Simplement,
cette version devra utiliser
Application.WorksheetFunction.Substitute()





Copie ceci (qui tient compte de la plage C9:AG30), dans le module
associé



à la feuille concernée. Si plusieurs feuilles sont concernées, le code
doit

être copié dans chacune module associé à l'une des feuilles en
question :





Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, Pos As Integer
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("C9:AG30")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
On Error Resume Next
Pos = Application.WorksheetFunction.Search(Sep, c)
If Pos = 0 And c <> "" Then
c = c & ":" ' Heure entière
Else
CorrectionDizaine c
c = Application.WorksheetFunction. _
Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le résultat est
9:02 au lieu de 9:20

' il faut donc rajouter 9 fois le nb
erroné de



minutes pour passer
' de 2 à 20. Une unité représentant 1
jour, il



faut diviser par
' 1440 (24 *60, nb de minutes par jour),
pour



ajouter des minutes.
If Dizaine Then
c = c + (Minute(c) * 9) / 1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 10 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub

Je viens de tester ce code (légèrement modifié), sur Excel 98 (MacOS
9.1),



homologue d'Excel 97 sur PC et sur un poste sous Win 98 et Excel 2000.
Semble bien fonctionner dans les 2 cas.

Ensuite, tu pourras faire 3 "Enregistrer sous..." pour avoir les 3
exem-



plaires destinés aux autres postes.


Cher Maître Gaboly,

Un grand merci pour tes explications.

Je dois t'avouer que tu me parles un langage que je vais devoir
prendre




du
temps et passer au mois des mois à comprendre ce que tu m'as écrit.
Non




sans
mauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encore


et toujours nul en code et formules complexes).

Par contre, je vais essayer de m'y atteler dans les prochaines
semaines,




mais je ne garantirais pas les résultats pour le début. Mon soucis,
c'est


que maintenant suivant tes explicatifs, les lignes de codes que tu
m'as




données, auront-elles les résultats que je souhaite ?

1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon le




pavé numérique
(donc changement du double point à la place point en ayant le double
point


qui s'inscrit) [est-ce que je me suis bien fait comprendre??]

2. Cette façon de faire, sera t'elle uniquement possible sur le
"Classeur


Excel" et les feuilles qui s'y rapportent, sans être automatiquement
répercutées sur les autres documents?

3. Selon tes explications, mon soucis actuelle vient du fait que tu
m'as




embrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP
ainsi




que
2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97
avec




Win
98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003
(le




mien)
/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce
que




tu
m'as dit avant.

4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour
la




version définitive)

Je choisis quoi? Je pensais qu'il suffisait juste "Enregistrer
sous....




"
version précédente, pour avoir mes quatre copies de fichiers que
j'installerais par la suite sur les autres PC.

Cher Michel, je réitère encore mes remerciements pour tes lumières.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Bonjour George,

Il y a plusieurs insuffisances de conception : seule une partie
des cas sont traités, et certains remplacement sont faits à
tort (remplacement des ":" par un point si on entre dans une
cellule de la plage A1:A10 du texte comportant un point).

Le principe est que si on sélectionne une cellule (et une seule)
de la plage A1:A10, on modifie les règles de correction automa-
tique pour remplacer le point, "." par deux points, ":".

Les défauts sont les suivants :

Si on sélectionne ensuite une plage de plusieurs cellules, la cor-
rection auto n'est pas annulée, à cause d'une sortie intempestive
de la procédure _SelectionChange() :

If zz.Count > 1 Then Exit Sub

Par ailleurs, si après avoir entré quelque chose dans une cellule
de la plage A1:A10, on sélectionne une autre feuille du même clas-
seur ou un autre classeur, la correction n'est pas non + annulée,
car l'événement SelectionChange ne survient pas. L'événement est
alors Deactivate de la feuille ou du classeur, qui ne sont gérés
ni





l'un ni l'autre, celui du classeur devant l'être dans le module
ThisWorkbook.

D'autre part, si on entre une même valeur dans plusieurs cellules
à la fois de la plage A1:A10, un horaire initial comme 9.30 par
exemple, le remplacement n'est pas non + fait, à cause de la même
sortie de la procédure, cette fois dans _Change() :

If zz.Count > 1 Then Exit Sub

Enfin, _SelectionChange() touche à la correction automatique sans
se préoccuper des options antérieures : si sur un poste existe une
correction auto qui remplace le point par une virgule (par
exemple),





cette correction sera détruite.


Le plus simple consiste probablement à abandonner :

- La correction automatique, pour ne pas remettre en cause l'exis-
tant, ni l'appliquer à une saisie de texte.

- L'appel à SelectionChange() qui implique de gérer aussi l'événe-
ment Deactivate de la feuille et celui du classeur pour avoir un
résultat correct.


Voici ce que je te propose :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) Then

Application.EnableEvents = False
If IsError(Application.Find(".",
c))





Then
c = c & ":" ' Heure
entière





Else
c > > > > Application.WorksheetFunction.Substitute(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Application.WorksheetFunction.Substitute est utilisé pour des
raisons





de
compatibilé avec Excel 97 et les versions Mac (Excel 98 à Excel
2004).






Sur PC, avec Excel 2000 ou + récent, tu peux rempacer Application.
WorksheetFunction.Substitute par Replace, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".",
c))





Then
c = c & ":" ' Heure
entière





Else
c = Replace(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Tu peux également modifier la procédure en faisant que c'est le
point





ou la virgule qui est remplacée, selon le séparateur décimal
défini





sur
le poste, ce qui donne (version avec Replace)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sep as string, c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep,
c))





Then
c = c & ":" ' Heure
entière





Else
c = Replace(c, Sep, ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Malheureusement Application.WorksheetFunction.Substitute (pas
testé avec Replace) traite mal les dizaines de minutes : 9,2 ou
9,20





aboutissent à 9:02.

Une correction s'impose alors. Voici dans ces conditions le
contenu





final du module (version avec Application.WorksheetFunction.
Substitute) :

Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Then





c = c & ":" ' Heure
entière





MsgBox Sep
Else
CorrectionDizaine c
c > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultat



est 9:02 au lieu de 9:20
' il faut donc rajouter 9 fois
le





nb
erroné de minutes pour passer
' de 2 à 20. Une unité
représentant 1



jour, il faut diviser par
' 1440 (24 *60, nb de minutes
par





jour), pour ajouter des
' minutes.
If Dizaine Then
c = c + (Minute(c) *
9) /





1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 6 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub


Dis-moi si cela te convient.



Cher Philippe,

voilà que je viens de réessayer de mettre ma macro dans le
tableau.






Cela
fonctionne
mais voilà, elle me change aussi la boite de dialogue
"Correction






Automatique" (le point en double point).

En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'est




que
cette macro ne soit active que dans la feuille de calcul
sélectionnée et




non
pas dans tous les programmes offices.

devrais-je faire des réglages au niveau des acceptations de
macros






dans
outil. Là, je suis complétement perdu.

C'est la deuxième fois que j'enlève dans "Correction
automatique"






cette
commande.

Salutations

George

P.S.

AV, cela fait déjà qq jours que je ne le vois plus ici.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com









Avatar
Michel Gaboly
Re,

Je n'ai pas reçu ton message ;-((

Peux-tu me le renvoyer à l'adresse en enlevant
les 4 lettres "Supp" ? Merci.

Peux-tu copier cette Sub dans un module standard et la lancer :

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

et me dire si c'est un point ou une virgule qui est affiché ?



re,

je rentre le point pour un point et non une virgule, effectivement j'ai une
adresse suisse. Et
je me suis permis via ton site à t'envoyer un message.

Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.


Il s'agit de mettre une heure quarante-cinq comme ceci

1.45

et le changement donne 1:45

Mais lorsque je mets 3.45 cela me donne vraiment un autre chiffre comme
expliqué précédemment. Un truc avec 5 chiffres et deux points (45896:)

Chose drôle, se résultat n'interagit pas sur le résultat définitif.

Mes paramètres régionaux, sont français suisse, le point pour le point.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Re,

Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.


Si j'ai bien compris, 0.59 doit être converti en 0:59 (59 minutes)
et 1.12 en 1:12 (1 heure 12 minutes).

Si 0:59 équivaut à 59 minutes,
0.70 équivaut à 70 minutes, soit 1 heure 10
0.75 équivaut à 75 minutes, soit 1 heure 15
0.90 équivaut à 90 minutes, soit 1 heure 30
0.10 équivaut à 10 minutes, soit 0 heure 10
...

Par contre, 1.25 donne bien 1:25 chez moi ou + exactement,
1,25 donne 1:25 chez moi, car sur mes machines, le point du
pavé numérique donne une virgule.

Est-ce que cette touche donne une virgule ou un point chez toi ?
Et comment sont réglés tes paramètres régionaus (dans le panneau
de configuration) ?

Enfin, j'aimerais bien comprendre, moi aussi, et j'allais te deman-
der si tu étais en région parisienne, mais je vois que tu as une adresse
suisse.

Tu es dans quelle région ? Je serai dans le Valais la semaine pro-
chaine.



Michel selon le code,

lorsque je rentre les chiffres suivants voici les résultats.

0.10 = 0:10
0.70 = 1:10
0.75 = 1:15
0.90 = 1:30
0.100 = 0:10
1.25 = 45658:

Michel au secours, je fais quoi ?

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Re,

Le Maître est de trop, à moins qu'il soit ironique, ce que j'espère
;-))




1 - Tu devrais avoir l'"ultra simplicité" réclamée.

2 - Le code n'aura d'effet que sur les feuilles dont le module associé
contiendra le code indiqué, rien sur les éventuelles autres feuilles
du ou des classeur(s) concerné(s), ni sur rien d'autre.

3 - La fonction Replace n'est disponible en VBA qu'à partir d'Excel
2000, et uniquement pour les versions Windows. C'est pourquoi
avec Excel 97 ou une version Mac, il faut faire appel à la fonction
SUBSTITUE() disponible dans les feuilles de calcul, à laquelle on
accède ainsi :

Application.WorksheetFunction.Substitute()

qui peut également être utilisée dans les versions ultérieures. La
prin-



cipale raison d'utiliser plutôt Replace est qu'on obtient ainsi un
code +



concis, mais inutilisable avec Excel 97 et Excel Mac.

4 - Pour que le code fonctionne sur les 4 machines, dont 1 sous Excel
97, tu ne peux donc pas utiliser la fonction Replace, ce qui ne
t'empêche



nullement d'avoir une version unique pour les 4 postes. Simplement,
cette version devra utiliser
Application.WorksheetFunction.Substitute()





Copie ceci (qui tient compte de la plage C9:AG30), dans le module
associé



à la feuille concernée. Si plusieurs feuilles sont concernées, le code
doit

être copié dans chacune module associé à l'une des feuilles en
question :





Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, Pos As Integer
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("C9:AG30")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
On Error Resume Next
Pos = Application.WorksheetFunction.Search(Sep, c)
If Pos = 0 And c <> "" Then
c = c & ":" ' Heure entière
Else
CorrectionDizaine c
c = Application.WorksheetFunction. _
Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le résultat est
9:02 au lieu de 9:20

' il faut donc rajouter 9 fois le nb
erroné de



minutes pour passer
' de 2 à 20. Une unité représentant 1
jour, il



faut diviser par
' 1440 (24 *60, nb de minutes par jour),
pour



ajouter des minutes.
If Dizaine Then
c = c + (Minute(c) * 9) / 1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 10 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub

Je viens de tester ce code (légèrement modifié), sur Excel 98 (MacOS
9.1),



homologue d'Excel 97 sur PC et sur un poste sous Win 98 et Excel 2000.
Semble bien fonctionner dans les 2 cas.

Ensuite, tu pourras faire 3 "Enregistrer sous..." pour avoir les 3
exem-



plaires destinés aux autres postes.


Cher Maître Gaboly,

Un grand merci pour tes explications.

Je dois t'avouer que tu me parles un langage que je vais devoir
prendre




du
temps et passer au mois des mois à comprendre ce que tu m'as écrit.
Non




sans
mauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encore


et toujours nul en code et formules complexes).

Par contre, je vais essayer de m'y atteler dans les prochaines
semaines,




mais je ne garantirais pas les résultats pour le début. Mon soucis,
c'est


que maintenant suivant tes explicatifs, les lignes de codes que tu
m'as




données, auront-elles les résultats que je souhaite ?

1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon le




pavé numérique
(donc changement du double point à la place point en ayant le double
point


qui s'inscrit) [est-ce que je me suis bien fait comprendre??]

2. Cette façon de faire, sera t'elle uniquement possible sur le
"Classeur


Excel" et les feuilles qui s'y rapportent, sans être automatiquement
répercutées sur les autres documents?

3. Selon tes explications, mon soucis actuelle vient du fait que tu
m'as




embrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP
ainsi




que
2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97
avec




Win
98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003
(le




mien)
/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce
que




tu
m'as dit avant.

4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour
la




version définitive)

Je choisis quoi? Je pensais qu'il suffisait juste "Enregistrer
sous....




"
version précédente, pour avoir mes quatre copies de fichiers que
j'installerais par la suite sur les autres PC.

Cher Michel, je réitère encore mes remerciements pour tes lumières.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Bonjour George,

Il y a plusieurs insuffisances de conception : seule une partie
des cas sont traités, et certains remplacement sont faits à
tort (remplacement des ":" par un point si on entre dans une
cellule de la plage A1:A10 du texte comportant un point).

Le principe est que si on sélectionne une cellule (et une seule)
de la plage A1:A10, on modifie les règles de correction automa-
tique pour remplacer le point, "." par deux points, ":".

Les défauts sont les suivants :

Si on sélectionne ensuite une plage de plusieurs cellules, la cor-
rection auto n'est pas annulée, à cause d'une sortie intempestive
de la procédure _SelectionChange() :

If zz.Count > 1 Then Exit Sub

Par ailleurs, si après avoir entré quelque chose dans une cellule
de la plage A1:A10, on sélectionne une autre feuille du même clas-
seur ou un autre classeur, la correction n'est pas non + annulée,
car l'événement SelectionChange ne survient pas. L'événement est
alors Deactivate de la feuille ou du classeur, qui ne sont gérés
ni





l'un ni l'autre, celui du classeur devant l'être dans le module
ThisWorkbook.

D'autre part, si on entre une même valeur dans plusieurs cellules
à la fois de la plage A1:A10, un horaire initial comme 9.30 par
exemple, le remplacement n'est pas non + fait, à cause de la même
sortie de la procédure, cette fois dans _Change() :

If zz.Count > 1 Then Exit Sub

Enfin, _SelectionChange() touche à la correction automatique sans
se préoccuper des options antérieures : si sur un poste existe une
correction auto qui remplace le point par une virgule (par
exemple),





cette correction sera détruite.


Le plus simple consiste probablement à abandonner :

- La correction automatique, pour ne pas remettre en cause l'exis-
tant, ni l'appliquer à une saisie de texte.

- L'appel à SelectionChange() qui implique de gérer aussi l'événe-
ment Deactivate de la feuille et celui du classeur pour avoir un
résultat correct.


Voici ce que je te propose :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) Then

Application.EnableEvents = False
If IsError(Application.Find(".",
c))





Then
c = c & ":" ' Heure
entière





Else
c > > > > > Application.WorksheetFunction.Substitute(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Application.WorksheetFunction.Substitute est utilisé pour des
raisons





de
compatibilé avec Excel 97 et les versions Mac (Excel 98 à Excel
2004).






Sur PC, avec Excel 2000 ou + récent, tu peux rempacer Application.
WorksheetFunction.Substitute par Replace, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".",
c))





Then
c = c & ":" ' Heure
entière





Else
c = Replace(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Tu peux également modifier la procédure en faisant que c'est le
point





ou la virgule qui est remplacée, selon le séparateur décimal
défini





sur
le poste, ce qui donne (version avec Replace)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sep as string, c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep,
c))





Then
c = c & ":" ' Heure
entière





Else
c = Replace(c, Sep, ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Malheureusement Application.WorksheetFunction.Substitute (pas
testé avec Replace) traite mal les dizaines de minutes : 9,2 ou
9,20





aboutissent à 9:02.

Une correction s'impose alors. Voici dans ces conditions le
contenu





final du module (version avec Application.WorksheetFunction.
Substitute) :

Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is Nothing
Then





If IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Then





c = c & ":" ' Heure
entière





MsgBox Sep
Else
CorrectionDizaine c
c > > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultat



est 9:02 au lieu de 9:20
' il faut donc rajouter 9 fois
le





nb
erroné de minutes pour passer
' de 2 à 20. Une unité
représentant 1



jour, il faut diviser par
' 1440 (24 *60, nb de minutes
par





jour), pour ajouter des
' minutes.
If Dizaine Then
c = c + (Minute(c) *
9) /





1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 6 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub


Dis-moi si cela te convient.



Cher Philippe,

voilà que je viens de réessayer de mettre ma macro dans le
tableau.






Cela
fonctionne
mais voilà, elle me change aussi la boite de dialogue
"Correction






Automatique" (le point en double point).

En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'est




que
cette macro ne soit active que dans la feuille de calcul
sélectionnée et




non
pas dans tous les programmes offices.

devrais-je faire des réglages au niveau des acceptations de
macros






dans
outil. Là, je suis complétement perdu.

C'est la deuxième fois que j'enlève dans "Correction
automatique"






cette
commande.

Salutations

George

P.S.

AV, cela fait déjà qq jours que je ne le vois plus ici.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com







Avatar
George
Re,

cette formule n'a pas l'air de changer quoi que ce soit dans le nouveau
tableau vide ouvert.

J'ai un point en rentrant un point et une virgule en rentrant une virgule.

Si je format ma cellule en [h]:mm

le 2,30 reste 2,30 (a gauche de la cellule)

le 2.30 change en 1140360: mais dans la barre de formule cela me donne le
01.02.2030 00:00:00

je craaaaaaaaque

Salutations

George

P.S.

Message envoyé sur Email
"Michel Gaboly" a écrit dans le message de
news:
Re,

Je n'ai pas reçu ton message ;-((

Peux-tu me le renvoyer à l'adresse en enlevant
les 4 lettres "Supp" ? Merci.

Peux-tu copier cette Sub dans un module standard et la lancer :

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

et me dire si c'est un point ou une virgule qui est affiché ?



re,

je rentre le point pour un point et non une virgule, effectivement j'ai
une


adresse suisse. Et
je me suis permis via ton site à t'envoyer un message.

Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.


Il s'agit de mettre une heure quarante-cinq comme ceci

1.45

et le changement donne 1:45

Mais lorsque je mets 3.45 cela me donne vraiment un autre chiffre comme
expliqué précédemment. Un truc avec 5 chiffres et deux points (45896:)

Chose drôle, se résultat n'interagit pas sur le résultat définitif.

Mes paramètres régionaux, sont français suisse, le point pour le point.

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Re,

Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.


Si j'ai bien compris, 0.59 doit être converti en 0:59 (59 minutes)
et 1.12 en 1:12 (1 heure 12 minutes).

Si 0:59 équivaut à 59 minutes,
0.70 équivaut à 70 minutes, soit 1 heure 10
0.75 équivaut à 75 minutes, soit 1 heure 15
0.90 équivaut à 90 minutes, soit 1 heure 30
0.10 équivaut à 10 minutes, soit 0 heure 10
...

Par contre, 1.25 donne bien 1:25 chez moi ou + exactement,
1,25 donne 1:25 chez moi, car sur mes machines, le point du
pavé numérique donne une virgule.

Est-ce que cette touche donne une virgule ou un point chez toi ?
Et comment sont réglés tes paramètres régionaus (dans le panneau
de configuration) ?

Enfin, j'aimerais bien comprendre, moi aussi, et j'allais te deman-
der si tu étais en région parisienne, mais je vois que tu as une
adresse



suisse.

Tu es dans quelle région ? Je serai dans le Valais la semaine pro-
chaine.



Michel selon le code,

lorsque je rentre les chiffres suivants voici les résultats.

0.10 = 0:10
0.70 = 1:10
0.75 = 1:15
0.90 = 1:30
0.100 = 0:10
1.25 = 45658:

Michel au secours, je fais quoi ?

Salutations

George

"Michel Gaboly" a écrit dans le message de
news:
Re,

Le Maître est de trop, à moins qu'il soit ironique, ce que
j'espère





;-))

1 - Tu devrais avoir l'"ultra simplicité" réclamée.

2 - Le code n'aura d'effet que sur les feuilles dont le module
associé





contiendra le code indiqué, rien sur les éventuelles autres
feuilles





du ou des classeur(s) concerné(s), ni sur rien d'autre.

3 - La fonction Replace n'est disponible en VBA qu'à partir
d'Excel





2000, et uniquement pour les versions Windows. C'est pourquoi
avec Excel 97 ou une version Mac, il faut faire appel à la
fonction





SUBSTITUE() disponible dans les feuilles de calcul, à laquelle on
accède ainsi :

Application.WorksheetFunction.Substitute()

qui peut également être utilisée dans les versions ultérieures. La
prin-



cipale raison d'utiliser plutôt Replace est qu'on obtient ainsi un
code +



concis, mais inutilisable avec Excel 97 et Excel Mac.

4 - Pour que le code fonctionne sur les 4 machines, dont 1 sous
Excel





97, tu ne peux donc pas utiliser la fonction Replace, ce qui ne
t'empêche



nullement d'avoir une version unique pour les 4 postes.
Simplement,





cette version devra utiliser
Application.WorksheetFunction.Substitute()





Copie ceci (qui tient compte de la plage C9:AG30), dans le module
associé



à la feuille concernée. Si plusieurs feuilles sont concernées, le
code





doit
être copié dans chacune module associé à l'une des feuilles en
question :





Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, Pos As Integer
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("C9:AG30")) Is Nothing Then
If IsNumeric(c) Then
Application.EnableEvents = False
On Error Resume Next
Pos Application.WorksheetFunction.Search(Sep, c)
If Pos = 0 And c <> "" Then
c = c & ":" ' Heure entière
Else
CorrectionDizaine c
c = Application.WorksheetFunction. _
Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le résultat
est





9:02 au lieu de 9:20
' il faut donc rajouter 9 fois le nb
erroné de



minutes pour passer
' de 2 à 20. Une unité représentant 1
jour, il



faut diviser par
' 1440 (24 *60, nb de minutes par
jour),





pour
ajouter des minutes.
If Dizaine Then
c = c + (Minute(c) * 9) / 1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 10 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub

Je viens de tester ce code (légèrement modifié), sur Excel 98
(MacOS





9.1),
homologue d'Excel 97 sur PC et sur un poste sous Win 98 et Excel
2000.





Semble bien fonctionner dans les 2 cas.

Ensuite, tu pourras faire 3 "Enregistrer sous..." pour avoir les 3
exem-



plaires destinés aux autres postes.


Cher Maître Gaboly,

Un grand merci pour tes explications.

Je dois t'avouer que tu me parles un langage que je vais devoir
prendre




du
temps et passer au mois des mois à comprendre ce que tu m'as
écrit.






Non
sans
mauvaise volonté, mais que je n'y ai absolument rien compris.
(suis






encore
et toujours nul en code et formules complexes).

Par contre, je vais essayer de m'y atteler dans les prochaines
semaines,




mais je ne garantirais pas les résultats pour le début. Mon
soucis,






c'est
que maintenant suivant tes explicatifs, les lignes de codes que
tu






m'as
données, auront-elles les résultats que je souhaite ?

1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon le




pavé numérique
(donc changement du double point à la place point en ayant le
double






point
qui s'inscrit) [est-ce que je me suis bien fait comprendre??]

2. Cette façon de faire, sera t'elle uniquement possible sur le
"Classeur


Excel" et les feuilles qui s'y rapportent, sans être
automatiquement






répercutées sur les autres documents?

3. Selon tes explications, mon soucis actuelle vient du fait que
tu






m'as
embrouillée sur la compatibilité entre Excel 97 , Excel 2000 et
XP






ainsi
que
2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel
97






avec
Win
98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel
2003






(le
mien)
/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à
ce






que
tu
m'as dit avant.

4. Les cellules auquel se rapportent ce code sont C9 : AG 30
(pour






la
version définitive)

Je choisis quoi? Je pensais qu'il suffisait juste "Enregistrer
sous....




"
version précédente, pour avoir mes quatre copies de fichiers que
j'installerais par la suite sur les autres PC.

Cher Michel, je réitère encore mes remerciements pour tes
lumières.







Salutations

George

"Michel Gaboly" a écrit dans le message
de






news:
Bonjour George,

Il y a plusieurs insuffisances de conception : seule une
partie







des cas sont traités, et certains remplacement sont faits à
tort (remplacement des ":" par un point si on entre dans une
cellule de la plage A1:A10 du texte comportant un point).

Le principe est que si on sélectionne une cellule (et une
seule)







de la plage A1:A10, on modifie les règles de correction
automa-







tique pour remplacer le point, "." par deux points, ":".

Les défauts sont les suivants :

Si on sélectionne ensuite une plage de plusieurs cellules, la
cor-







rection auto n'est pas annulée, à cause d'une sortie
intempestive







de la procédure _SelectionChange() :

If zz.Count > 1 Then Exit Sub

Par ailleurs, si après avoir entré quelque chose dans une
cellule







de la plage A1:A10, on sélectionne une autre feuille du même
clas-







seur ou un autre classeur, la correction n'est pas non +
annulée,







car l'événement SelectionChange ne survient pas. L'événement
est







alors Deactivate de la feuille ou du classeur, qui ne sont
gérés







ni
l'un ni l'autre, celui du classeur devant l'être dans le
module







ThisWorkbook.

D'autre part, si on entre une même valeur dans plusieurs
cellules







à la fois de la plage A1:A10, un horaire initial comme 9.30
par







exemple, le remplacement n'est pas non + fait, à cause de la
même







sortie de la procédure, cette fois dans _Change() :

If zz.Count > 1 Then Exit Sub

Enfin, _SelectionChange() touche à la correction automatique
sans







se préoccuper des options antérieures : si sur un poste existe
une







correction auto qui remplace le point par une virgule (par
exemple),





cette correction sera détruite.


Le plus simple consiste probablement à abandonner :

- La correction automatique, pour ne pas remettre en cause
l'exis-







tant, ni l'appliquer à une saisie de texte.

- L'appel à SelectionChange() qui implique de gérer aussi
l'événe-







ment Deactivate de la feuille et celui du classeur pour avoir
un







résultat correct.


Voici ce que je te propose :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is
Nothing







Then
If
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", ""))

Then






Application.EnableEvents = False
If
IsError(Application.Find(".",







c))
Then
c = c & ":" ' Heure
entière





Else
c > > > > > > Application.WorksheetFunction.Substitute(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Application.WorksheetFunction.Substitute est utilisé pour des
raisons





de
compatibilé avec Excel 97 et les versions Mac (Excel 98 à
Excel







2004).

Sur PC, avec Excel 2000 ou + récent, tu peux rempacer
Application.







WorksheetFunction.Substitute par Replace, ce qui donne :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is
Nothing







Then
If IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If
IsError(Application.Find(".",







c))
Then
c = c & ":" ' Heure
entière





Else
c = Replace(c, ".", ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Tu peux également modifier la procédure en faisant que c'est
le







point
ou la virgule qui est remplacée, selon le séparateur décimal
défini





sur
le poste, ce qui donne (version avec Replace)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sep as string, c As Range
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is
Nothing







Then
If IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If
IsError(Application.Find(Sep,







c))
Then
c = c & ":" ' Heure
entière





Else
c = Replace(c, Sep, ":")
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub


Malheureusement Application.WorksheetFunction.Substitute (pas
testé avec Replace) traite mal les dizaines de minutes : 9,2
ou







9,20
aboutissent à 9:02.

Une correction s'impose alors. Voici dans ces conditions le
contenu





final du module (version avec Application.WorksheetFunction.
Substitute) :

Option Explicit
Dim Sep As String, Dizaine As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Sep = Application.International(xlDecimalSeparator)
For Each c In Target
If Not Intersect(c, Range("A1:A10")) Is
Nothing







Then
If IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Then





c = c & ":" ' Heure
entière





MsgBox Sep
Else
CorrectionDizaine c
c > > > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20,
le







résultat
est 9:02 au lieu de 9:20
' il faut donc rajouter 9
fois







le
nb
erroné de minutes pour passer
' de 2 à 20. Une unité
représentant 1



jour, il faut diviser par
' 1440 (24 *60, nb de
minutes







par
jour), pour ajouter des
' minutes.
If Dizaine Then
c = c + (Minute(c)
*







9) /
1440
End If
End If
Application.EnableEvents = True
End If
End If
Next c
End Sub

Private Sub CorrectionDizaine(c As Range)
Dim Pos As Integer, Minutes As Long
Dizaine = False
Pos = Application.WorksheetFunction.Search(Sep, c)
Minutes = Mid(c, Pos + 1, 99)
If Minutes <= 6 And Mid(c, Pos + 1, 1) <> 0 Then
Dizaine = True
End If
End Sub


Dis-moi si cela te convient.



Cher Philippe,

voilà que je viens de réessayer de mettre ma macro dans le
tableau.






Cela
fonctionne
mais voilà, elle me change aussi la boite de dialogue
"Correction






Automatique" (le point en double point).

En fait ce n'est pas ce que je voudrais, le truc que je
voudrais








c'est
que
cette macro ne soit active que dans la feuille de calcul
sélectionnée et




non
pas dans tous les programmes offices.

devrais-je faire des réglages au niveau des acceptations de
macros






dans
outil. Là, je suis complétement perdu.

C'est la deuxième fois que j'enlève dans "Correction
automatique"






cette
commande.

Salutations

George

P.S.

AV, cela fait déjà qq jours que je ne le vois plus ici.


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com











Avatar
George
Je viens de réessayer de faire un mail,
mais j'ai commencé à remarquer que mon adresse mail est saturé au niveau du
serveur.
(serveur bloqué) En plus cette nuit ils vont faire des travaux sur les
serveurs mails.

Je proposais de t'envoyer une copie du tableau comme ça tu vois à quoi cela
sert.

(milles excuses, je n'y connais rien en vba. moi, j'ai fait clic droit sur
l'onglet de la feuille et je l'ai inséré)

Salutations

George.

P.s.

suite demain, bonne nuit

"Michel Gaboly" a écrit dans le message de
news:
Re,

Le code que je viens de t'indiquer

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

n'a pas pour objet de modifier quoi que ce soit quand tu entres quelque
chose dans une feuuille de calcul, mais de me renseigner sur ce que VBA
trouve comme séparateur décimal sur ta machine.

Ce que je te demandais était d'entrer ce code dans un module standard et
de le lancer, c'est-à-dire en restant dans l'environnement VBA, de choisir
la commande "Exécuter Sub UserForm" du menu "Exécution", commande
qui a pour raccourci clavier F5.

Ce court programme doit afficher un point ou une virgule selon ce que VBA
trouve dans les paramètres régionaux.

Ce que je voulais savoir, c'est si c'est un point ou une virgule qui
s'affiche.


Il n'y a rien à faire dans l'environnement Excel ; tout se passe dans
l'envi-

ronnement VBA.

PS - Je n'ai toujours pas reçu de messafe de toi dans ma Bal ;-((



Re,

cette formule n'a pas l'air de changer quoi que ce soit dans le nouveau
tableau vide ouvert.

J'ai un point en rentrant un point et une virgule en rentrant une
virgule.



Si je format ma cellule en [h]:mm

le 2,30 reste 2,30 (a gauche de la cellule)

le 2.30 change en 1140360: mais dans la barre de formule cela me donne
le


01.02.2030 00:00:00

je craaaaaaaaque

Salutations

George

P.S.

Message envoyé sur Email
"Michel Gaboly" a écrit dans le message de
news:
Re,

Je n'ai pas reçu ton message ;-((

Peux-tu me le renvoyer à l'adresse en enlevant
les 4 lettres "Supp" ? Merci.

Peux-tu copier cette Sub dans un module standard et la lancer :

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

et me dire si c'est un point ou une virgule qui est affiché ?






--
Cordialement,

Michel Gaboly
http://www.gaboly.com






Avatar
Michel Gaboly
Re,

Le code que je viens de t'indiquer

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

n'a pas pour objet de modifier quoi que ce soit quand tu entres quelque
chose dans une feuuille de calcul, mais de me renseigner sur ce que VBA
trouve comme séparateur décimal sur ta machine.

Ce que je te demandais était d'entrer ce code dans un module standard et
de le lancer, c'est-à-dire en restant dans l'environnement VBA, de choisir
la commande "Exécuter Sub UserForm" du menu "Exécution", commande
qui a pour raccourci clavier F5.

Ce court programme doit afficher un point ou une virgule selon ce que VBA
trouve dans les paramètres régionaux.

Ce que je voulais savoir, c'est si c'est un point ou une virgule qui s'affiche.

Il n'y a rien à faire dans l'environnement Excel ; tout se passe dans l'envi-
ronnement VBA.

PS - Je n'ai toujours pas reçu de messafe de toi dans ma Bal ;-((



Re,

cette formule n'a pas l'air de changer quoi que ce soit dans le nouveau
tableau vide ouvert.

J'ai un point en rentrant un point et une virgule en rentrant une virgule.

Si je format ma cellule en [h]:mm

le 2,30 reste 2,30 (a gauche de la cellule)

le 2.30 change en 1140360: mais dans la barre de formule cela me donne le
01.02.2030 00:00:00

je craaaaaaaaque

Salutations

George

P.S.

Message envoyé sur Email
"Michel Gaboly" a écrit dans le message de
news:
Re,

Je n'ai pas reçu ton message ;-((

Peux-tu me le renvoyer à l'adresse en enlevant
les 4 lettres "Supp" ? Merci.

Peux-tu copier cette Sub dans un module standard et la lancer :

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

et me dire si c'est un point ou une virgule qui est affiché ?






--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
George
Message mail parti à 22.31


"Michel Gaboly" a écrit dans le message de
news:
Re,

Le code que je viens de t'indiquer

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

n'a pas pour objet de modifier quoi que ce soit quand tu entres quelque
chose dans une feuuille de calcul, mais de me renseigner sur ce que VBA
trouve comme séparateur décimal sur ta machine.

Ce que je te demandais était d'entrer ce code dans un module standard et
de le lancer, c'est-à-dire en restant dans l'environnement VBA, de choisir
la commande "Exécuter Sub UserForm" du menu "Exécution", commande
qui a pour raccourci clavier F5.

Ce court programme doit afficher un point ou une virgule selon ce que VBA
trouve dans les paramètres régionaux.

Ce que je voulais savoir, c'est si c'est un point ou une virgule qui
s'affiche.


Il n'y a rien à faire dans l'environnement Excel ; tout se passe dans
l'envi-

ronnement VBA.

PS - Je n'ai toujours pas reçu de messafe de toi dans ma Bal ;-((



Re,

cette formule n'a pas l'air de changer quoi que ce soit dans le nouveau
tableau vide ouvert.

J'ai un point en rentrant un point et une virgule en rentrant une
virgule.



Si je format ma cellule en [h]:mm

le 2,30 reste 2,30 (a gauche de la cellule)

le 2.30 change en 1140360: mais dans la barre de formule cela me donne
le


01.02.2030 00:00:00

je craaaaaaaaque

Salutations

George

P.S.

Message envoyé sur Email
"Michel Gaboly" a écrit dans le message de
news:
Re,

Je n'ai pas reçu ton message ;-((

Peux-tu me le renvoyer à l'adresse en enlevant
les 4 lettres "Supp" ? Merci.

Peux-tu copier cette Sub dans un module standard et la lancer :

Sub SeparateurDecimal()
Dim Sep As String
Sep = Application.International(xlDecimalSeparator)
MsgBox Sep
End Sub

et me dire si c'est un point ou une virgule qui est affiché ?






--
Cordialement,

Michel Gaboly
http://www.gaboly.com






Avatar
Frédéric Sigonneau
Bonsoir,

Mes 2 centimes au passage..
Pour saisir des heures au pavé numérique, j'utilise personnellement, et
quotidiennement depuis des années, la correction automatique suivante :
Remplacer ,,
Par :
Quand tu saisis les virgules dans la zone Remplacer, il faut saisir de vraies
virgules avec la touche du clavier alphanumérique et non la virgule/point du
pavé numérique.
De plus, les corrections auto s'appliquant, semble-t-il, dans toutes les
applications Office, il est prudent de prévoir aussi une autre corrction
automatique :
Remplacer :,
Par ...
pour autoriser les points de suspension dans Word (ou même à l'occasion dans
Excel !).

Voilà. Ensuite tu peux saisir des heures en tapant au pavé numérique par exemple
12..25
qui se transforme automatiquement en 12:25.
C'est un petit peu plus long que ce que tu souhaites (1 caractère de plus à
taper, je suis bien placé pour savoir que ce n'est pas négligeable à la fin de
la journée), mais c'est sans effets secondaires...

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


Hello a tous.

Il y a qq temps, j'ai reçu pour faire un tableau, un code à insérer.

Jusqu'à hier, et multiples changements dans mon tableau (pas le code), je
n'avais aucun problème.

Ce code sert principalement à changer le format 3.30 en 3: 30 (format
horaire)

Mais voilà.

J'ai envoyé cette feuille Excel et je l'ai reçue en retour sans le code.
J'ai trouvé judicieux de le remettre, mais voilà. Toutes mes pages excels me
changent le "." en ":"

Mais à la base, cette action n'aurait dû être active que sur une seule
feuille et non tout Excel.

Qui pourrait m'aider à trouver une solution pour corriger mon erreur.

Salutations et merci à tous.

George




1 2 3