Impossible de valider des données dans un userform
Bonjour,
je n'arrive pas à comprendre pourquoi, il m'est impossible de valider les données saisies dans mon formulaire. J'ai tenté de réutiliser le code qui m'a été donnée hier sur ce forum mais je ne parviens pas à le faire fonctionner.
Merci pour votre aide
Cordialement
Bonjour,
à première vue, pourtant ça arrive bien à exporter les données du formulaire dans ta base de données, si ça ne fonctionne pas car tu renseignes un nom, c'est car tu cherches un nom qui n'est pas encore renseigné, pourrais-tu donner plus d'informations sur ce qui ne marche pas dans ton formulaire? Parce qu'à première vue tout fonctionne...
Bonjour,
j'arrive effectivement à valider à la création du nom (même si tous les champs ne se remplissent pas automatiquement). En revanche, si je souhaite effectuer un changement en revenant sur le formulaire, la validation ne fonctionne pas et je rencontre une erreur.
De plus, le champ "enseignante" ne fonctionne pas alors qu'il est codé comme les autres. Bizarre bizarre !!
(Il ne fait aucun doute que je suis le responsable de ce dysfonctionnement)
Merci pour votre aide
Cordialement
Rebonjour,
En effet c'est bizarre, si j'essaye juste d'exporter enseignante ça marche, mais ça écrit par dessus l'autre ligne, pour moi le premier soucis c'est que ton bouton validation devrait être séparé en deux boutons, un bouton ajouter, un bouton modifier, dans un cas tu cherches un enregistrement qui est déjà dans la base de données, dans l'autre cas tu te contentes juste d'aller à la première ligne vide, et toi tu as une fonction de modification qui te permet d'exporter et de modifier...
Sinon je ne vois pas de soucis sur l'écriture de l'export de la liste enseignante, pour moi ça marche, mais ça efface ta ligne...
Je te donne des pistes de résolution mais... Première chose que tu dois faire c'est séparer modification/ajout, dans un cas la ligne d'écriture est celle qui contient la donnée souhaitée (avec un find), dans l'autre cas, la première ligne vide (on fait du range.end(xlup).row).
Commence par là et tu commenceras à debuguer ton fichier
Bonjour, Salut Ausecour !
ligne = Sheets("BD").[B:B].Find(ChoixNom, LookIn:=xlValues).RowCette ligne-là pose certainement problème...
Je dirais sur le principe que la validation d'un ajout ou d'une modification d'enregistrement dans une base de données est identique, à un seul élément près, la ligne d'insertion :
- en cas d'ajout, c'est la première ligne vide...
- en cas de modification, c'est la ligne origine.
Cette ligne on en dispose au choix de l'enregistrement à modifier : il suffit de la conserver pour assurer ultérieurement la validation sur cette ligne !
Plus, de cette façon on n'a plus besoin de se soucier de savoir s'il s'agit d'un ajout ou d'une modif., on a un critère significatif : on dispose d'une ligne, c'est une modif., on n'en dispose pas, c'est un ajout, et on la calcule...
Autre aspect : quelle base de calcul d'une ligne d'insertion ?
Tu disposes déjà d'une plage nommée élèves, nommée (bien qu'un peu bizarrement de façon dynamique, elle constitue donc une référence te permettant d'intervenir sur ta base de façon sûre à tout moment. Une plage nommée te permet d'y accéder directement sans passer par un autre objet, tu peux donc oublier la feuille et utiliser la plage nommée de ta base pour y accéder directement...
Cette plage alimente déjà ta Combo de choix. Lors d'un choix, le .Listindex + 1 de la Combo est le numéro de ligne dans [élèves] (pas dans la feuille, mais tu affectes tes données modifiées à : [élèves].Cells(ligne, colonne), ligne étant la ligne que tu as conservé depuis le choix dans la Combo.
Et s'il s'agit d'un ajout, ligne n'étant pas définie, tu la définis par : [élèves].Rows.Count + 1.
Si on récapitule : tu déclares ta variable ligne (qui n'est d'ailleurs pas déclarée) au niveau Module.
Dim ligne As IntegerDans ta proc. ChoixNom :
ligne = ChoixNom.ListIndex + 1Mais tu poursuis par :
With [élèves]
nom = .Cells(ligne, 1)
'etc.C'est quasiment la même chose que ce que tu fais, mais tu cibles directement la base et non la feuille sur laquelle elle se trouve, et tu es en adressage non sur la feuille mais relatif à ta plage nommée de la base.
Et validation :
Private Sub B_validation_Click()
With [élèves]
If ligne = 0 Then ligne = .Rows.Count + 1
.Cells(ligne, 1) = nom.Value
'etc.Si ligne n'est pas définie, c'est que tu es en ajout, tu affectes donc le nombre de lignes de ta plage nommée +1.
Et tout se déroule pareil, mais l'adressage est plus simple et plus sûr.
Il ne faudra pas non plus oublier dans ta proc. d'effacement, lorsque tu réinitialises tes contrôles, de rejouter :
ligne = 0NB- Et tu as encore une bonne marge d'amélioration de ton code si tu te mets en mesure de travailler avec des boucles au lieu de procéder cellule par cellule...
Cordialement.
Merci MFerrand et Ausecours pour votre aide,
je suis désolé d'être un "poil" lourd mais je ne parviens pas à faire fonctionner le code avec vos conseils. Je suis autodidacte et il me reste une longue route pour que je puisse un jour apporter mon aide comme vous le faites pour moi.
Je pense avoir placé le code correctement, conformément aux indications mais le formulaire ne se charge pas.
MFerrand, quelle rubrique dois-je consulter pour alléger le code ? (si tant est que je puisse y arriver)
Merci pour votre aide
Cordialement
Bonjour,
C'est normal que tu n'arrives pas à lancer ton formulaire, l'erreur te dit que tu as des lignes d'instructions qui se trouvent en dehors du sub, quand on revoit à quoi ça nous ramène on voit tout de suite le soucis :
Sub ouvreform()
UserForm.Show
End Sub
Dim ligne As IntegerDim ligne As Integer s'est invité en dehors du Sub et VBA t'empêche de lancer le formulaire car il aperçoit une erreur dans ton Module 1...
Si tu passes cette ligne en commentaire ou que tu la supprime, ça t'affichera le formulaire, une des premières choses à faire quand tu es autodidacte en VBA, c'est de comprendre ce que t'affiche le débogage, crois moi, ça permet de mieux orienter la résolution des bugs
Re,
Lorsque j'ai conseillé de déclarer une variable niveau Module, il s'agissait du module du Userform, c'est là que tu t'en sers, et tu l'initialises à partir de ce Module...
NB- Les déclarations de niveau Module sont toujours placées en tête de module, de façon qu'elles aient déjà été prises en compte par VBA lors de l'exécution.
Cordialement.
MFerrand,
je dois bien l'avouer, je suis perdu. J'ai bien placé le code au bon endroit et voilà que cela bloque ailleurs. Je n'arrive à modifier un champ dans le formulaire et le code bloque au chargement des images. Le problème du champ "enseignante" est réglé (il manquait un point !!!)
Je continue à creuser pour le reste du code mais c'est perturbant de régler un souci d'un côté et de voir un autre apparaître aussitôt.
Avec l'expérience, je gagnerai en patience.
Merci pour votre aide
Cordialement
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
j'ai procédé à quelques corrections :
1- au niveau syntaxe des "End With" et des "End If" étaient manquants
2- mis en commentaire une ligne posant problème
3- comme expliqué plus haut par M.Ferrand, la variable "ligne" doit être placée en début du module UserForm afin que sa valeur soit disponible dans toutes les procédures du module
4- votre combobox "choixnom" ne doit pas être chargée par la propriété "RowSouce " car son contenu est modifié à l'exécution, ce qui introduit des dysfonctionnements. Il faut la charger par la propriété "List".
5- vous avez introduit dans votre BD une numérotation des colonnes qui me parait superflue. Vous pouvez parfaitement identifier vos colonnes via ce type d'instruction :
nom = .Cells(ligne, "A")plutôt que
nom = .Cells(ligne,1)NB : Si vous supprimez votre ligne de numérotation des colonnes dans votre BD, il faudra alors mettre à jour la référence de plage ayant pour nom "élèves", comme ceci :
=DECALER(BD!$A:$AM;1;;NBVAL(BD!$A:$A)-1) Dernière remarque : utiliser le débogage soit via une exécution pas à pas (touche F8), soit en collant des points d'arrêt (clic gauche sur la bande grise à gauche des instructions ou touche F9).
Bonjour,
cela fonctionne parfaitement. Un grand merci pour votre patience.
Cordialement