Valider modif dans formulaire saisie
Bonsoir à tous,
nouvelle dans le code VBA, alors c'est du chinois. J'ai réussi à faire un début de formulaire de saisie, mais je bloque. J'ai fait un bouton recherche sur le nom, quand je le valide, effectivement s'affiche la bonne fiche, si je modifie les données de cette fiche je voudrais enregistrer les modifications et qu'elles se placent au bon endroit dans mon fichier , voila je n'arrive pas à comprendre le code à mettre en place;
Merci à la personne qui pourrait me faire ce cadeau.
mon fichier n'est pas propre et le code encore moins.
Bonjour,
Pour commencer, une remarque, tu t'es embarqué dans une histoire à 40 colonnes...
Pour apprendre à programmer un UserForm une dizaine aurait été bien suffisant. Quand tu auras bien assimilé le principe tu verras alors si tu peux passer à une vingtaine et les nouveaux problèmes que ça pose.
Je peux t'assurer sans risque de me tromper qu'il y a fort peu de chance que tu arrives à créer la base de donnée que tu envisages.
Que ton classeur contienne tout cela, in fine... Pourquoi pas. Avec plusieurs bases de données bien construites et bien articulées... Ok !
Mais là, tu es très à coté de la plaque.
Une base de données c'est un peu comme dans une maison : Il y a la maison (le classeur) les pièces principales (la ou les bases de données) et les pièces secondaires... Les autres feuilles. Mais une maison sans compartiments, sans murs ni portes deviendrait vite un capharnaüm ingérable...
Ces précautions oratoires exprimées, passons au plat de résistance...
Quand on envisage de construire un UserForm, la première chose est déjà de savoir, où (sur quelle ligne) il va travailler.
Il faut donc créer une variable qui va mémoriser en permanence quel est l'enregistrement (la ligne) en cours.
Il faut donc créer une variable, que l'on alimentera avec le plus grand soin afin que ton formulaire sache à tout moment de quoi il parle.
Cette variable on va la créer dans le module du UserForm (USF) tout de suite après la première ligne :
Option Explicit
Dim CurrentRow as IntegerEnsuite dès que le Formulaire sera ouvert il faudra lui indiquer sur quelle ligne pointer.
Là il y a 2 écoles :
- parfois on lui fait pointer un enregistrement en particulier (le premier ou le dernier)
- parfois on lui fait pointer sur la première ligne vide.
Si l'on prend cette dernière hypothèse, on mettra dans la procédure d'ouverture de ton USF :
Private Sub UserForm_Initialize()
CurrentRow = Sheets("fichier general").Range("a65536").End(xlUp).Row + 1
End SubAinsi tu auras déjà en mémoire une ligne de travail potentielle... Qu'il t'appartiendra ensuite d'utiliser ou de modifier à ta convenance.
Comme nous sommes parti sur l'hypothèse que la ligne était vide, il n'y a donc rien de plus à mettre. Tu peux commencer à saisir et à la validation. Tu enverras le contenu de tes TextBox vers la ligne "CurrentRow"
Ok ?
Comme il se fait tard nous verrons demain matin comment ça se passe si nous voulons faire une recherche...
A+
Bonjour et merci beaucoup de ton aide.
J'ai supprimer les feuilles qui ne servaient à rien dans mon fichier qui étaient des essais.J'ai modifier le début de mon userform1 qui fonctionne avec tes données.
Voila ou j'en suis, je te retourne mon fichier modifier.
merci encore
Bonjour,
Bon somme toute, tu pourrais me dire : "Mais... Ce n'est pas ce que j'ai demandé ! "
Patience : Tu auras au moins appris une chose c'est que tu peux stocker en mémoire un N° de ligne et t'en resservir plus tard...
Mais il nous reste encore pas mal de chose à mettre au point avant de rendre ton UserForm fonctionnel dans toutes les situations.
Hum... J'ai été un peu lent ce matin, j'ai pas mal progressé mais j'ai encore quelques courses à faire : Le temps que je finisse de rédiger, on ne pourra rentrer dans le vif du sujet que vers la fin de l'après-midi.
Profites-en pour t'oxygéner les neurones et bénéficier des derniers rayons de soleil parce que pour la suite ça va être du musclé, hein... Tu auras besoin d'être en pleine forme pour "digérer" ce qui va suivre !
A bientôt.
Bonjour,
Pour commencer, une remarque, tu t'es embarqué dans une histoire à 40 colonnes...
Là, c'est sûr que les neurones vont chauffer mais comme disait Jacques Coeur, "à coeur vaillant rien d'impossible !"
Un élément est à mon sens primordial dans une base de données, c'est la clé unique c'est à dire un nombre, un mot, une combinaison alphanumérique, qu'importe pourvu qu'elle soit unique car il y à des homonymes et pour être sûr de faire les modifications sur la bonne cible la clé unique permet de différencier les enregistrements les uns par rapport aux autres.
Bonsoir à tous,
[Theze]
[mamouth]
Tu as une petite réserve de Doliprane ?
Bon ! Allons y.
Tu as bien compris la 1ère partie donc ton fichier était -à ce stade- à peu près semblable au mien.
Très loin d'être achevé parce après la validation il faut réinitialiser le UserForm (USF) mais tu pouvais comme ça ajouter des enregistrement à plus soif...
Bon mon fichier est un petit peu plus fini et si on en restait là tu pourrais remplir ta base de donnée avec sans problème.
J'y ai juste rajouté comme le faisait remarquer Theze une colonne d'indexation qui numérote les enregistrements au fur et à mesure de leur création.
Cette colonne index, invariablement la première est indispensable et tu ne dois pas y toucher (la modifier...) Elle est entièrement gérée par le programme pour produire une numérotation sans doublon pour chaque individus.
Ainsi tu peux avoir 2 DUPONT, 3 DURAND, 2 MARTIN et 3 ou 4 autres homonymes, tu pourras toujours les distinguer...
Bon je pourrais t'en faire 4 pages sur l'intérêt d'un index... Même si tu n'en est pas complètement persuadée, et que tu ne comprends pas tout, sache que tu ne peux guère y couper : Sans index, tu ne peux espérer gérer que tes amis sur Facebook, et encore... à condition qu'ils ne soient pas trop nombreux...
Bon tu remarqueras tout de suite que j'ai élagué et je ne me suis occupé que des 8 ou 10 premières colonnes, c'est plus simple pour se mettre de l'ordre dans les idées. Je n'ai pas pour autant supprimé le multipage ni les contrôle qu'il contenait, mais seuls ceux de la première pages sont actifs. Ceci dit à part ça, quand tu seras devenu une virtuose des USF tu pourras t'amuser à rajouter tout ce que tu veux...
Tu remarqueras aussi que j'ai supprimé la première ligne de la feuille (que j'ai renommé avec un nom un peu plus court), déplacé le bouton, remplacé la ligne manquante par un rectangles "COORDONNEES" ces rectangles pourront te permettre de séparer visuellement tes catégories de colonnes. (Dans la feuille de brouillon que j'ai gardé en souvenir j'ai ainsi ajouté le rectangle "RENCONTRE" sur quatre colonnes qui pourrait te permettre de rajouter aisément des colonnes supplémentaires en gardant ta présentation préférée. Mais pour l'instant là n'est pas le souci...
Bon je te mets ici cette première :
Le souci est que pour l'instant on ne peut faire que des ajouts, des ajouts et encore des ajouts...
Tu imagines facilement qu'en se basant sur le même principe on pourrait faire le même en couleurs, mais qui ne pourrait faire que des modifications... Le problème serait le même on ne pourrait faire que ça !
Le problème avec ton formulaire c'est qu'il est construit comme la cuisine de ma grand-mère (Paix à son âme !) : on y trouve un peu de tout... Le problème c'est qu'il n'y à aucun garde-fou... Si tu te trompes et tu mets du sel au lieu du sucre ou que tu renverses la casserole de sauce au chocolat : ton gâteau il est fini...
Tu pourras multiplier tous les messages "Etes-vous sûre..." ; Quand on fait une c... on n'est jamais assez certain de ne pas en faire !!
Ainsi tu pourrais bien rajouter un enregistrement sur la ligne ou en fait tu voulais faire une modification ou au contraire modifier le dernier enregistrement que tu as créé sans même t'en apercevoir et avec la bonne conscience du cancre moyen...
Avec le nouveau classeur que je te propose (plus bas) YAPA moyen de se tromper : Déjà il y a 2 moyens d'ouvrir le formulaire... En cliquant sur le bouton OU en faisant un clic droit sur la première colonne d'un enregistrement.
Le bouton ouvre toujours le formulaire sur la première ligne.
Le clic droit ouvre le formulaire sur l'enregistrement ou tu as cliqué.
Le formulaire s'ouvre toujours en mode Consultation : Tu ne peux que regarder tes fiches et parcourir ton fichier ou faire une recherche... Là ce n'est pas compliqué il n'y a que 2 enregistrements, mais s'il y en avait 20 ça serait pareil.
A partir du formulaire tu peux aussi choisir de modifier l'enregistrement en cours et là pas moyen de se tromper, pas besoin de se demander si on est certain..., on ne peut que valider la modif ou annuler...
C'est pareil pour un ajout ou une suppression : Dans tous les cas la ligne de titre en haut du formulaire te donne le statut du formulaire, Consultation, Modification, Ajout, Suppression et tu ne peux faire que les actions que tu as demandé...
En fait c'est ce qui manquait à ton Formulaire : Tu ouvrais un formulaire mais tu ne savais pas trop ce que tu en ferais..
Maintenant ton formulaire te propose 4 actions "A la carte" et tu ne peux pas commencer une action avant d'avoir terminé ou abandonné la précédente.
Je te laisse examiner la chose, Tout a été renommé et réglé avec des normes strictes. dans un UserForm on ne peut pas créer ses propres macros avec des noms fantaisistes. Tous les Noms (ou presque) sont prédéfinis dans VBA et là je pourrait t'en faire un livre...
J'ai volontairement choisi d'abréger parce que ce n'est pas l'objet du forum, mais si tu as besoin de détails ou d'explication supplémentaire : YAKA demander !
J'ai volontairement été minimaliste : Les saisies sont rentrées presque sans contrôle... Je me suis juste contenter de mettre les Noms en majuscules ainsi que les Noms des villes Ainsi qu'une majuscule pour les prénoms... Bien d'autres possibilité de mise en forme et de contrôle sont possible avant d'enregistrer une saisie... Que les N° de téléphone soit toujours à 10 chiffres, que les adresses emails soit valides, que les codes postaux aient le format approprié, ou que les dates soient valides. Tout cela reste à faire. Je me suis contenté de te proposer un moteur. A toi de faire les finitions...
Pour ta gouverne, sache également que le classeur joint est modélisé à partir d'une démo basique trouvé sur le net et dont il existe des versions plus récentes et plus élaborées, avec des possibilités de tris, de vérifier que tous les champs indispensable ont bien été saisis... Là encore c'est sur demande... YAKA !!
Nota : Voir aussi message en MP.
A+
bonsoir et merci pour tout ce travail
Je viens de comprendre et de réaliser quelquechose, je n'y comprend rien en langage VBA et je ne suis pas capable d'apprendre, j'ai 63 ans et c'est trop tard, je laisse la place aux spécialistes. je vais donc dans les jours qui viennent essayer de décortiquer ce que tu m'as donné comme infos. j'ai pu voir que ta fiche fonctionne. Plus tard si je peux je rajouterai mes onglets supplémentaires.
je ne pensais vraiment pas que c’était si compliqué. Je te remercierais jamais assez du temps et de l'humour que tu as employé pour les explications.
Je vais maintenant travailler
Pfff.... Ces petits jeunes !
63 ans c'est possible... Je l'ai fait ! Qu'est-ce que tu crois quand j'étais à l'école il n'y avait ni tablette, ni même télé...
C'est un bon moyen d'entretenir ses neurones et de faire la nique à Aloïs...
Et puis, on s'en fout maintenant... on à le temps !
Bonne journée !
A+
bonjour galopin
j'essaye de comprendre mais c'est dur. J'ai modifié un peu en fonction de ce que tu m'avais donné. Maintenant bien sur je suis coincée.
Voci mes questions :
1) Quand j'ouvre le formulaire, parfait pour les boutons, modifier, nouveau ou supprimer mais impossible de voir mes onglets si je ne clique pas sur le bouton modifier.
- J'aimerais si c'est possible pouvoir bénéficier de la fonction consultation simple de toute la fiche ( différents onglets), avant de choisir modifier ou supprimer.
2) Quand le formulaire s'ouvre, il s'ouvre sur le dernier onglet fermé, quand j'ouvre le fichier je souhaiterais qu'il s'ouvre sur la page coordonnées même quand j'utilise la fonction recherche.
Il y a beaucoup de choses que je ne comprends pas à quoi ça sert mais je me garde bien d'y toucher avant de trouver la solution
Merci encore pour ton aide.
bonsoir,
Pour "fixer" le multipage sur l'onglet coordonnées, modifier la macro OppositeStatus :
Sub OppositeStatus()
' Inverse la valeur booléenne des boutons d'action
' Modifie la propriété Caption du UserForm
' Repositionne le multipage sur le premier onglet
With Me
.cboClients.Enabled = Not .cboClients.Enabled
.MultiPage1.Value = 0
.frmClient.Enabled = Not .frmClient.Enabled
.MultiPage1.Value = 0
.frmAction.Visible = Not .frmAction.Visible
.cmdCancel.Visible = Not .cmdCancel.Visible
.cmdConfirm.Visible = Not .cmdConfirm.Visible
.cmdExit.Visible = Not .cmdExit.Visible
.frmNavigation.Visible = Not .frmNavigation.Visible
If .cboClients.Enabled = True Then UserFormStatus = Status.Consultation ' Consultation
usfTitle ' Titre du UserForm
End With
End SubNota : Ce n'est pas une erreur : il faut bien 2 fois la ligne : .MultiPage1.Value = 0
car on est dans une situation instable : on ne sait jamais quel est l'état du .frmClient
Dans les cas ou il est Enabled la première ligne va passer sinon c'est la deuxième qui sera ok car entre temps le switch aura basculé. (et vice versa...)
Je réfléchi à la possibilité de naviguer dans le multipage en mode Consultation et je te tiens au courant.
A+
merci de ta rapidité
je viens de copier ton code , après avoir testé je ne vois pas de changement, je suis désolé , il ne se fixe pas sur la page coordonnées mais sur celle AD3.
je cherche avec tes infos
merci encore, je crois que je ne le dirais pas assez
Mets ton fichier en pièce jointe.
desole, voici le fichier
bonsoir,
Aller dans VBA sur le UserForm
Cliquer sur la Fiche Client ou sur le Multipage
dans la fenêtre des propriétés sélectionner le Multipage et mettre sa propriété Value à 0
(si tu cliques sur l'onglet Coordonnées du Multipage il se remet à zéro tout seul.)
A chaque fois que tu vas dans VBA si tu cliques sur un autre onglet et que tu bricoles dessus, ça modifie cette valeur.
Là comme tu as rajouté un onglet, il a pris la valeur de cet onglet...
Quand tu quittes VBA et surtout le Userform, il faut penser à remettre le Multipage à zéro.
Bon, si vraiment tu as peur de pas y penser tu peux aussi mettre (dans la Private Sub Initialize) un :
Me.MultiPage1.Value = 0Mébon, si tu dois mettre un tas de post-it dans ton Initialize ton code, il va rapidement ressembler au bureau de Lagaff !
Le mieux c'est quand même que tu te serves de ta tête pour faire les choses bien.
Edit : Attention !
Excel est un calculateur... Pas un journal intime ! Pour reformuler : il est destiné à recevoir essentiellement des chiffres, pas des infos disparates.
Un tableau ne devrait pas comporter 2 colonnes avec le même en-tête (date/Note/résultat...)
Méconnaitre ces règles c'est s'exposer à une déception rapide...
A+