OVH Cloud OVH Cloud

Faire une fonction d'un code récurrent dans un userform

5 réponses
Avatar
Clicnik
Voilà, j'aimerais pouvoir utiliser ce bout de code

Private Sub txt003_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt003.Value) Then
MsgBox "valeur numérique uniquement!"
Cancel = True
Else
Cancel = False
End If
End Sub

en tant que fonction.
J'ai un Userform avec près de 200 textbox pour la saisie d'informations.
Quand je place le code ci-dessus derrière un textbox, je reçois bien le
message indiquant qu'il faut taper du numérique (cela pourra être modifier en
date par après) et non de l'alpha numérique.
J'essaye d'en faire une fonction plutôt que de la recopier pour tous mes
textbox.
Je sais qu'il faut lui passer l'argument text003.value dans ce cas-ci, mais
il bloque sur Cancel (non défini) ou autre chose quand je modifie l'input de
la fonction.

Quelqu'un aurait une solution, svp ?
Merci d'avance

5 réponses

Avatar
papou
Bonjour
Va voir chez Misange ici :
http://www.excelabo.net/xl/controles.php#fonctionbouton

Cordialement
Pascal

"Clicnik" a écrit dans le message de
news:
Voilà, j'aimerais pouvoir utiliser ce bout de code

Private Sub txt003_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt003.Value) Then
MsgBox "valeur numérique uniquement!"
Cancel = True
Else
Cancel = False
End If
End Sub

en tant que fonction.
J'ai un Userform avec près de 200 textbox pour la saisie d'informations.
Quand je place le code ci-dessus derrière un textbox, je reçois bien le
message indiquant qu'il faut taper du numérique (cela pourra être modifier
en
date par après) et non de l'alpha numérique.
J'essaye d'en faire une fonction plutôt que de la recopier pour tous mes
textbox.
Je sais qu'il faut lui passer l'argument text003.value dans ce cas-ci,
mais
il bloque sur Cancel (non défini) ou autre chose quand je modifie l'input
de
la fonction.

Quelqu'un aurait une solution, svp ?
Merci d'avance


Avatar
Clicnik
Merci pour l'adresse de ce super site plein d'astuces ;)

Cependant, il me manque la réponse à mon problème. :(

Le problème qui se pose est le suivant : Quand je mets le code derrière le
textbox, tout fonctionne (le focus reste sur le textbox si cela n'est pas un
numérique, aussi non il passe au suivant). Mais quand il s'agit de le mettre
en tant que fonction, j'ai un problème avec les paramètres à passé. Si je
passe juste le texte, je peux faire un IF .. THEN ..ELSE .. END IF, mais il
passe malgré tout au textbox suivant, car il n'a plus (ByVal Cancel As
MSForms.ReturnBoolean) or, j'aimerais qu'il reste dans le textbox tant que
Cancel est vrai.





Bonjour
Va voir chez Misange ici :
http://www.excelabo.net/xl/controles.php#fonctionbouton

Cordialement
Pascal

"Clicnik" a écrit dans le message de
news:
Voilà, j'aimerais pouvoir utiliser ce bout de code

Private Sub txt003_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt003.Value) Then
MsgBox "valeur numérique uniquement!"
Cancel = True
Else
Cancel = False
End If
End Sub

en tant que fonction.
J'ai un Userform avec près de 200 textbox pour la saisie d'informations.
Quand je place le code ci-dessus derrière un textbox, je reçois bien le
message indiquant qu'il faut taper du numérique (cela pourra être modifier
en
date par après) et non de l'alpha numérique.
J'essaye d'en faire une fonction plutôt que de la recopier pour tous mes
textbox.
Je sais qu'il faut lui passer l'argument text003.value dans ce cas-ci,
mais
il bloque sur Cancel (non défini) ou autre chose quand je modifie l'input
de
la fonction.

Quelqu'un aurait une solution, svp ?
Merci d'avance







Avatar
Michel Gaboly
Bonsoir,

Personnellement, plutôt qu'une fonction, j'utilise un module de clas se nommé ClasseTextBoxes, avec une Sub unique pour
contrôler la "numéricité" de tous les TextBox.

Voici son code

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean, Indice As Int eger, Partenaire As Control
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Test si numérique et si la valeur est correcte
If Not IsNumeric(TextBoxes) And TextBoxes <> "-" Then
MsgBox "Valeur numérique uniquement!"
TextBoxes = Left(TextBoxes, Len(TextBoxes) - 1)
End If
End If
End Sub

On crée une classe, "TextBoxes" avec des événements, de ty pe "MSForms.TextBox"

NB - L'événement "Exit" n'est pas disponible, c'est pourquoi j' utilise "Change", et je fais le contrôle caractère par
caractère au fur et à mesure de la frappe. Le premier caractà ¨re incompatible avec une donnée numérique est effacé ap rès
un message.

J'accepte toute valeur numérique, y compris décimale et/ou nà ©gative. Pour cela, j'utilise Replace (ou
Application.WorksheetFunction.Substitute avec Excel 97 ou EXcel Mac, basà ©es sur VB5) pour remplacer le point et la
virgule par le "bon" séparateur décimal, afin que le IsNumeric ne renvoie pas False si on a entré un point au lieu d'une
virgule (ou l'inverse, selon les réglages de la machine).

J'accepte également "-" comme premier caractère, à cause d es nombres négatifs.


Ensuite dans le "Initialize" du UserForm, je crée une matrice, TextB oxes, rattachée à la classe définie dans le module
de classe nommé ClasseTextBoxes, et je rattache tous les TextBox à   la matrice

Option Explicit
Dim TextBoxes() As New ClasseTextBoxe
Avatar
Michel Gaboly
Bonsoir,

Personnellement, plutôt qu'une fonction, j'utilise un module de classe nommé ClasseTextBoxes, avec une Sub unique pour
contrôler la "numéricité" de tous les TextBox.

Voici son code

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean, Indice As Int eger, Partenaire As Control
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Test si numérique et si la valeur est correcte
If Not IsNumeric(TextBoxes) And TextBoxes <> "-" Then
MsgBox "Valeur numérique uniquement!"
TextBoxes = Left(TextBoxes, Len(TextBoxes) - 1)
End If
End If
End Sub

On crée une classe, "TextBoxes" avec des événements, de type "MSFor ms.TextBox"

NB - L'événement "Exit" n'est pas disponible, c'est pourquoi j'utilis e "Change", et je fais le contrôle caractère par
caractère au fur et à mesure de la frappe.

J'accepte toute valeur numérique, y compris décimale et/ou négative . Pour cela, j'utilise Replace (ou
Application.WorksheetFunction.Substitute avec Excel 97 ou EXcel Mac, basé es sur VB5) pour remplacer le point et la
virgule par le "bon" séparateur décimal, afin que le IsNumeric ne ren voie pas False si on a entré un point au lieu d'une
virgule (ou l'inverse, selon les réglages de la machine).

J'accepte également "-" comme premier caractère, à cause des nombre s négatifs.


Ensuite dans le "Initialize" du UserForm, je crée une matrice, TextBoxe s, rattachée à la classe définie dans le module
de classe nommé ClasseTextBoxes, et je rattache tous les TextBox à la matrice

Option Explicit
Dim TextBoxes() As New ClasseTextBoxes

Private Sub UserForm_Initialize()
Dim c As Control, TextBoxesCount As Integer
' Création de la collection de TextBoxes, gérée par le module de classe
TextBoxesCount = 0
For Each c In Controls
If TypeName(c) = "TextBox" Then
TextBoxesCount = TextBoxesCount + 1
ReDim Preserve TextBoxes(1 To TextBoxesCount)
Set TextBoxes(TextBoxesCount).TextBoxes = c
End If
Next c
End Sub

Cela suffit à avoir un contrôle de "numéricité" pour tous les Tex tBox;


J'ajoute en + controle de saisie pour s'assurer que tous les TextBox du U serForm ont été renseignés.

+ d'infos sur ce contrôle de saisie ici : http://www.gaboly.com/VBA/Fon ctionControle.html


Fichier exemple : http://cjoint.com/?jtxmzcK1Vl


Bravo à ceux qui ont eu le courage de tout lire.


Voilà, j'aimerais pouvoir utiliser ce bout de code

Private Sub txt003_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt003.Value) Then
MsgBox "valeur numérique uniquement!"
Cancel = True
Else
Cancel = False
End If
End Sub

en tant que fonction.
J'ai un Userform avec près de 200 textbox pour la saisie d'informatio ns.
Quand je place le code ci-dessus derrière un textbox, je reçois bie n le
message indiquant qu'il faut taper du numérique (cela pourra être m odifier en
date par après) et non de l'alpha numérique.
J'essaye d'en faire une fonction plutôt que de la recopier pour tous mes
textbox.
Je sais qu'il faut lui passer l'argument text003.value dans ce cas-ci, mais
il bloque sur Cancel (non défini) ou autre chose quand je modifie l'i nput de
la fonction.

Quelqu'un aurait une solution, svp ?
Merci d'avance



--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
Clicnik
Merci Michel, je m'en vais tester ça ;)


Bonsoir,

Personnellement, plutôt qu'une fonction, j'utilise un module de classe nommé ClasseTextBoxes, avec une Sub unique pour
contrôler la "numéricité" de tous les TextBox.

Voici son code

Option Explicit
Public WithEvents TextBoxes As MSForms.TextBox

Private Sub Textboxes_Change()
Dim Sep As String, NatureInfo As String, Entier As Boolean, Indice As Integer, Partenaire As Control
Sep = Application.International(xlDecimalSeparator)
If TextBoxes <> "" Then
TextBoxes = Replace(TextBoxes, ".", Sep)
TextBoxes = Replace(TextBoxes, ",", Sep)
' Test si numérique et si la valeur est correcte
If Not IsNumeric(TextBoxes) And TextBoxes <> "-" Then
MsgBox "Valeur numérique uniquement!"
TextBoxes = Left(TextBoxes, Len(TextBoxes) - 1)
End If
End If
End Sub

On crée une classe, "TextBoxes" avec des événements, de type "MSForms.TextBox"

NB - L'événement "Exit" n'est pas disponible, c'est pourquoi j'utilise "Change", et je fais le contrôle caractère par
caractère au fur et à mesure de la frappe.

J'accepte toute valeur numérique, y compris décimale et/ou négative. Pour cela, j'utilise Replace (ou
Application.WorksheetFunction.Substitute avec Excel 97 ou EXcel Mac, basées sur VB5) pour remplacer le point et la
virgule par le "bon" séparateur décimal, afin que le IsNumeric ne renvoie pas False si on a entré un point au lieu d'une
virgule (ou l'inverse, selon les réglages de la machine).

J'accepte également "-" comme premier caractère, à cause des nombres négatifs.


Ensuite dans le "Initialize" du UserForm, je crée une matrice, TextBoxes, rattachée à la classe définie dans le module
de classe nommé ClasseTextBoxes, et je rattache tous les TextBox à la matrice

Option Explicit
Dim TextBoxes() As New ClasseTextBoxes

Private Sub UserForm_Initialize()
Dim c As Control, TextBoxesCount As Integer
' Création de la collection de TextBoxes, gérée par le module de classe
TextBoxesCount = 0
For Each c In Controls
If TypeName(c) = "TextBox" Then
TextBoxesCount = TextBoxesCount + 1
ReDim Preserve TextBoxes(1 To TextBoxesCount)
Set TextBoxes(TextBoxesCount).TextBoxes = c
End If
Next c
End Sub

Cela suffit à avoir un contrôle de "numéricité" pour tous les TextBox;


J'ajoute en + controle de saisie pour s'assurer que tous les TextBox du UserForm ont été renseignés.

+ d'infos sur ce contrôle de saisie ici : http://www.gaboly.com/VBA/FonctionControle.html


Fichier exemple : http://cjoint.com/?jtxmzcK1Vl


Bravo à ceux qui ont eu le courage de tout lire.


Voilà, j'aimerais pouvoir utiliser ce bout de code

Private Sub txt003_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(txt003.Value) Then
MsgBox "valeur numérique uniquement!"
Cancel = True
Else
Cancel = False
End If
End Sub

en tant que fonction.
J'ai un Userform avec près de 200 textbox pour la saisie d'informations.
Quand je place le code ci-dessus derrière un textbox, je reçois bien le
message indiquant qu'il faut taper du numérique (cela pourra être modifier en
date par après) et non de l'alpha numérique.
J'essaye d'en faire une fonction plutôt que de la recopier pour tous mes
textbox.
Je sais qu'il faut lui passer l'argument text003.value dans ce cas-ci, mais
il bloque sur Cancel (non défini) ou autre chose quand je modifie l'input de
la fonction.

Quelqu'un aurait une solution, svp ?
Merci d'avance



--
Cordialement,

Michel Gaboly
www.gaboly.com