OVH Cloud OVH Cloud

SetFocus inopérant

7 réponses
Avatar
Michel Gaboly
Bonjour à tous,

Depuis des années, j'emploie une fonction qui me permet de vérifier les
saisies au sein d'un UserForm :

Function Controle(ByVal Expression As Boolean, Optional ComplTexte,
Optional CellActive, _
Optional TexteMessage, Optional VideoInverse As Boolean, Optional ByRef
ControleUnique)
Dim Code As Integer
If Not IsMissing(ControleUnique) Then
If ControleUnique Then
Exit Function
End If
End If
' Test si anomalie
If Expression Then
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas indiqué " & ComplTexte
End If
' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente selon que l'info
manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou manquante"
End If
' Sélection de l'info à modifier
If VideoInverse And Not IsMissing(CellActive) Then
CellActive.SelStart = 0
CellActive.SelLength = Len(CellActive)
End If
' MAJ Contrôle déjà effectué
If Not IsMissing(ControleUnique) And Not Expression Then
ControleUnique = True
End If
' Résultat du contrôle
If Expression Then Controle = False Else Controle = True
End Function


Le code est commenté ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html


Pour certains éléments, une procédure événementielle suffit à s'assurer
que l'info fournie est correcte. Mais une autre méthode est nécessaire
pour vérifier que toutes les infos attendues ont été saisies, ou
qu'elles sont cohérentes.

Voici par exemple le code associé au bouton OK d'un UserForm contenant
2 TextBox, TNom et TAdresseMail.


Private Sub CommandButton1_Click()
ControleSaisie
ReportDonnees
If Resultat Then
Unload Me
End If
End Sub

Private Sub ControleSaisie()
Resultat = Controle(TNom = "", "le nom.", TNom)
If Resultat Then Resultat = Controle(TAdresseMail = "", "l'adresse
e-mail.", TAdresseMail)
End Sub

Private Sub ReportDonnées
' Traitement sans incidence ici
End Sub

7 réponses

Avatar
Michel Gaboly
Re,

Désolé, fausse manip ;-((.
Voici le message complet :


Bonjour à tous,

Depuis des années, j'emploie une fonction qui me permet de vérifier les
saisies au sein d'un UserForm :


Function Controle(ByVal Expression As Boolean, Optional ComplTexte,
Optional CellActive, _
Optional TexteMessage, Optional VideoInverse As Boolean, Optional ByRef
ControleUnique)
Dim Code As Integer
If Not IsMissing(ControleUnique) Then
If ControleUnique Then
Exit Function
End If
End If
' Test si anomalie
If Expression Then
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas indiqué " & ComplTexte
End If
' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente selon que l'info
manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou manquante"
End If
' Sélection de l'info à modifier
If VideoInverse And Not IsMissing(CellActive) Then
CellActive.SelStart = 0
CellActive.SelLength = Len(CellActive)
End If
' MAJ Contrôle déjà effectué
If Not IsMissing(ControleUnique) And Not Expression Then
ControleUnique = True
End If
' Résultat du contrôle
If Expression Then Controle = False Else Controle = True
End Function


Le code est commenté ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html


Pour certains éléments, une procédure événementielle suffit à s'assurer
que l'info fournie est correcte. Mais une autre méthode est nécessaire
pour vérifier que toutes les infos attendues ont été saisies, ou
qu'elles sont cohérentes.


Voici par exemple le code associé au bouton OK d'un UserForm contenant
2 TextBox, TNom et TAdresseMail.

Private Sub BOK_Click()
ControleSaisie
ReportDonnees
If Resultat Then
Unload Me
End If
End Sub

Private Sub ControleSaisie()
Resultat = Controle(TNom = "", "le nom.", TNom)
If Resultat Then Resultat = Controle(TAdresseMail = "", "l'adresse
e-mail.", TAdresseMail)
End Sub

Private Sub ReportDonnées
' Traitement sans incidence ici
End Sub


Si TNom (ou TAdresseMail pour le second) est égal à ""

le message

"Vous n'avez pas indiqué le nom*."

* (ou l'adresse e-mail pour le second TextBox)

est affiché, et

CellActive.SetFocus

replace en principe le curseur dans TNom (ou TAdresseMail).


Depuis quelque temps, SetFocus ne fonctionne plus qu'à moitié ;-(( :
le controle actif est le bon, celui passé comme 3ème argument à la
fonction Controle, ce qu'on peut vérifier avec un Debug.Print
ActiveControl, mais le curseur n'y clignote pas et rien ne se produit si
on entre quelque chose au clavier.

Je n'ai pas changé de version d'Excel (2000), et le problème survient
sur plusieurs machines (Win NT et XP, y compris un Mac sur lequel je
fais tourner Excel 2000 sous Win XP Pro grâce à l'émulateur Virtual PC.

Si quelqu'un a une idée de pourquoi ce code qui a fonctionné pendant des
années ne marche plus, j'en serais ravi.


NB - Le code ci-dessous

Private Sub BOK_Click()
TNom.SetFocus
End Sub

fonctionne parfaitement.


En attendant, joyeuses fêtes à tous, et bonne année.


Michel Gaboly
www.gaboly.com
Avatar
verificator
bonjour Michel,

il me semble que le MsgBox soit la cause du problème.
Chez moi (XL2000, WinXP) si je le supprime, ça marche,
sinon le focus ne revient jamais sur le TextBox à
renseigner.
Ce qui m'étonne, c'est que ça marchait auparavant chez
toi.

Désolé de ne pas faire avancer davantage le schmilblick,
mais te souhaite (à tous d'ailleurs) une joyeuse fin de
Xmas.

-----Original Message-----
Re,

Désolé, fausse manip ;-((.
Voici le message complet :


Bonjour à tous,

Depuis des années, j'emploie une fonction qui me permet
de vérifier les

saisies au sein d'un UserForm :


Function Controle(ByVal Expression As Boolean, Optional
ComplTexte,

Optional CellActive, _
Optional TexteMessage, Optional VideoInverse As Boolean,
Optional ByRef

ControleUnique)
Dim Code As Integer
If Not IsMissing(ControleUnique) Then
If ControleUnique Then
Exit Function
End If
End If
' Test si anomalie
If Expression Then
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas
indiqué " & ComplTexte

End If
' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente
selon que l'info

manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou
manquante"

End If
' Sélection de l'info à modifier
If VideoInverse And Not IsMissing(CellActive)
Then

CellActive.SelStart = 0
CellActive.SelLength = Len(CellActive)
End If
' MAJ Contrôle déjà effectué
If Not IsMissing(ControleUnique) And Not
Expression Then

ControleUnique = True
End If
' Résultat du contrôle
If Expression Then Controle = False Else Controle =
True

End Function


Le code est commenté ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html


Pour certains éléments, une procédure événementielle
suffit à s'assurer

que l'info fournie est correcte. Mais une autre méthode
est nécessaire

pour vérifier que toutes les infos attendues ont été
saisies, ou

qu'elles sont cohérentes.


Voici par exemple le code associé au bouton OK d'un
UserForm contenant

2 TextBox, TNom et TAdresseMail.

Private Sub BOK_Click()
ControleSaisie
ReportDonnees
If Resultat Then
Unload Me
End If
End Sub

Private Sub ControleSaisie()
Resultat = Controle(TNom = "", "le nom.", TNom)
If Resultat Then Resultat = Controle(TAdresseMail
= "", "l'adresse

e-mail.", TAdresseMail)
End Sub

Private Sub ReportDonnées
' Traitement sans incidence ici
End Sub


Si TNom (ou TAdresseMail pour le second) est égal à ""

le message

"Vous n'avez pas indiqué le nom*."

* (ou l'adresse e-mail pour le second TextBox)

est affiché, et

CellActive.SetFocus

replace en principe le curseur dans TNom (ou
TAdresseMail).



Depuis quelque temps, SetFocus ne fonctionne plus qu'à
moitié ;-(( :

le controle actif est le bon, celui passé comme 3ème
argument à la

fonction Controle, ce qu'on peut vérifier avec un
Debug.Print

ActiveControl, mais le curseur n'y clignote pas et rien
ne se produit si

on entre quelque chose au clavier.

Je n'ai pas changé de version d'Excel (2000), et le
problème survient

sur plusieurs machines (Win NT et XP, y compris un Mac
sur lequel je

fais tourner Excel 2000 sous Win XP Pro grâce à
l'émulateur Virtual PC.


Si quelqu'un a une idée de pourquoi ce code qui a
fonctionné pendant des

années ne marche plus, j'en serais ravi.


NB - Le code ci-dessous

Private Sub BOK_Click()
TNom.SetFocus
End Sub

fonctionne parfaitement.


En attendant, joyeuses fêtes à tous, et bonne année.


Michel Gaboly
www.gaboly.com
.



Avatar
docm
Bonjour.
Il semble que ce soit un bug dans Excel 2000.
On suggère comme voie de contournement d'utiliser un Label à la place du
MsgBox.

http://groups.google.ca/groups?q=setfocus+textbox+back+bug+2000+excel&hl=en&
lr=&selm=%23wUiplhkAHA.1708%40tkmsftngp04&rnum=2


Je te suggère d'utiliser OnTime afin d'appeler le setfocus de l'extérieur du
Userform.

If Not IsMissing(CellActive) Then
CellActive.SetFocus
Set CellActivePourOnTime = CellActive
Application.OnTime Now + TimeValue("00:00:01"),
"SetFocusSurCellActive"
End If
MsgBox TexteMessage, Code, "Info erronée ou manquante"

et dans un module:
Public CellActivePourOnTime As Object
Sub SetFocusSurCellActive()
CellActivePourOnTime.SetFocus
End Sub

Non testé sur Excel 2000.

Amicalement.

Docm.

"verificator" wrote in message
news:085d01c4ea95$a26e49a0$
bonjour Michel,

il me semble que le MsgBox soit la cause du problème.
Chez moi (XL2000, WinXP) si je le supprime, ça marche,
sinon le focus ne revient jamais sur le TextBox à
renseigner.
Ce qui m'étonne, c'est que ça marchait auparavant chez
toi.

Désolé de ne pas faire avancer davantage le schmilblick,
mais te souhaite (à tous d'ailleurs) une joyeuse fin de
Xmas.

-----Original Message-----
Re,

Désolé, fausse manip ;-((.
Voici le message complet :


Bonjour à tous,

Depuis des années, j'emploie une fonction qui me permet
de vérifier les

saisies au sein d'un UserForm :


Function Controle(ByVal Expression As Boolean, Optional
ComplTexte,

Optional CellActive, _
Optional TexteMessage, Optional VideoInverse As Boolean,
Optional ByRef

ControleUnique)
Dim Code As Integer
If Not IsMissing(ControleUnique) Then
If ControleUnique Then
Exit Function
End If
End If
' Test si anomalie
If Expression Then
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas
indiqué " & ComplTexte

End If
' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente
selon que l'info

manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou
manquante"

End If
' Sélection de l'info à modifier
If VideoInverse And Not IsMissing(CellActive)
Then

CellActive.SelStart = 0
CellActive.SelLength = Len(CellActive)
End If
' MAJ Contrôle déjà effectué
If Not IsMissing(ControleUnique) And Not
Expression Then

ControleUnique = True
End If
' Résultat du contrôle
If Expression Then Controle = False Else Controle True
End Function


Le code est commenté ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html


Pour certains éléments, une procédure événementielle
suffit à s'assurer

que l'info fournie est correcte. Mais une autre méthode
est nécessaire

pour vérifier que toutes les infos attendues ont été
saisies, ou

qu'elles sont cohérentes.


Voici par exemple le code associé au bouton OK d'un
UserForm contenant

2 TextBox, TNom et TAdresseMail.

Private Sub BOK_Click()
ControleSaisie
ReportDonnees
If Resultat Then
Unload Me
End If
End Sub

Private Sub ControleSaisie()
Resultat = Controle(TNom = "", "le nom.", TNom)
If Resultat Then Resultat = Controle(TAdresseMail
= "", "l'adresse

e-mail.", TAdresseMail)
End Sub

Private Sub ReportDonnées
' Traitement sans incidence ici
End Sub


Si TNom (ou TAdresseMail pour le second) est égal à ""

le message

"Vous n'avez pas indiqué le nom*."

* (ou l'adresse e-mail pour le second TextBox)

est affiché, et

CellActive.SetFocus

replace en principe le curseur dans TNom (ou
TAdresseMail).



Depuis quelque temps, SetFocus ne fonctionne plus qu'à
moitié ;-(( :

le controle actif est le bon, celui passé comme 3ème
argument à la

fonction Controle, ce qu'on peut vérifier avec un
Debug.Print

ActiveControl, mais le curseur n'y clignote pas et rien
ne se produit si

on entre quelque chose au clavier.

Je n'ai pas changé de version d'Excel (2000), et le
problème survient

sur plusieurs machines (Win NT et XP, y compris un Mac
sur lequel je

fais tourner Excel 2000 sous Win XP Pro grâce à
l'émulateur Virtual PC.


Si quelqu'un a une idée de pourquoi ce code qui a
fonctionné pendant des

années ne marche plus, j'en serais ravi.


NB - Le code ci-dessous

Private Sub BOK_Click()
TNom.SetFocus
End Sub

fonctionne parfaitement.


En attendant, joyeuses fêtes à tous, et bonne année.


Michel Gaboly
www.gaboly.com
.



Avatar
Michel Gaboly
Bonsoir,

Merci de ta réponse, que je n'ai eue que ce matin (j'étais en déplacement).

L'agacement m'aveuglait ;-((

La solution est très simple en fait : puisque le problème est lié au
Msgox, il suffit d'inverser dans le code MsgBox et SetFocus :

au lieu de :

' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente selon que l'info
manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou manquante"


on affiche d'abord le message.

' MAJ Curseur et icône
On Error Resume Next
Code = IIf(IsMissing(CellActive), 48,
IIf(Len(CellActive) = 0, 48, 64))
MsgBox TexteMessage, Code, "InfoManquante ou erronée"
CellActive.SetFocus
On Error GoTo 0
Avatar
Michel Gaboly
Bonjour,

Merci de ta réponse. J'ai trouvé une solution simple qui consiste à
inverser l'ordre du MsgBox et du SetFocus, et tout fonctionne.

Je ne pense pas que ce soit un bug d'Excel 2000, car mon code
fonctionnait avec cette version. Je suppose plutôt que c'est lié à la
combinaison Excel et certaines versions de Windows ou à une des
nombreuses mise à jour de Windows.

En tout cas, le problème est réglé

Merci encore,

docm wrote:
Bonjour.
Il semble que ce soit un bug dans Excel 2000.
On suggère comme voie de contournement d'utiliser un Label à la place du
MsgBox.

http://groups.google.ca/groups?q=setfocus+textbox+back+bug+2000+excel&hl=en&
lr=&selm=%23wUiplhkAHA.1708%40tkmsftngp04&rnum=2


Je te suggère d'utiliser OnTime afin d'appeler le setfocus de l'extérieur du
Userform.

If Not IsMissing(CellActive) Then
CellActive.SetFocus
Set CellActivePourOnTime = CellActive
Application.OnTime Now + TimeValue("00:00:01"),
"SetFocusSurCellActive"
End If
MsgBox TexteMessage, Code, "Info erronée ou manquante"

et dans un module:
Public CellActivePourOnTime As Object
Sub SetFocusSurCellActive()
CellActivePourOnTime.SetFocus
End Sub

Non testé sur Excel 2000.

Amicalement.

Docm.

"verificator" wrote in message
news:085d01c4ea95$a26e49a0$
bonjour Michel,

il me semble que le MsgBox soit la cause du problème.
Chez moi (XL2000, WinXP) si je le supprime, ça marche,
sinon le focus ne revient jamais sur le TextBox à
renseigner.
Ce qui m'étonne, c'est que ça marchait auparavant chez
toi.

Désolé de ne pas faire avancer davantage le schmilblick,
mais te souhaite (à tous d'ailleurs) une joyeuse fin de
Xmas.


-----Original Message-----
Re,

Désolé, fausse manip ;-((.
Voici le message complet :


Bonjour à tous,

Depuis des années, j'emploie une fonction qui me permet


de vérifier les

saisies au sein d'un UserForm :


Function Controle(ByVal Expression As Boolean, Optional


ComplTexte,

Optional CellActive, _
Optional TexteMessage, Optional VideoInverse As Boolean,


Optional ByRef

ControleUnique)
Dim Code As Integer
If Not IsMissing(ControleUnique) Then
If ControleUnique Then
Exit Function
End If
End If
' Test si anomalie
If Expression Then
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas


indiqué " & ComplTexte

End If
' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente


selon que l'info

manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou


manquante"

End If
' Sélection de l'info à modifier
If VideoInverse And Not IsMissing(CellActive)


Then

CellActive.SelStart = 0
CellActive.SelLength = Len(CellActive)
End If
' MAJ Contrôle déjà effectué
If Not IsMissing(ControleUnique) And Not


Expression Then

ControleUnique = True
End If
' Résultat du contrôle
If Expression Then Controle = False Else Controle >
True


End Function


Le code est commenté ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html


Pour certains éléments, une procédure événementielle


suffit à s'assurer

que l'info fournie est correcte. Mais une autre méthode


est nécessaire

pour vérifier que toutes les infos attendues ont été


saisies, ou

qu'elles sont cohérentes.


Voici par exemple le code associé au bouton OK d'un


UserForm contenant

2 TextBox, TNom et TAdresseMail.

Private Sub BOK_Click()
ControleSaisie
ReportDonnees
If Resultat Then
Unload Me
End If
End Sub

Private Sub ControleSaisie()
Resultat = Controle(TNom = "", "le nom.", TNom)
If Resultat Then Resultat = Controle(TAdresseMail


= "", "l'adresse

e-mail.", TAdresseMail)
End Sub

Private Sub ReportDonnées
' Traitement sans incidence ici
End Sub


Si TNom (ou TAdresseMail pour le second) est égal à ""

le message

"Vous n'avez pas indiqué le nom*."

* (ou l'adresse e-mail pour le second TextBox)

est affiché, et

CellActive.SetFocus

replace en principe le curseur dans TNom (ou


TAdresseMail).


Depuis quelque temps, SetFocus ne fonctionne plus qu'à


moitié ;-(( :

le controle actif est le bon, celui passé comme 3ème


argument à la

fonction Controle, ce qu'on peut vérifier avec un


Debug.Print

ActiveControl, mais le curseur n'y clignote pas et rien


ne se produit si

on entre quelque chose au clavier.

Je n'ai pas changé de version d'Excel (2000), et le


problème survient

sur plusieurs machines (Win NT et XP, y compris un Mac


sur lequel je

fais tourner Excel 2000 sous Win XP Pro grâce à


l'émulateur Virtual PC.

Si quelqu'un a une idée de pourquoi ce code qui a


fonctionné pendant des

années ne marche plus, j'en serais ravi.


NB - Le code ci-dessous

Private Sub BOK_Click()
TNom.SetFocus
End Sub

fonctionne parfaitement.


En attendant, joyeuses fêtes à tous, et bonne année.


Michel Gaboly
www.gaboly.com
.







Bonne fin d'année, et merci encore

Michel Gaboly
www.gaboly.com


Avatar
docm
Heureux d'avoir eu l'occasion d'essayer de te rendre service.
Bonne année.

"Michel Gaboly" wrote in message
news:
Bonjour,

Merci de ta réponse. J'ai trouvé une solution simple qui consiste à
inverser l'ordre du MsgBox et du SetFocus, et tout fonctionne.

Je ne pense pas que ce soit un bug d'Excel 2000, car mon code
fonctionnait avec cette version. Je suppose plutôt que c'est lié à la
combinaison Excel et certaines versions de Windows ou à une des
nombreuses mise à jour de Windows.

En tout cas, le problème est réglé

Merci encore,

docm wrote:
Bonjour.
Il semble que ce soit un bug dans Excel 2000.
On suggère comme voie de contournement d'utiliser un Label à la place du
MsgBox.


http://groups.google.ca/groups?q=setfocus+textbox+back+bug+2000+excel&hl=en&


lr=&selm=%23wUiplhkAHA.1708%40tkmsftngp04&rnum=2


Je te suggère d'utiliser OnTime afin d'appeler le setfocus de
l'extérieur du


Userform.

If Not IsMissing(CellActive) Then
CellActive.SetFocus
Set CellActivePourOnTime = CellActive
Application.OnTime Now + TimeValue("00:00:01"),
"SetFocusSurCellActive"
End If
MsgBox TexteMessage, Code, "Info erronée ou manquante"

et dans un module:
Public CellActivePourOnTime As Object
Sub SetFocusSurCellActive()
CellActivePourOnTime.SetFocus
End Sub

Non testé sur Excel 2000.

Amicalement.

Docm.

"verificator" wrote in message
news:085d01c4ea95$a26e49a0$
bonjour Michel,

il me semble que le MsgBox soit la cause du problème.
Chez moi (XL2000, WinXP) si je le supprime, ça marche,
sinon le focus ne revient jamais sur le TextBox à
renseigner.
Ce qui m'étonne, c'est que ça marchait auparavant chez
toi.

Désolé de ne pas faire avancer davantage le schmilblick,
mais te souhaite (à tous d'ailleurs) une joyeuse fin de
Xmas.


-----Original Message-----
Re,

Désolé, fausse manip ;-((.
Voici le message complet :


Bonjour à tous,

Depuis des années, j'emploie une fonction qui me permet


de vérifier les

saisies au sein d'un UserForm :


Function Controle(ByVal Expression As Boolean, Optional


ComplTexte,

Optional CellActive, _
Optional TexteMessage, Optional VideoInverse As Boolean,


Optional ByRef

ControleUnique)
Dim Code As Integer
If Not IsMissing(ControleUnique) Then
If ControleUnique Then
Exit Function
End If
End If
' Test si anomalie
If Expression Then
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas


indiqué " & ComplTexte

End If
' MAJ Curseur
If Not IsMissing(CellActive) Then
CellActive.SetFocus
' Emploi d'une icône différente


selon que l'info

manque ou est erronée.
If Len(CellActive) = 0 Then
Code = 48
Else
Code = 64
End If
Else
Code = 48
End If
MsgBox TexteMessage, Code, "Info erronée ou


manquante"

End If
' Sélection de l'info à modifier
If VideoInverse And Not IsMissing(CellActive)


Then

CellActive.SelStart = 0
CellActive.SelLength = Len(CellActive)
End If
' MAJ Contrôle déjà effectué
If Not IsMissing(ControleUnique) And Not


Expression Then

ControleUnique = True
End If
' Résultat du contrôle
If Expression Then Controle = False Else Controle > >
True


End Function


Le code est commenté ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html


Pour certains éléments, une procédure événementielle


suffit à s'assurer

que l'info fournie est correcte. Mais une autre méthode


est nécessaire

pour vérifier que toutes les infos attendues ont été


saisies, ou

qu'elles sont cohérentes.


Voici par exemple le code associé au bouton OK d'un


UserForm contenant

2 TextBox, TNom et TAdresseMail.

Private Sub BOK_Click()
ControleSaisie
ReportDonnees
If Resultat Then
Unload Me
End If
End Sub

Private Sub ControleSaisie()
Resultat = Controle(TNom = "", "le nom.", TNom)
If Resultat Then Resultat = Controle(TAdresseMail


= "", "l'adresse

e-mail.", TAdresseMail)
End Sub

Private Sub ReportDonnées
' Traitement sans incidence ici
End Sub


Si TNom (ou TAdresseMail pour le second) est égal à ""

le message

"Vous n'avez pas indiqué le nom*."

* (ou l'adresse e-mail pour le second TextBox)

est affiché, et

CellActive.SetFocus

replace en principe le curseur dans TNom (ou


TAdresseMail).


Depuis quelque temps, SetFocus ne fonctionne plus qu'à


moitié ;-(( :

le controle actif est le bon, celui passé comme 3ème


argument à la

fonction Controle, ce qu'on peut vérifier avec un


Debug.Print

ActiveControl, mais le curseur n'y clignote pas et rien


ne se produit si

on entre quelque chose au clavier.

Je n'ai pas changé de version d'Excel (2000), et le


problème survient

sur plusieurs machines (Win NT et XP, y compris un Mac


sur lequel je

fais tourner Excel 2000 sous Win XP Pro grâce à


l'émulateur Virtual PC.

Si quelqu'un a une idée de pourquoi ce code qui a


fonctionné pendant des

années ne marche plus, j'en serais ravi.


NB - Le code ci-dessous

Private Sub BOK_Click()
TNom.SetFocus
End Sub

fonctionne parfaitement.


En attendant, joyeuses fêtes à tous, et bonne année.


Michel Gaboly
www.gaboly.com
.







Bonne fin d'année, et merci encore

Michel Gaboly
www.gaboly.com




Avatar
Michel Gaboly
docm wrote:
Heureux d'avoir eu l'occasion d'essayer de te rendre service.
Bonne année.

Merci encore, et bonne année à toi aussi.



Michel Gaboly
www.gaboly.com