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

4 problèmes en VBA

22 réponses
Avatar
Dominique
Bonjour,
Je viens de cr=E9er une feuille de calcul pour enregistrer des documents
(Num=E9ro, Titre, Auteur, Date-doc, ISBN=85). Compl=E8te d=E9butante en VBA=
,
j'ai r=E9ussi, en piochant des petits morceaux de code =E0 droite, =E0
gauche, =E0 cr=E9er un userform qui me satisfait. Enfin presque. J'ai
quand m=EAme plusieurs petits probl=E8mes pour lesquels j'ai besoin de
votre aide.

1. Je voudrais que le champ "Date-doc" ne comprenne que l'ann=E9e. J'ai
r=E9ussi =E0 limiter l'entr=E9e =E0 4 caract=E8res chiffres. Si ce ne sont =
pas
des chiffres qui sont saisis, un message d'erreur s'affiche, la bo=EEte
"Date-doc" est vid=E9e et en attente d'une nouvelle entr=E9e. Mon
probl=E8me : comment imposer des dates coh=E9rentes ? Parce que si j'entre
3084, la saisie est accept=E9e=85

2. Toujours dans ce champ "Date-doc", mais aussi dans ISBN et Num=E9ro,
je saisis des chiffres dans le userform mais le r=E9sultat affich=E9 dans
la table est sous forme texte, m=EAme si je param=E8tre ces colonnes par
'Format de cellule'. Ca ne me g=EAne pas outre mesure puisque je n'ai
pas de calcul =E0 faire dans ces zones mais le petit triangle qui
annonce l'erreur dans le coin de chaque cellule me d=E9range beaucoup
lui=85

3. Encore par rapport aux champs num=E9riques : si j'entre des lettres
dans le champ "num=E9ro" et que je clique sur mon bouton "OK", j'ai bien
un message d'erreur. Mais toutes les donn=E9es (y compris non valides)
sont n=E9anmoins saisies dans ma table. Comment faire pour que le bouton
"OK" n'autorise l'enregistrement des donn=E9es que si elles sont TOUTES
valides ?

4. Et derni=E8re chose=85 j'aimerais bien que le champ "Num=E9ro" se
remplisse automatiquement : 1, 2, 3, 4, etc. et que le curseur du
userform se place directement sur le champ suivant. J'ai toujours la
possibilit=E9 de pr=E9-remplir la colonne de la table et de supprimer la
bo=EEte de saisie du userform, mais tant qu'=E0 faire=85

Si vous voulez que je vous passe mon document, ce n'est pas un
probl=E8me, faites-le moi juste savoir. Je vous remercie par avance.
Dominique.

10 réponses

1 2 3
Avatar
Solutions-xl
Bonjour
oui ce serait bien d'avoir le doc en pièce jointe

On 20 nov, 08:55, Dominique wrote:
Bonjour,
Je viens de créer une feuille de calcul pour enregistrer des documents
(Numéro, Titre, Auteur, Date-doc, ISBN…). Complète débutante en V BA,
j'ai réussi, en piochant des petits morceaux de code à droite, à
gauche, à créer un userform qui me satisfait. Enfin presque. J'ai
quand même plusieurs petits problèmes pour lesquels j'ai besoin de
votre aide.

1.      Je voudrais que le champ "Date-doc" ne comprenne que l'ann ée. J'ai
réussi à limiter l'entrée à 4 caractères chiffres. Si ce ne son t pas
des chiffres qui sont saisis, un message d'erreur s'affiche, la boîte
"Date-doc" est vidée et en attente d'une nouvelle entrée. Mon
problème : comment imposer des dates cohérentes ? Parce que si j'entr e
3084, la saisie est acceptée…

2.      Toujours dans ce champ "Date-doc", mais aussi dans ISBN et Numéro,
je saisis des chiffres dans le userform mais le résultat affiché dans
la table est sous forme texte, même si je paramètre ces colonnes par
'Format de cellule'. Ca ne me gêne pas outre mesure puisque je n'ai
pas de calcul à faire dans ces zones mais le petit triangle qui
annonce l'erreur dans le coin de chaque cellule me dérange beaucoup
lui…

3.      Encore par rapport aux champs numériques : si j'entre des lettres
dans le champ "numéro" et que je clique sur mon bouton "OK", j'ai bien
un message d'erreur. Mais toutes les données (y compris non valides)
sont néanmoins saisies dans ma table. Comment faire pour que le bouton
"OK" n'autorise l'enregistrement des données que si elles sont TOUTES
valides ?

4.      Et dernière chose… j'aimerais bien que le champ "Numé ro" se
remplisse automatiquement : 1, 2, 3, 4, etc. et que le curseur du
userform se place directement sur le champ suivant. J'ai toujours la
possibilité de pré-remplir la colonne de la table et de supprimer la
boîte de saisie du userform, mais tant qu'à faire…

Si vous voulez que je vous passe mon document, ce n'est pas un
problème, faites-le moi juste savoir. Je vous remercie par avance.
Dominique.


Avatar
Misange
Bonjour

Dominique a écrit :


1. Je voudrais que le champ "Date-doc" ne comprenne que l'année. J'ai
réussi à limiter l'entrée à 4 caractères chiffres. Si ce ne sont pas
des chiffres qui sont saisis, un message d'erreur s'affiche, la boîte
"Date-doc" est vidée et en attente d'une nouvelle entrée. Mon
problème : comment imposer des dates cohérentes ? Parce que si j'entre
3084, la saisie est acceptée…



à compléter avec ce que tu as déjà comme conditions
le CInt(.Value) <> CDbl(.Value) permet de vérifier qu'on entre des
valeurs entières (il y a d'autres manières de faire)

Private Sub Txtdate_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Txtdate
If Not IsNumeric(.Value) _
Or .Value <1982 100 Or .Value < 2034 _
Or CInt(.Value) <> CDbl(.Value) Then
MsgBox "Indiquez une valeur entre 1982 et 2034"
.SelStart = 0
.SelLength = Len(.Text)
Cancel = True
End If
End With
End Sub

2. Toujours dans ce champ "Date-doc", mais aussi dans ISBN et Numéro,
je saisis des chiffres dans le userform mais le résultat affiché dans
la table est sous forme texte, même si je paramètre ces colonnes par
'Format de cellule'. Ca ne me gêne pas outre mesure puisque je n'ai
pas de calcul à faire dans ces zones mais le petit triangle qui
annonce l'erreur dans le coin de chaque cellule me dérange beaucoup
lui…



il te suffit de mettre
madate= cint(txtdate.value)
ce qui transformera ton champ texte (ce qui est dans un TEXTbox est
toujours du texte tant que tu ne changes pas ) en une valeur numérique

3. Encore par rapport aux champs numériques : si j'entre des lettres
dans le champ "numéro" et que je clique sur mon bouton "OK", j'ai bien
un message d'erreur. Mais toutes les données (y compris non valides)
sont néanmoins saisies dans ma table. Comment faire pour que le bouton
"OK" n'autorise l'enregistrement des données que si elles sont TOUTES
valides ?


intercepte l'erreur : tu mets tous ces tests dans l'événement exit de
tes textbox voir au N°1

4. Et dernière chose… j'aimerais bien que le champ "Numéro" se
remplisse automatiquement : 1, 2, 3, 4, etc. et que le curseur du
userform se place directement sur le champ suivant. J'ai toujours la
possibilité de pré-remplir la colonne de la table et de supprimer la
boîte de saisie du userform, mais tant qu'à faire…



pas compris.
Pour l'ordre de saisie, voir dans VBE : affichage, ordre de tabulation.
Il te permet de définir l'ordre de sélection des élements de ton formulaire.


Si vous voulez que je vous passe mon document, ce n'est pas un
problème, faites-le moi juste savoir. Je vous remercie par avance.
Dominique.




Misange
http://www.excelabo.net
Avatar
Misange
oups une scorie
lire
Or .Value <1982 Or .Value < 2034
Misange

Misange a écrit :
Bonjour

Dominique a écrit :


1. Je voudrais que le champ "Date-doc" ne comprenne que l'année. J'ai
réussi à limiter l'entrée à 4 caractères chiffres. Si ce ne sont pas
des chiffres qui sont saisis, un message d'erreur s'affiche, la boîte
"Date-doc" est vidée et en attente d'une nouvelle entrée. Mon
problème : comment imposer des dates cohérentes ? Parce que si j'entre
3084, la saisie est acceptée…



à compléter avec ce que tu as déjà comme conditions
le CInt(.Value) <> CDbl(.Value) permet de vérifier qu'on entre des
valeurs entières (il y a d'autres manières de faire)

Private Sub Txtdate_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Txtdate
If Not IsNumeric(.Value) _
Or .Value <1982 100 Or .Value < 2034 _
Or CInt(.Value) <> CDbl(.Value) Then
MsgBox "Indiquez une valeur entre 1982 et 2034"
.SelStart = 0
.SelLength = Len(.Text)
Cancel = True
End If
End With
End Sub

2. Toujours dans ce champ "Date-doc", mais aussi dans ISBN et Numéro,
je saisis des chiffres dans le userform mais le résultat affiché dans
la table est sous forme texte, même si je paramètre ces colonnes par
'Format de cellule'. Ca ne me gêne pas outre mesure puisque je n'ai
pas de calcul à faire dans ces zones mais le petit triangle qui
annonce l'erreur dans le coin de chaque cellule me dérange beaucoup
lui…



il te suffit de mettre
madate= cint(txtdate.value)
ce qui transformera ton champ texte (ce qui est dans un TEXTbox est
toujours du texte tant que tu ne changes pas ) en une valeur numérique

3. Encore par rapport aux champs numériques : si j'entre des lettres
dans le champ "numéro" et que je clique sur mon bouton "OK", j'ai bien
un message d'erreur. Mais toutes les données (y compris non valides)
sont néanmoins saisies dans ma table. Comment faire pour que le bouton
"OK" n'autorise l'enregistrement des données que si elles sont TOUTES
valides ?


intercepte l'erreur : tu mets tous ces tests dans l'événement exit de
tes textbox voir au N°1

4. Et dernière chose… j'aimerais bien que le champ "Numéro" se
remplisse automatiquement : 1, 2, 3, 4, etc. et que le curseur du
userform se place directement sur le champ suivant. J'ai toujours la
possibilité de pré-remplir la colonne de la table et de supprimer la
boîte de saisie du userform, mais tant qu'à faire…



pas compris.
Pour l'ordre de saisie, voir dans VBE : affichage, ordre de tabulation.
Il te permet de définir l'ordre de sélection des élements de ton
formulaire.


Si vous voulez que je vous passe mon document, ce n'est pas un
problème, faites-le moi juste savoir. Je vous remercie par avance.
Dominique.




Misange
http://www.excelabo.net


Avatar
Dominique
Pas de problème, il est là : http://cjoint.com/?lul7PRSaGk
D'ailleurs, si vous avez d'autres suggestions d'amélioration, je suis
preneuse. Mais ne faites pas tout pour moi, je tiens à comprendre et à
m'améliorer en VBA...

J'ai oublié de préciser que je travaille sous Excel 2007, en mode de
compatibilité parce que je ne sais pas quelle version sera installée
sur l'ordinateur de destination.

Merci,
Dominique.

On 20 nov, 10:52, Solutions-xl wrote:
Bonjour
oui ce serait bien d'avoir le doc en pièce jointe



Avatar
Dominique
Merci beaucoup Misange. Je regarde tout ça et je te fais savoir
comment je m'en sors...
Dominique

On 20 nov, 11:58, Misange wrote:
Bonjour



Avatar
michdenis
Bonjour Dominique,

Je t'ai créé un petit exemple d'un formulaire permettant
la saisie d'une année comprise entre 1900 et 2299 et
seulement. C'était seulement pour m'amuser ! ;-)

http://cjoint.com/?lum2aIszBK



"Dominique" a écrit dans le message de groupe de discussion :

Bonjour,
Je viens de créer une feuille de calcul pour enregistrer des documents
(Numéro, Titre, Auteur, Date-doc, ISBN…). Complète débutante en VBA,
j'ai réussi, en piochant des petits morceaux de code à droite, à
gauche, à créer un userform qui me satisfait. Enfin presque. J'ai
quand même plusieurs petits problèmes pour lesquels j'ai besoin de
votre aide.

1. Je voudrais que le champ "Date-doc" ne comprenne que l'année. J'ai
réussi à limiter l'entrée à 4 caractères chiffres. Si ce ne sont pas
des chiffres qui sont saisis, un message d'erreur s'affiche, la boîte
"Date-doc" est vidée et en attente d'une nouvelle entrée. Mon
problème : comment imposer des dates cohérentes ? Parce que si j'entre
3084, la saisie est acceptée…

2. Toujours dans ce champ "Date-doc", mais aussi dans ISBN et Numéro,
je saisis des chiffres dans le userform mais le résultat affiché dans
la table est sous forme texte, même si je paramètre ces colonnes par
'Format de cellule'. Ca ne me gêne pas outre mesure puisque je n'ai
pas de calcul à faire dans ces zones mais le petit triangle qui
annonce l'erreur dans le coin de chaque cellule me dérange beaucoup
lui…

3. Encore par rapport aux champs numériques : si j'entre des lettres
dans le champ "numéro" et que je clique sur mon bouton "OK", j'ai bien
un message d'erreur. Mais toutes les données (y compris non valides)
sont néanmoins saisies dans ma table. Comment faire pour que le bouton
"OK" n'autorise l'enregistrement des données que si elles sont TOUTES
valides ?

4. Et dernière chose… j'aimerais bien que le champ "Numéro" se
remplisse automatiquement : 1, 2, 3, 4, etc. et que le curseur du
userform se place directement sur le champ suivant. J'ai toujours la
possibilité de pré-remplir la colonne de la table et de supprimer la
boîte de saisie du userform, mais tant qu'à faire…

Si vous voulez que je vous passe mon document, ce n'est pas un
problème, faites-le moi juste savoir. Je vous remercie par avance.
Dominique.
Avatar
Dominique
Rhôôô...
Mais qu'est ce que c'est compliqué !
Je garde ça sous le coude et je chercherai ( à comprendre et) à
réutiliser !

Merci !
Dominique.



On 20 nov, 12:56, "michdenis" wrote:
Bonjour Dominique,

Je t'ai créé un petit exemple d'un formulaire permettant
la saisie d'une année comprise entre 1900 et 2299 et
seulement. C'était seulement pour m'amuser ! ;-)

http://cjoint.com/?lum2aIszBK



Avatar
michdenis
| Mais qu'est ce que c'est compliqué !

Pourtant, chaque ligne de code est relativement simple...

Mais en final, c'est plus que du bonbon !
;-))
Avatar
Dominique
On 20 nov, 15:16, "michdenis" wrote:
| Mais qu'est ce que c'est compliqué !

Pourtant, chaque ligne de code est relativement simple...



Ah bon ???? Je suis obligée d'aller voir dans l'aide pour la moindre
expression... Aide qui ne m'aide pas beaucoup à comprendre d'ailleurs.
Je suis une vraie de vraie débutante : le fichier que j'ai joint plus
haut, c'est ma première tentative, et j'en étais 'archment fière ;-)
Mais non d'un chien, j'y arriverai !

Mais comme tu le dis, quand on y arrive, "c'est plus que du
bonbon !" ;-)
Merci,
Dominique.


Mais en final, c'est plus que du bonbon !
;-))


Avatar
michdenis
**Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Cet événement se produit lorsque tu appuies sur une touche du clavier.
Le caractère que représente la touche du clavier s'inscrit seulement au
moment de relâcher la touche enfoncée. La variable "KeyAscii" représente
la valeur Ascii du caractère de la touche enfoncé par l'usager.

Les chiffres 0 à 9 ont les valeurs ascii de 48 à 57
0 -> 48 , 1 -> 49, 2 ->50 etc...

L'événement "KeyPress" est intéressant car il permet d'intercepter quel
caractère va être ajouté au textbox avant que ce caractère soit saisi.
En utilisant des conditions "Si", on peut tester la valeur du caractère ascii
de la touche enfoncée par l'usager et décider si on accepte ce caractère
ou non. On peut même le modifier en modifiant la valeur de la variable KeyAscii.

La procédure utilise la technique du "Select Case" pour analyser les 4
positions possibles (année -> 4 chiffres) où peut se situer le curseur
Position 0 -> le curseur est à l'extrême gauche dans le textbox
Position 1 -> Le curseur est immédiatement après le premier caractère
la même chose pour la postions 2 et 3

la position du curseur dans la chaîne de caractère du textbox.
est donnée par la ligne de code suivante : P = Me.TextBox1.SelStart

Tout le reste, représente des conditions qui testent si la valeur acceptable
en fonction de la position du curseur compte tenu du critère de base déterminé
par l'année du début (dans l'exemple 1900) et l'année de fin (2299)

En position 0, seules les caractères 1 et 2 sont acceptables
en position 1, seules les caractères 0, 1 et 2 sont acceptables
en position 2 et 3, tous les chiffres sont acceptables.

Ce cheminement n'est pas obligatoire... mais cela démontre que tu as la
possibilité de "contrôler" la latitude que tu laisses à l'usager.

;-))

Amuse toi bien !
1 2 3