SOS codes VBA pour formulaire

kifa

XLDnaute Nouveau
codes VBA pour formulaire

Bonjour
Après avoir squatté ce forum pendant des mois, je vais enfin oser descendre dans le terrain avec beaucoup d'humilité et de gratitude.
Je débute en VBA et avec les quelques notions glanées dans les forums, je me suis concocté un tout petit programme pour, comme on dit, "mettre la main à la pâte". Mon projet consiste à créer (dans un classeur) un userform qui me permettra de saisir des données qui iront remplir une liste située sur une feuille nommée "liste". Le Userform sera appelé par un Bouton de Commande situé sur une autre feuille dénommée "Interface" et comporte 3 TextBox, 2 ComboBox, 1 groupe de 2 OptionButton et 2 CommandButton pour VALIDER et ANNULER. . Voilà! J'ai déjà créé tout ça (le formulaire et ses différents objets avec certaines mises en forme); le bouton de commande appelant est à sa place et fonctionne déjà via une macro que j'ai créée avec l'ENREGISTREUR DE MACROS. J'ai aussi défini les ControlSources pour chaque objet y compris pour les Boutons d'Option (qui sont aussitôt devenus grisés !?! ). :eek: Les ComboBox ont aussi leur RowSource défini et déroulent donc lés éléments de la liste de choix. Pour les OptionButtons un GroupeName a été défini. Chaque élément... heu "objet" a reçu un nom et un ordre de tabulation a été établi...
Voilà, je crois avoir mis en place le SQUELETTE (en attendant votre confirmation SVP) et il reste évidemment l'essentiel, l'âme! Ah oui! Les CODES qui doivent faire fonctionner tout ça. C'est là que s'arrêtent mes comppétences, mais non mes objectifs.
Je voudrais donc, que les informations saisies sur le userform aillent au fur et à mesure remplir une liste d'élèves placée sur la feuille "liste". Je préférerais que les nouvelles inscriptions soient ajoutées chaque fois en fin liste et nom par le haut (row 2) si possible?

Je joins le document en question, en espérant qu'une âme bienveillante veuille y jeter un coup d'oeil pour d'une part contrôler le travail déjà fait par moi, et d'autre part me fournir les codes nécessaires.

J'ai dis au début que je suis novice en VBA. Donc toute explication est la bienvenue.


fichier xls ci-joint: Cijoint.fr - Service gratuit de dépôt de fichiers

Merci
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Salut kifa et le forum
Déjà, les engueulades : Un fichiers xlsm ne peut être lu que par ceux qui ont de quoi le lire => tu fermes la porte à de nombreux dépanneurs qui ne disposent que de versions antérieures à 2007.
Un fichier peut, la pluspart du temps être enregistré au format xls, les demandes justifies rarement une obligation d'un xlsm.

un USF qui me permettra de saisir des données qui iront remplir une liste située sur une feuille nommée "liste".

y compris pour les Boutons d'Option (qui sont aussitôt devenus grisés !?! En règle générale, grisé signifie inactif (propriété Enable à False

Comporte 3 TextBox, 2 ComboBox, 1 groupe de 2 OptionButton et 2 CommandButton pour VALIDER et ANNULER.
Comme je n'ai rien que ton descriptif, je ne peux préjuger du fonctionnement voulu, donc, juste donner des généralités :
- Annulet : il suffit de fermer l'USF
- Le nom (prénom ?) : quand tu le rentres, il faut contrôler qu'il n'existe pas déjà : rentrer 15 fois le même nom dans la liste n'est pas trop "logique". S'il existe, tu remplis tes contrôles avec les valeurs existantes sur Liste, sinon, tu suis le fonctionnement "normal" => ça te permettra aussi de contrôler/modifier un enregistrement.
C'est un principe "base de données". Perso, je mets un numéro unique qui me servira d'identifiant.

- Valider : rien ne se passe sur la feuille liste, tant qu'il n'est pas cliqué.
2 fonctionnements :
-- Il existait déjà : on le recherche et on rempli les autres colonnes, une fois qu'on l'a trouvé : ATTENTION : soit tu as un identifiant hors données, et tu recherches à travers l'identifiant. Soit tu te sers de données (Nom/Prénom, par exemple) comme identifiant. dans ce cas, tu ne pourras pas modifier ces données. Peut être génant, surtout si tu n'as pas bien relu tes données avant de valider (un nom mal orthographié, par exemple). Tu peux résoudre le problème en créant un bouton supprimé, mais tu seras obligé de tout resaisir.
-- Il n'existait pas, tu fais une recherches sur une colonne qui est obligatoirement remplie, et tu vas chercher la première cellule (ligne) vide de cette colonne, après tes données :
Code:
Dim Lig as Long
'..............
With sheets("Liste")
    Lig = .range("A" & rows.count).end(xlup).row +1
    '.............
    .Range("B" & Lig) = me.textBox2  'ce n'est qu'un exemple
    '............
End With
tu peux aussi, lors de la première recherche, si tu as trouvé la ligne, la mettre en valeur globale (déclaration en tête du module, avant les macros) et faire un test : si vide, rechercher la ligne, sinon, ce servir de celle existante : dans ce cas, ne pas oublier de la remettre à 0, juste avant de sortir de la macro de validation.
Juste quelques explications rapides :
"With AAA" permet de mettre en préfixe, aux instructions commençant par un "." AAA. Je ne mets pas de point devant Rows.count (c'est peut-être une erreur), parce que toutes les feuilles d'un classeur ont le même nombre de lignes. et donc, là, comme on ne définit pas la feuille, par défaut c'est celle qui est active.
End(xlup) : donne la première ligne (.row) non vide (qui change d'état (Vide/Non Vide), en vérité) en partant de la dernière ligne de la feuille (rows.count = nombre de lignes de la feuille active) et en remontant. Comme je veux celle qui suit (qui est vide), je lui ajoute 1.
Je ne prends qu'une seule référence de ligne, pour que toutes les données que je sauvegarde, soit sur la même ligne : le faire pour chaque colonne peut entraîner des décalages.
Pour le goupe : Option1=Vrai implique que l'option2 soit à faux (et versa dans le vice :p). Mais il faut voir comment on exploitera la donnée : ça peut nécessité deux colonnes, si on imprime la feuille liste, par exemple.

Comme tu vois, ce ne sont que des généralités, ne pouvant ouvrir ton fichier (Ouais, je sais, je peux par Ooo.org, mais j'ai pas envie, na !)
A+
 

MJ13

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Bonjour Kifa, Gorfael.

Déjà, les engueulades : Un fichiers xlsm ne peut être lu que par ceux qui ont de quoi le lire => tu fermes la porte à de nombreux dépanneurs qui ne disposent que de versions antérieures à 2007.

Gorfael: Il existe un programme qui permet de rendre compatible un fichier XL2007 en XL2003. Ce serait bien de le télécharger (faire une recherche sur le net). Car on va avoir de plus en plus de fichier XL2007 :).
 

Gorfael

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Salut MJ13 et le forum
Il existe un programme qui permet de rendre compatible un fichier XL2007 en XL2003.
Ouaf, ouaf, ouaf :p. Je le sais, j'ai même une possibilité par Ooo.org. Juste une réflexion : qu'est-ce que j'en ai à faire ? Si les demandeurs ne font pas d'efforts, pourquoi se serait à moi d'en faire ? Si ton problème n'est pas solutionné rapidement, ça ne m'empêchera pas d'en dépanner d'autres.
A+
 

MJ13

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Re

Kifa: Voici un début qui m'a pris 5 minutes à faire (en fait un peu plus ;)).

Je te laisse l'adapter aux autres items. Une fois qu'on a compris, c'est très simple :).
 

Pièces jointes

  • MaListeAvecFormulaire_bis.xlsm
    38.9 KB · Affichages: 456

kifa

XLDnaute Nouveau
Re : SOS codes VBA pour formulaire

Salut Gorfael et MJ13
Merci de l'attention mais surtout de la patience face à ces maladresses de novice.


"Déjà, les engueulades : Un fichiers xlsm ne peut être lu que par ceux qui ont de quoi le lire => tu fermes la porte à de nombreux dépanneurs qui ne disposent que de versions antérieures à 2007."


Désolé pour le fichier xlsm, je ne savais pas.! Un premier post et déjà une première grosse bêtise que je vais tout de suite réparer en joignant cette fois-ci le fichier sous forme xls. Je dormirai ce soir moins bête. :confused:
Vous avez raison, il se peut que j'aie mal décrit mon problème ce qui ne facilite pas les solutions.
J'ai voulu dire que je cherche à programmer un formulaire de saisie qui comporte des TextBox, des ComboBox, des Boutons d'option et des Boutons de commande. J'ai la structure et je cherche des pistes pour écrire les codes.
Vous tapez aussi dans le mille quand vous dites qu'il faut mettre en place un dispositif de modification et de suppression des enregistrements. Mais pour le moment je crois qu'il est pédagogiquement plus sage que je me limite à ce premier exercice. Je vais voir de plus près les codes que vous me proposez vous et MJ13. J'aviserai.

MJ3,
Je vais regarder vos codes. Cela me donnera peut être une ou des idées. Pour le moment ça ne fonctionne pas surtout pour le bouton de validation. Je rappelle que ce sont mes premiers pas en programmation.

Merci à vous
 

kifa

XLDnaute Nouveau
Re : SOS codes VBA pour formulaire

Salut Gorfael et MJ13
Merci de l'attention mais surtout de la patience face à ces maladresses de novice.


"Déjà, les engueulades : Un fichiers xlsm ne peut être lu que par ceux qui ont de quoi le lire => tu fermes la porte à de nombreux dépanneurs qui ne disposent que de versions antérieures à 2007."


Désolé pour le fichier xlsm, je ne savais pas.! Un premier post et déjà une première grosse bêtise que je vais tout de suite réparer en joignant cette fois-ci le fichier sous forme xls. Je dormirai ce soir moins bête. :confused:
Vous avez raison, il se peut que j'aie mal décrit mon problème ce qui ne facilite pas les solutions.
J'ai voulu dire que je cherche à programmer un formulaire de saisie qui comporte des TextBox, des ComboBox, des Boutons d'option et des Boutons de commande. J'ai la structure et je cherche des pistes pour écrire les codes.
Vous tapez aussi dans le mille quand vous dites qu'il faut mettre en place un dispositif de modification et de suppression des enregistrements. Mais pour le moment je crois qu'il est pédagogiquement plus sage que je me limite à ce premier exercice. Je vais voir de plus près les codes que vous me proposez vous et MJ13. J'aviserai.

MJ3,
Je vais regarder vos codes. Cela me donnera peut être une ou des idées. Pour le moment ça ne fonctionne pas surtout pour le bouton de validation. Je rappelle que ce sont mes premiers pas en programmation.

Merci à vous

PS: Le fichier sous format xls dépasse la taille admise dans ce site, je le transmets donc via cette adresse: Cijoint.fr - Service gratuit de dépôt de fichiers
 

Papou-net

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Bonjour kifa, Gorfael, MJ13,

RE kifa

Voici ton fichier modifié.

J'ai mis quelques explications dans le code du bouton <Valider>.

Il faut retenir que j'ai supprimé les références <ControlSource> de tes boîtes de saisie, car elles sont figées et ne tiennent pas compte donc de l'évolution de la liste.

Il y a moyen de faire plus simple, notamment au niveau des boutons d'options, mais j'ai voulu respecter la "philosophie" de ton programme.

Si tu as besoin d'autres éclaircissements, n'hésites pas à revenir sur ce fil.

Cordialement.
 

Pièces jointes

  • kifa.zip
    24 KB · Affichages: 334

kifa

XLDnaute Nouveau
Re : SOS codes VBA pour formulaire

Bonjour Papou-net,

Merci du coup de main. Cela marche et les explications sont claires même pour le nul que je suis. Je vais plonger dans le code et les propriétés des boutons d'option pour mieux comprendre les modification apportées. C'est ce que je cherchais: un audit de ce que j'avais concocté sans conviction.

Il reste maintenant à paramétrer le bouton VALIDER pour qu'il efface les données sur le formulaire après leur enregistrement sur la liste. J'ai remarqué que chaque fois que j'appuie sur le bouton valider il répète les mêmes enregistrements avec les infos restées sur le formulaire et s'il y un vide (sur le formulaire) il enregistre un vide (sur la liste) qu'il sautera lors d'un autre enregistrement.

Autre intéressante idée soulevée par Gorfael plus haut: la mise en place d'un dispositif de modification et de suppression des enregistrements. Qu'en penses-tu?

"Il y a moyen de faire plus simple, notamment au niveau des boutons d'options, mais j'ai voulu respecter la "philosophie" de ton programme."

N'hésite surtout pas pour me filer des tuyaux, je ne saurais suffisamment te remercier, toi et tous les autres.

Merci et bonne journée
 

MJ13

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Re, Bonjour Papou

Kifa: Le soucis avec XLD est que, à mon avis, il faut déjà essayer de comprendre la démarche de Papou qui est très claire.

En fait, à la fin du bouton valider, il suffit de remettre les textbox que tu veux effacer à "" (voir mon code). Le mieux est d'essayer de le faire par toi même (il n'y a rien de tel pur comprendre ce qui se passe).

Ensuite avec la touche F1 dans l'éditeur VBA, tu peux regarder les concepts important des userform avec show, hide, load, unload.

Car tout dépend de ce que tu veux faire. Ainsi si tu entres les élèves d'une classe, le mieux est de ne pas remettre la classe à classe1 à chaque fois (d'ou un gain de temps). Mais c'est vraiment à toi de le faire en fonction de ton besoin.

De plus il vaut mieux séparer date et lieu de naissance car la, il faut toujours penser base de données avec 1 champ pour 1 information.

Ensuite tu peux revenir avec ton état d'avancement.
 
Dernière édition:

kifa

XLDnaute Nouveau
Re : SOS codes VBA pour formulaire

Salut, MJ13,
Voilà j'ai mis une partie de ton code dans celui de Papou-net en mettant les textbox sur "", comme tu l'a recommandé, et ça marche. Le formulaire est réinitialisé après validation. Mais les enregistrements se font toujours à vide. J'ai lu quelque part un code qui affiche un message qui rappelle l'obligation de remplir tous les textBox. C'est un peu long mais je vais essayer de l'adapter à mon cas. J'aviserai ensuite.

Merci
 

kifa

XLDnaute Nouveau
Re : SOS codes VBA pour formulaire

Re-Salut tous

Me voici de retour. Après adaptation j'ai ajouté (inséré) le code suivant histoire d'empêcher les enregistrements à vide. Mais ça ne va pas. Je le colle au cas où...

' La variable Message sera complétée au fur et à mesure des tests qui suivent
Message = ""
'* Les messages sont préparés pour leur utilisation dans une boîte de message
Message1 = "Vous avez oublié de mettre le prenom."
Message2 = "Vous avez oublié de mettre le nom."
Message3 = "Vous avez oublié de préciser le sexe"
Message4 = "Vous avez oublié de mettre la date denaissance."
Message5 = "Vous avez oublié de sélectionner une classe."
Message6 = "Vous n'avez pas sélectionné une école."
'* Les contrôles Nom et Catégorie doivent obligatoirement être complétés.
'* Si le contrôle Nom ou le contrôle Catégorie est vide,
' le message 2 sera affiché
If prénoms = "" Then
Message = Message1
End If

If nom = "" Then
Message = Message2
End If

If sexe = "" Then
Message = Message3
End If

If DateEtLieuDeNaissance = "" Then
Message = Message4
End If

If Classe = "" Then
Message = Message5

If ecole = "" Then
Message = message6
End If

End If


If Message <> "" Then
m = MsgBox(Message, vbOKOnly, "Erreur de saisie")
'* Si la variable Message est vide, il n'y a aucune erreur
' dans la boîte de dialogue
Else
Entrée
End If

End Sub
Sub Entrée()

Load formulaireDinscription
formulaireDinscription.Show

'Copie des données de l'intervention'
 

Papou-net

XLDnaute Barbatruc
Re : SOS codes VBA pour formulaire

Re : kifa,

Voici un exemple de macro avec gestion détaillée des erreurs.

Elle reste à compléter, car je n'ai pas le courage de terminer ce travail ardu. Je pense d'ailleurs, qu'en dehors du "Fun", c'est une gestion trop lourde eu égard à la simplicité de ton formulaire. A mon humble avis, il suffirait de ne traiter que le cas où Err est supérieur à 0, l'opérateur de saisie n'ayant aucun mal à visualiser les oublis.

Je t'ai quand même adressé ce code pour te montrer la possibilité de gérer des données en utilisant la formule de poids des bits (1, 2, 4, 8,16, 32, ...). L'addition de n'importe quels chiffres de cette suite donne une combinaison unique, qu'il est facile d'exploiter dans le programme.

Espérant t'avoir quelque peu éclairé.

Bon courage.

Cordialement.

Code:
Private Sub valider_Click()
Dim Lg As Long, Err As Integer, Mess As String
' Gestion des erreurs
Err = 0 'Initialisation de la variable Erreur
If prenom = "" Then Err = Err + 1 ' si prenom vide, ajoute 1 la variable Erreur
If nom = "" Then Err = Err + 2 ' si nom vide, ajoute 2 à la variable Erreur
If Sexe_M = False And sexe_F = False Then Err = Err + 4 ' si sexe vide, ajoute 4 à la variable Erreur
If DateEtLieuDeNaissance = "" Then Err = Err + 8 ' si dateetlieudenaissance vide, ajoute 8 à la variable Erreur
If classe = "" Then Err = Err + 16 ' si classe vide, ajoute 16 à la variable Erreur
If ecole = "" Then Err = Err + 32 ' si ecole vide, ajoute 32 à la variable Erreur
' les différentes valeurs que peut prendre la variable Erreur :
' 1 = prenom vide
' 2 = nom vide
' 3 = prenom + nom vides
' 4 = sexe non mentionné
' 5 = prenom et( sexe vides
' 6 = nom et sexe vides
' 7 = prenom, nom et sexe vides
' 8 = dateetlieudenaissance vide
' 9 = prenom et dateetlieudenaissance vides
' 10 = nom et dateetlieudenaissance vides
' etc ....

' Définition du message en fonction de la valeur de la variable Erreur
Select Case Err
  Case 1
    Mess = "Saisie du prénom obligatoire !"
  Case 2
    Mess = "Saisie du nom obligatoire !"
  Case 3
    Mess = "Saisies du prénom et du nom obligatoires !"
  Case 4
    Mess = "Indication du sexe obligatoire !"
  Case 5
    Mess = "Saisies du prénom et du sexe obligatoires !"
  Case 6
    Mess = "Saisies du nom et du sexe obligatoires !"
End Select
If Not Err = 0 Then ' si la variable Erreur est > à 0, affiche le message adapté et sort de la procédure
  MsgBox Mess
  Exit Sub
End If
' Enregistre les données sur la feuille
With Sheets("liste") ' toutes les références précédées d'un point seront attachées à la feuille <liste>
  Lg = .Range("B65536").End(xlUp).Row + 1 ' détermine la 1ère cellule vide en colonne C (NOM)
  ' affecte les valeurs des contrôles aux cellules idoines
  .Cells(Lg, 2) = prenom
  .Cells(Lg, 3) = nom
  If Sexe_M = True Then .Cells(Lg, 4) = "M"
  If sexe_F = True Then .Cells(Lg, 4) = "F"
  .Cells(Lg, 5) = DateEtLieuDeNaissance
  .Cells(Lg, 6) = classe
  .Cells(Lg, 7) = ecole
End With
End Sub
 

kifa

XLDnaute Nouveau
Re : SOS codes VBA pour formulaire

Bonsoir Papou-net, Mj13, Gorfael...

Grâce à votre aide me voici au delà des mes objectifs de départs. Mon formulaire (mon premier) fonctionne bien sauf quelques petites finalisations que je pourrais régler moi même. Car j'y vois de plus en plus clair dans l'imbroglio VBA. Soyez en tous remerciés.

Merci à tous
 

Discussions similaires

Réponses
17
Affichages
645
Réponses
18
Affichages
627
Réponses
9
Affichages
161

Statistiques des forums

Discussions
312 211
Messages
2 086 286
Membres
103 170
dernier inscrit
HASSEN@45