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, ".", "")) ThenApplication.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
quecette macro ne soit active que dans la feuille de calcul
sélectionnée et
nonpas 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
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41232A89.CBD8C903@Suppgaboly.com...
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
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, ".", "")) ThenApplication.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
quecette macro ne soit active que dans la feuille de calcul
sélectionnée et
nonpas 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
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, ".", "")) ThenApplication.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
quecette macro ne soit active que dans la feuille de calcul
sélectionnée et
nonpas 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
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41232A89.CBD8C903@Suppgaboly.com...
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
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, ".", "")) ThenApplication.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
quecette macro ne soit active que dans la feuille de calcul
sélectionnée et
nonpas 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
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
dutemps et passer au mois des mois à comprendre ce que tu m'as écrit. Non
sansmauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encoreet 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'estque 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
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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
que2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97 avec
Win98 / 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
tum'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, ".", "")) ThenApplication.EnableEvents = False
If IsError(Application.Find(".", c))
Thenc = 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
decompatibilé 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))
Thenc = 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
surle 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))
Thenc = 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ésultatest 9:02 au lieu de 9:20' il faut donc rajouter 9 fois le
nberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de minutes par
jour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c) * 9) /
1440End 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.
Celafonctionne
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'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de macros
dansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction automatique"
cettecommande.
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
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41234E7B.383729A5@Suppgaboly.com...
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41232A89.CBD8C903@Suppgaboly.com...
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
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
dutemps et passer au mois des mois à comprendre ce que tu m'as écrit. Non
sansmauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encoreet 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'estque 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
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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
que2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97 avec
Win98 / 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
tum'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, ".", "")) ThenApplication.EnableEvents = False
If IsError(Application.Find(".", c))
Thenc = 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
decompatibilé 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))
Thenc = 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
surle 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))
Thenc = 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ésultatest 9:02 au lieu de 9:20' il faut donc rajouter 9 fois le
nberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de minutes par
jour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c) * 9) /
1440End 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.
Celafonctionne
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'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de macros
dansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction automatique"
cettecommande.
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
Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.
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
dutemps et passer au mois des mois à comprendre ce que tu m'as écrit.
Non
sansmauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encoreet 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'estque 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
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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
que2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97
avec
Win98 / 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
tum'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, ".", "")) ThenApplication.EnableEvents = False
If IsError(Application.Find(".",
c))
Thenc = 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
decompatibilé 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))
Thenc = 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
surle 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))
Thenc = 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ésultatest 9:02 au lieu de 9:20' il faut donc rajouter 9 fois
le
nberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de minutes
par
jour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c) *
9) /
1440End 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.
Celafonctionne
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'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de
macros
dansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction
automatique"
cettecommande.
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
Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41234E7B.383729A5@Suppgaboly.com...
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41232A89.CBD8C903@Suppgaboly.com...
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
Dans le code que je t'ai proposé, la saisie est prévue en heures et
minutes.
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
dutemps et passer au mois des mois à comprendre ce que tu m'as écrit.
Non
sansmauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encoreet 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'estque 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
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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
que2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97
avec
Win98 / 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
tum'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, ".", "")) ThenApplication.EnableEvents = False
If IsError(Application.Find(".",
c))
Thenc = 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
decompatibilé 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))
Thenc = 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
surle 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))
Thenc = 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ésultatest 9:02 au lieu de 9:20' il faut donc rajouter 9 fois
le
nberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de minutes
par
jour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c) *
9) /
1440End 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.
Celafonctionne
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'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de
macros
dansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction
automatique"
cettecommande.
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
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êchenullement 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é deminutes pour passer' de 2 à 20. Une unité représentant 1
jour, ilfaut diviser par' 1440 (24 *60, nb de minutes par jour),
pourajouter 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
prendredutemps et passer au mois des mois à comprendre ce que tu m'as écrit.
Nonsansmauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encoreet 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'estque maintenant suivant tes explicatifs, les lignes de codes que tu
m'asdonnées, auront-elles les résultats que je souhaite ?
1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon lepavé numérique
(donc changement du double point à la place point en ayant le double
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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'asembrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP
ainsique2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97
avecWin98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003
(lemien)/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce
quetum'as dit avant.
4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour
laversion 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
nil'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
ThenIf
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) ThenApplication.EnableEvents = False
If IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
raisonsdecompatibilé 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
ThenIf IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
pointou la virgule qui est remplacée, selon le séparateur décimal
définisurle 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
ThenIf IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep,
c))Thenc = c & ":" ' Heure
entièreElse
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,20aboutissent à 9:02.
Une correction s'impose alors. Voici dans ces conditions le
contenufinal 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
ThenIf IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Thenc = c & ":" ' Heure
entièreMsgBox Sep
Else
CorrectionDizaine c
c > > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultatest 9:02 au lieu de 9:20' il faut donc rajouter 9 fois
lenberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de minutes
parjour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c) *
9) /1440End 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.Celafonctionne
mais voilà, elle me change aussi la boite de dialogue
"CorrectionAutomatique" (le point en double point).
En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de
macrosdansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction
automatique"cettecommande.
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
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41237FA7.295A4687@Suppgaboly.com...
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41234E7B.383729A5@Suppgaboly.com...
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41232A89.CBD8C903@Suppgaboly.com...
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
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êchenullement 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é deminutes pour passer' de 2 à 20. Une unité représentant 1
jour, ilfaut diviser par' 1440 (24 *60, nb de minutes par jour),
pourajouter 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
prendredutemps et passer au mois des mois à comprendre ce que tu m'as écrit.
Nonsansmauvaise volonté, mais que je n'y ai absolument rien compris. (suis
encoreet 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'estque maintenant suivant tes explicatifs, les lignes de codes que tu
m'asdonnées, auront-elles les résultats que je souhaite ?
1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon lepavé numérique
(donc changement du double point à la place point en ayant le double
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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'asembrouillée sur la compatibilité entre Excel 97 , Excel 2000 et XP
ainsique2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel 97
avecWin98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel 2003
(lemien)/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à ce
quetum'as dit avant.
4. Les cellules auquel se rapportent ce code sont C9 : AG 30 (pour
laversion 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
nil'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
ThenIf
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", "")) ThenApplication.EnableEvents = False
If IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
raisonsdecompatibilé 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
ThenIf IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
pointou la virgule qui est remplacée, selon le séparateur décimal
définisurle 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
ThenIf IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If IsError(Application.Find(Sep,
c))Thenc = c & ":" ' Heure
entièreElse
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,20aboutissent à 9:02.
Une correction s'impose alors. Voici dans ces conditions le
contenufinal 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
ThenIf IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Thenc = c & ":" ' Heure
entièreMsgBox Sep
Else
CorrectionDizaine c
c > > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20, le
résultatest 9:02 au lieu de 9:20' il faut donc rajouter 9 fois
lenberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de minutes
parjour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c) *
9) /1440End 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.Celafonctionne
mais voilà, elle me change aussi la boite de dialogue
"CorrectionAutomatique" (le point en double point).
En fait ce n'est pas ce que je voudrais, le truc que je voudrais
c'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de
macrosdansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction
automatique"cettecommande.
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
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êchenullement 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é deminutes pour passer' de 2 à 20. Une unité représentant 1
jour, ilfaut diviser par' 1440 (24 *60, nb de minutes par
jour),
pourajouter 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
prendredutemps et passer au mois des mois à comprendre ce que tu m'as
écrit.
Nonsansmauvaise volonté, mais que je n'y ai absolument rien compris.
(suis
encoreet 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'estque maintenant suivant tes explicatifs, les lignes de codes que
tu
m'asdonnées, auront-elles les résultats que je souhaite ?
1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon lepavé numérique
(donc changement du double point à la place point en ayant le
double
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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'asembrouillée sur la compatibilité entre Excel 97 , Excel 2000 et
XP
ainsique2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel
97
avecWin98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel
2003
(lemien)/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à
ce
quetum'as dit avant.
4. Les cellules auquel se rapportent ce code sont C9 : AG 30
(pour
laversion 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
nil'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
ThenIf
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", ""))
Then
Application.EnableEvents = False
If
IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
raisonsdecompatibilé 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
ThenIf IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If
IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
pointou la virgule qui est remplacée, selon le séparateur décimal
définisurle 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
ThenIf IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If
IsError(Application.Find(Sep,
c))Thenc = c & ":" ' Heure
entièreElse
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,20aboutissent à 9:02.
Une correction s'impose alors. Voici dans ces conditions le
contenufinal 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
ThenIf IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Thenc = c & ":" ' Heure
entièreMsgBox Sep
Else
CorrectionDizaine c
c > > > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20,
le
résultatest 9:02 au lieu de 9:20' il faut donc rajouter 9
fois
lenberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de
minutes
parjour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c)
*
9) /1440End 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.Celafonctionne
mais voilà, elle me change aussi la boite de dialogue
"CorrectionAutomatique" (le point en double point).
En fait ce n'est pas ce que je voudrais, le truc que je
voudrais
c'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de
macrosdansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction
automatique"cettecommande.
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
Re,
Je n'ai pas reçu ton message ;-((
Peux-tu me le renvoyer à l'adresse michel@Suppgaboly.com 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" <michel@Suppgaboly.com> a écrit dans le message de
news:41237FA7.295A4687@Suppgaboly.com...
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41234E7B.383729A5@Suppgaboly.com...
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" <michel@Suppgaboly.com> a écrit dans le message
de
news:41232A89.CBD8C903@Suppgaboly.com...
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
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êchenullement 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é deminutes pour passer' de 2 à 20. Une unité représentant 1
jour, ilfaut diviser par' 1440 (24 *60, nb de minutes par
jour),
pourajouter 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
prendredutemps et passer au mois des mois à comprendre ce que tu m'as
écrit.
Nonsansmauvaise volonté, mais que je n'y ai absolument rien compris.
(suis
encoreet 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'estque maintenant suivant tes explicatifs, les lignes de codes que
tu
m'asdonnées, auront-elles les résultats que je souhaite ?
1. Ultra simplicité pour saisir, les chiffres horaires ([h]:mm)
selon lepavé numérique
(donc changement du double point à la place point en ayant le
double
pointqui s'inscrit) [est-ce que je me suis bien fait comprendre??]
2. Cette façon de faire, sera t'elle uniquement possible sur le
"ClasseurExcel" 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'asembrouillée sur la compatibilité entre Excel 97 , Excel 2000 et
XP
ainsique2003.
(ce fichier serait utilisable sur 4 pc différents: 1. sous Excel
97
avecWin98 / 2. sous Excel XP avec Win Xp / 3. sous win2k avec Excel
2003
(lemien)/ 4. sous win2k avec Excel 2000 ) snif !!!! gros soucis suite à
ce
quetum'as dit avant.
4. Les cellules auquel se rapportent ce code sont C9 : AG 30
(pour
laversion 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
nil'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
ThenIf
IsNumeric(Application.WorksheetFunction.Substitute(c, ".", ""))
Then
Application.EnableEvents = False
If
IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
raisonsdecompatibilé 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
ThenIf IsNumeric(Replace(c, ".", "")) Then
Application.EnableEvents = False
If
IsError(Application.Find(".",
c))Thenc = c & ":" ' Heure
entièreElse
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
pointou la virgule qui est remplacée, selon le séparateur décimal
définisurle 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
ThenIf IsNumeric(Replace(c, Sep, "")) Then
Application.EnableEvents = False
If
IsError(Application.Find(Sep,
c))Thenc = c & ":" ' Heure
entièreElse
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,20aboutissent à 9:02.
Une correction s'impose alors. Voici dans ces conditions le
contenufinal 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
ThenIf IsNumeric(c) Then
Application.EnableEvents = False
If IsError(Cells.Find(Sep, c))
Thenc = c & ":" ' Heure
entièreMsgBox Sep
Else
CorrectionDizaine c
c > > > > > > Application.WorksheetFunction.Substitute(c, Sep, ":")
' Si on entre 9,2 ou 9,20,
le
résultatest 9:02 au lieu de 9:20' il faut donc rajouter 9
fois
lenberroné de minutes pour passer' de 2 à 20. Une unité
représentant 1jour, il faut diviser par' 1440 (24 *60, nb de
minutes
parjour), pour ajouter des' minutes.
If Dizaine Then
c = c + (Minute(c)
*
9) /1440End 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.Celafonctionne
mais voilà, elle me change aussi la boite de dialogue
"CorrectionAutomatique" (le point en double point).
En fait ce n'est pas ce que je voudrais, le truc que je
voudrais
c'estquecette macro ne soit active que dans la feuille de calcul
sélectionnée etnonpas dans tous les programmes offices.
devrais-je faire des réglages au niveau des acceptations de
macrosdansoutil. Là, je suis complétement perdu.
C'est la deuxième fois que j'enlève dans "Correction
automatique"cettecommande.
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
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
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41239FF5.4B6BF516@Suppgaboly.com...
Re,
Je n'ai pas reçu ton message ;-((
Peux-tu me le renvoyer à l'adresse michel@Suppgaboly.com 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
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
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,
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41239FF5.4B6BF516@Suppgaboly.com...
Re,
Je n'ai pas reçu ton message ;-((
Peux-tu me le renvoyer à l'adresse michel@Suppgaboly.com 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,
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,
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
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" <michel@Suppgaboly.com> a écrit dans le message de
news:41239FF5.4B6BF516@Suppgaboly.com...
Re,
Je n'ai pas reçu ton message ;-((
Peux-tu me le renvoyer à l'adresse michel@Suppgaboly.com 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
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
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
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
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