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
Dominique
On 20 nov, 11:58, Misange wrote:
Bonjour

> 1.
à 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



J'ai pris en compte la modif de la 4ème ligne que tu as envoyée plus
tard, mais je n'y arrive pas. Si j'ai bien compris, je dois remplacer
tous les "Txtdate" par le nom du textbox qui contiendra la date ? Que
je le change ou pas, ça ne marche pas de toute façon.


> 2.
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



Juste recopié tel quel (en remplaçant "Txtdate") ? et où ? Là aussi ,
j'ai fait divers essais mais je n'ai pas du le faire correctement.

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



Euh là... on verra plus tard, quand j'aurai résolu le point 1.
Ok ? ;-)


> 4.
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 fo rmulaire.



Ca n'était pas clair, et après réflexion, ça ne présenterait aucu n
intérêt, donc je laisse tomber : une question de moins !

Merci pour ton aide,
Dominique.
Avatar
Dominique
Waah... Ca c'est clair (un prof ?)...
Je regarde tout ça plus en détail dès que j'ai fini mon userform, ou
au moins quand j'aurai réglé les quelques points qui me gênent.
Merci !
Dominique.



On 20 nov, 16:32, "michdenis" wrote:
**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 s aisi.
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 curseu r
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.SelStar t

Tout le reste, représente des conditions qui testent si la valeur accep table
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 !


Avatar
Misange
Bonjour


J'ai pris en compte la modif de la 4ème ligne que tu as envoyée plus
tard, mais je n'y arrive pas. Si j'ai bien compris, je dois remplacer
tous les "Txtdate" par le nom du textbox qui contiendra la date ? Que
je le change ou pas, ça ne marche pas de toute façon.



Oups non !
c'est juste un exemple à adapter avec le nom de tes contrôles, j'ai
posté ça avant que tu mettes ton fichier sur cjoint (je les regarde très
rarement en fait)

dans la fenêtre de code de ton userform en haut tu as deux petits menus
déroulants. Tu sélectionnes celui de ton textboxdate dans celui de
gauche. Dans celui de droite apparaissent les événements que tu peux
intercepter. J'ai choisi de contrôler ici le contenu du textbox quand on
en sort. Si le contenu est correct on passe au suivant, sinon, on reste
dedans et on recommence.
Si tu veux quelmques tutos sur les userforms pour débuter, tu en
trouveras sur excelabo avec des exemples à télécharger.


Private Sub TextBox_DateDoc_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TextBox_DateDoc
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.


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



Juste recopié tel quel (en remplaçant "Txtdate") ? et où ? Là aussi,
j'ai fait divers essais mais je n'ai pas du le faire correctement.



rebelote, il faut que tu mettes le nom de ton contrôle pas celui de mon
exemple

3.


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



Euh là... on verra plus tard, quand j'aurai résolu le point 1.
Ok ? ;-)



revoir le N°1 ;-) et revenir plus tard si c'est pas clair

4.


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.



Ca n'était pas clair, et après réflexion, ça ne présenterait aucun
intérêt, donc je laisse tomber : une question de moins !

Merci pour ton aide,
Dominique.




No problemo !
Misange
http://www.excelabo.net
Avatar
Dominique
On 20 nov, 17:26, Misange wrote :

Bon, je suis trop nulle, je n'y arrive pas.
Je propose de reprendre le premier point, on verra les autres
après...
J'ai donc recopié ton code ci-dessous en rectifiant la 4ème ligne


dans la fenêtre de code de ton userform en haut tu as deux petits menus
déroulants. Tu sélectionnes celui de ton textboxdate dans celui de
gauche. Dans celui de droite apparaissent les événements que tu peux
intercepter. J'ai choisi de contrôler ici le contenu du textbox quand o n
en sort. Si le contenu est correct on passe au suivant, sinon, on reste
dedans et on recommence.
Si tu veux quelmques tutos sur les userforms pour débuter, tu en
trouveras sur excelabo avec des exemples à télécharger.

Private Sub TextBox_DateDoc_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     With TextBox_DateDoc
      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


Avatar
Dominique
On 20 nov, 17:26, Misange wrote :

Bon, je suis trop nulle, je n'y arrive pas.
Je propose de reprendre le premier point, on verra les autres
après...
J'ai donc recopié ton code ci-dessous en rectifiant la 4ème ligne
"Or .Value < 1982 Or .Value > 2034 _"
Tout marche très bien tant que j'y mets des chiffres. Dès que par
inadvertance je mets une lettre, j'ai un "message d'erreur 13 -
incompatibilité de type" et le débogage me surligne les lignes "
If Not IsNumeric(.Value) _
Or .Value < 1982 Or .Value > 2034 _
Or CInt(.Value) <> CDbl(.Value) Then



> dans la fenêtre de code de ton userform en haut tu as deux petits men us
> déroulants. Tu sélectionnes celui de ton textboxdate dans celui de
> gauche. Dans celui de droite apparaissent les événements que tu peu x
> intercepter. J'ai choisi de contrôler ici le contenu du textbox quand on
> en sort. Si le contenu est correct on passe au suivant, sinon, on reste
> dedans et on recommence.
> Si tu veux quelmques tutos sur les userforms pour débuter, tu en
> trouveras sur excelabo avec des exemples à télécharger.

> Private Sub TextBox_DateDoc_Exit(ByVal Cancel As MSForms.ReturnBoolean)
>      With TextBox_DateDoc
>       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


Avatar
Dominique
Bon, je suis trop nulle, je n'y arrive pas.
Je propose de reprendre le premier point, on verra les autres
après...
J'ai donc recopié ton code ci-dessous en rectifiant la 4ème ligne
"Or .Value < 1982 Or .Value > 2034 _"
Tout marche très bien tant que j'y mets des chiffres. Dès que par
inadvertance je mets une lettre, j'ai un "message d'erreur 13 -
incompatibilité de type" et le débogage me surligne les lignes "
If Not IsNumeric(.Value) _
Or .Value < 1982 Or .Value > 2034 _
Or CInt(.Value) <> CDbl(.Value) Then

Mais déjà, c'est un grand progrès.
Merci,
Dominique (qui a la touche envoi qui begaie...)
Avatar
michdenis
Misange est occupée,

Essaie quelque chose comme ceci, tu adaptes
le nom du textbox

'--------------------------------------
Private Sub Textbox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Dim Année As Long
With TextBox1
If IsNumeric(.Value) Then
Année = CLng(.Value)
If Année < 1982 Or Année > 2034 Then
MsgBox "Indiquez une valeur entre 1982 et 2034"
.SelStart = 0
.SelLength = Len(.Text)
Cancel = True
End If
Else
MsgBox "La saisie ne représente pas une ""année""." & _
vbCrLf & vbCrLf & "Indiquez une valeur entre 1982 et 2034"
.SelStart = 0
.SelLength = Len(.Text)
Cancel = True
End If
End With
End Sub
'--------------------------------------
Avatar
Dominique
On 20 nov, 21:52, "michdenis" wrote:
Misange est occupée,

Essaie quelque chose comme ceci, tu adaptes
le nom du textbox




Yes ! Ca marche et quoi que je saisisse.
Trop génial... C'est plus que du bonbon ;-)))

Est ce que j'abuse si je propose de passer au second point ?

"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… "

Si tu en as marre, pas de problème !

MERCI !
Dominique
Avatar
Dominique
On 20 nov, 22:15, Dominique wrote:

J'ai résolu le second problème en biaisant un peu : comme je me moque
que ces champs soient au format texte ou pas et qu'il n'y aura jamais
de calculs dans ce document, j'ai finalement été dans les options
Excel, règles de vérification des erreurs et j'ai désactivé les
"nombres mis en forme en tant que texte ou précédés d'une apostrophe" .
Zou !

Entretemps, j'ai adapté la dernière proposition de MichDenis à mes
autres champs bien que je ne comprenne pas la structure de cette
partie :
MsgBox "texte 1" & _
vbCrLf & vbCrLf & "Texte 2"
ce qui m'empêche de supprimer l'une des deux boites de message de
façon "propre".

Reste que ça marche de mieux en mieux, et que je suis super contente !
Merci encore,
Dominique.



"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… "

Si tu en as marre, pas de problème !

MERCI !
Dominique


Avatar
michdenis
Tu dois te rappeler qu'un textbox contient toujours du texte
mais si c'est des chiffres que tu saisis.

Lorsque tu veux transférer la valeur de ton textbox (du texte) vers
les cellules de ta feuille de calcul, tu dois utiliser les fonctions de
conversion d'excel. Tu peux regarder dans l'aide d'Excel sous
"fonctions de conversion"

Par exemple si la valeur numérique ne contient pas de décimale,
Range("A1").Value = Clng(Textbox1)

Avec valeur décimale
Range("A1").Value = Cdbl(textbox1)

Dans le dernier cas, tu sais, les fonctions de conversion utilisent les paramètres
définis dans le panneau de configuration de Windows. En conséquence, si tu
utilises la virgule comme séparateur décimale dans le panneau de configuration
et le point dans le Textbox lors de la saisie, la fonction Cdbl() ne sait pas travailler
avec le point... pour contourner ce détail, tu adaptes comme ceci :
Range("A1").Value = CDbl(Application.Substitute(TextBox2, ".", ","))

Et dans le cas d'une date dans ton textbox,
If isdate(textbox1) = true then
Range("A1").value = cdate(textbox)
end if

Et dans chaque cas, tu peux appliquer un format de cellule qui te convient.
Pour un format standard
Range("A1").NumberFormat = "General"

un format date
Range("A1").numberformat = "DD/MM/YYYY"





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

On 20 nov, 21:52, "michdenis" wrote:
Misange est occupée,

Essaie quelque chose comme ceci, tu adaptes
le nom du textbox




Yes ! Ca marche et quoi que je saisisse.
Trop génial... C'est plus que du bonbon ;-)))

Est ce que j'abuse si je propose de passer au second point ?

"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… "

Si tu en as marre, pas de problème !

MERCI !
Dominique
1 2 3