Insertion automatique d'une valeur incrémentée de 1 dans le UserForm
Bonjour à tous,
Je débute en VBA et espère avoir le bon lexique
Sous Excel2016, j'ai créé un UserForm pour enregistrer de nouveaux cardex client à l'aide d'un formulaire.
Dans mon ficher/onglet "société", ma colonne R comprend un CodeClient qui doit se générer automatiquement à la création de chaque nouvelle ligne (avec incrémentation de 1). Que cette création soit manuelle ou par le biais du formulaire....
J'avais mis un fonction =LIGNE sur la colonne R du fichier existant, mais je me rends compte que cela ne fonctionne pas à la création d'une nouvelle ligne...
Je voudrais juste qu'Excel délivre un numéro automatiquement dès q'une nouvelle ligne est créée dans ce fichier.
Peut-être faut-il passer par le codage du btnNouveau.
Pourriez-vous m'assister svp?
Merci d'avance
MissB
Bonjour et
Je pourrai répondre simplement à ta question en te donnant cette ligne à modifier à la fin de ta
Private Sub btnNouveau_Click
ActiveCell.Offset(0, 17).Value = WorksheetFunction.Max(Range("CodeClient")) + 1et ça marcherait !
Cependant tu ne serais pas beaucoup plus avancée car l'utilisation de ton UserForm serait toujours aussi problématique.
En pratique on ne commence pas un UserForm avec le bouton "Ajouter" :
Pour une raison simple avant d'ajouter il faut déjà être capable de visualiser ce qu'il y a dans ta feuille (pour ne pas créer de doublon...)
Donc ton UserForm doit déjà être capable de naviguer dans ta "base de donnée" Rechercher et Modifier l'existant avant d'être en mesure de rajouter éventuellement une ligne et... plus tard éventuellement d'en supprimer une.
Tu as déjà un bon petit UserForm avec des contrôles pas trop mal fichus, donc avant de partir un peu dans n'importe quelle direction, je te propose de repartir sur des bases saines en permettant d'abord à ton UserForm de naviguer dans une "Base de Donnée" et éventuellement de Rechercher l'existant.
Je serais absent toute la journée, mais habituellement je suis plutôt disponible, je te propose donc si tu en es d'accord de reprendre ça au début afin de réaliser quelque chose de cohérent.
A te relire...
Bonjour Galopin01,
Excellent c'est exactement ce qu'il me fallait pour le codage !!!
Cela fonctionne à merveille. Merci mille fois, je cherchais depuis des heures...ouf!
Effectivement, j'ai déjà prévu les fonctions de recherche avec le btnSearch à côté du txtSociété et la fonction de modification avec le btnModifier; mais j'avais pensé commencé par le plus simple côté codage
Oui pourquoi pas, je veux bien quelques conseils afin de me créer un outil sain ; d'autant que j'ai une idée assez clair de ce que je souhaite obtenir au final...
Pour le btnSearch j'essaie de créer un codage qui me permettra, au moment de cliquer sur le btn, d'ouvrir une fenêtre/pop-up avec le message "Cardex existant" si le nom de la société renseigné à côté existe déjà dans la bdd + btn "Ouvrir" (ouverture du cardex concerné) et btn "Ok" (annuler la saisie).
Je voudrais aussi qu'en étant placé sur le txtSociété et en tapant Enter sur le clavier, cela reproduise la même fonction que le btnSearch...
Bon je vais continuer à potasser là-dessus en attendant de te lire!
Excellente soirée et encore un grand merci
MissB
bonjour,
Le code qui correspond à ta demande est :
Private Sub txtSociété_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim o As Object
If txtSociété <> "" Then
Application.ScreenUpdating = False
With Worksheets("Société")
Set o = .Range("B:B").Find(txtSociété, LookIn:=xlValues, LookAt:=xlWhole)
If Not o Is Nothing Then MsgBox "Cette société existe déjà"
End With
End If
End SubEt pas besoin de bouton pour ça : Il suffit de valider par Enter ou Tab.
Toutefois je te réitère ma remarque : Tu mets un peu la charrue avant les boeufs !
Un UserForm est quand même quelque chose de complexe ça ne se programme pas avec quelques bouts de code péchés ici ou là. De cela tu ne feras qu'une usine à gaz inextricable et au bout de quelques centaines de lignes de code inutile tu seras bien obligée de repartir à zéro...
Donc si tu ne veux pas perdre ton temps en recherche et programmation infructueuse, tu ferais bien de tenir compte des remarques suivantes :
1 - Il est communément admis que la colonne Index (Code Client) doit se trouver en premier dans ton tableau.
Pour la déplacer Sélectionner la colonne + Clic Droit + Couper puis...
Clic Droit sur la colonne A + Insérer les cellules coupées.
2 - Normalement il est convenu de choisir dès le départ si tu veux voir (afficher) ta base de donnée quand le UserForm s'ouvre ou si au contraire tu préfères qu'elle reste masquée : Comme visiblement tu débutes dans cet exercice je te conseille de l'afficher dès le départ : Il sera toujours temps quand ton UserForm sera terminé de le piloter depuis un menu. Me confirmer si tu acceptes cette proposition. Mais il faudra aussi définir dès maintenant si l'intention finale est de laisser la feuille Société masquée ou non...
3 - Un Userform ne devrait pas comporter de Activate, Select, ActiveCell, ni ActiveSheet... De ta réponse dépendra la manière dont s'affichera ton UserForm.
4 - Il est également préférable d'éviter les caractères accentués dans les noms des contrôles.
Si tu veux t'entrainer à taper sur ton clavier tu peux continuer de mettre des noms à rallonge. Pour moi, des noms de contrôles à 7 caractères c'est bien suffisant pour y retrouver ses petits dans la majorité des cas... (et 5 c'est encore mieux!) Alors des lblZoneGeographique qui de toute façon ne serviront à rien tu aurais bien pu laisser Label14 ou 17...
Bon enfin de toute façon de ce coté là si tu as besoin d'un peu d'entrainement tu fais comme tu veux...
Remarque : Des noms trop long finissent par rendre le code incompréhensible.
Ainsi CboCat aurait été aussi explicite que cboCatégorie
txVil, txArea, txMel1, txMel2, txAdr ou txTel sont tout aussi explicit.
L'abrévation usuelle pour les boutons c'est cb et
cbOk, cbNew, cbMod cbDel, cbExit sont en général bien compris de la plupart des programmeurs.
Quand à l'utilisateur lambda lui vu qu'il ne mettra jamais le nez dans le code, Il s'en f... pas mal.
Pour ce point 4 comme tu as été relativement raisonnable dans ton classeur joint tu peux le laisser dans l'état, mais j'ai préféré te faire la remarque pour info.
5 - Dernier point préliminaire : Une programmation qui utilise les noms de feuilles (ou de classeur) court le risque de planter un jour ou l'autre parce que volontairement (ou pas) un utilisateur final aura renommé une des feuilles....
Aussi les programmeurs un peu expérimentés n'utilisent guère ces noms de feuille, mais plutôt le "CodeName" de ces feuilles qui lui est inconnu de l'utilisateur final et de ce fait ne changera jamais.
Le CodeName des feuilles est visible dans la fenêtre VBAProject
Ainsi pour l'instant ta feuille Société a pour CodeName "Feuil1" (C'était son nom natif)
Il est aisé de le renommer dans la fenêtre des propriétés (Cette feuille étant sélectionnée dans VBA Project) remplacer
son Nom "Feuil1" par WsS par exemple
remplacer "Feuil3" par WsM par exemple
et "Feuil2" par WsP par exemple
Ensuite dans le code quand on voudra parler de la feuille Société au lieu d'écrire With Worksheets("Société")
On écrira
With WsSDans l'exemple ci-dessous les CodeName ont été nommés Ws1,Ws2 et Ws3, mais c'est la même idée...
6 - Je rajouterai encore dans les préliminaires qu'un TextBox recherche semble assez peu adapté : La plupart du temps un Combo est adopté (en plus du TextBox). Les raisons sont multiples...
Afficher la fiche trouvée -s'il y en a une- n'est pas suffisant : En cas d'homonyme nombreux ce qui est très fréquent tu fais quoi ?
Donc il est urgent de prévoir tout de suite de pouvoir "Naviguer" parmi tes fiches : Si tu as 2 clients qui s'appelle "MARTIN" et 3 autres CARREFOUR, il faudra bien que tu puisses choisir parmi ces homonymes lequel est le bon ou s'il faut en rajouter un autre...
En fonction de ta réponse sur ces 6 points, si tu en es d'accord, je serai amené à te proposer une adaptation simple de ton fichier mais qui permette une évolution pas trop compliqué pour la suite. Mais si je te barbe... et si as envie de forger ta propre expérience à ta manière, tu peux le dire aussi, je peux comprendre et je ne me vexerai pas... Au moins je ne perdrai pas mon temps inutilement !
Bonne lecture !
A+
Bonsoir,
J'ai un peu travaillé sur ton fichier mais finalement j'ai préféré tout recommencer car ton fichier est fortement pollué.
Presque 600 ko avant que je mette mon nez dedans... Il y avais de nombreuses aberrations que je n'arrivais pas à maitriser.
Le résultat est bluffant : 57 ko et le UserForm est quasiment terminé... Enfin pour la partie prévisible :
Je ne peux pas deviner ce que tu ne dis pas !
Donc j'ai fait le minimum syndical...
A+
Bonsoir !
Désolée pour le délai mais j'ai eu peu de temps pour moi cette semaine et je viens juste de finir de traiter les infos que tu m'as donné en début de semaine
Par où commencer...bon par ton post du 1er mai. Alors pour répondre à tes 6 points :
1. J'ai rapatrié le Code Client en colonne 1 dans ma bdd Société.
Ce qu'il y a c'est que j'ai une seconde bddContact, à laquelle le CodeClient doit être relié. Comme chaque contact est susceptible de changer de société il est important que le CodeClient se modifie automatiquement quand je modifie le nom de la société dans la bddContact (colonne2). Lorsque le CodeClient était en dernière ligne cela fonctionnait bien avec la fonction =RECHERCHE([@NOM];NomSociété;CodeClient), alors qu'à présent j'ai des numéros qui ne correspondent pas au CodeClient de la société saisie...J'ai resaisi la formule, supprimé et recrée les plages mais j'ai tjrs l'erreur...je continue à chercher une solution...
2. Initialement, je préfèrais que la Bdd ne soit pas visible dans la Userform. Je pensais que la touche recherche (ou Enter/Tab) pourrait ouvrir : - soit un message (pop-up) indiquant "Cardex inexistant"
- soit une fenêtre "Cardex existant" avec uniquement la liste des cardex identiques trouvés + double-clic sur le nom pour ouvrir la fiche Cardex + btn New pour revenir à l'Userform de Saisie en gardant les données saisies initialement.
Finalement la version que tu m'as envoyé semble reprendre le tout en plus...hum...condensé ! Ca m'a l'air top aussi.
Si tu le permets j'y jette un oeil plus concrètement ce week-end et te redis si j'ai des questions.
3. Je comprends ce que tu me dis concernant les Active, Select etc...j'ai encore besoin d'un peu de temps pour maitriser cette logique
4. & 5. Les Ws, lbl, txt et cb ont été modifiés. Merci bcp pour ces infos. Autant prendre les bonnes habitudes tout de suite.
6. euh...je crois que j'y réponds avec ma réponse n°2...
Passons à ton dernier msg,
Waouh c'est vraiment super de m'aider à créer mon crm. Je ne pensais pas avoir une telle assistance, merci milles fois.
Je vais de ce pas prendre connaissance du codage que tu as utilisé car j'aime bien comprendre les choses, d'où mon récent intérêt pour VBA
En parallèle je t'envoi mon fichier complet (bon sans les noms bien sûr).
Tu verras qu'en page d'accueil j'ai 3btn :
- le btn de Saisie Société
- le btn de Saisie Cardex
- le btn de Recherche (mulit-critère). Celui-ci me donnera aussi du fil à retordre car je voudrais pouvoir rechercher aussi bien par date de prospect, par date de relance, par action, par zone géographie, etc... Mais je ne me suis pas encore penchée sur la présentation finale souhaitée...
Bon je crois que cela fait bcp de lecture pour ce soir et je ne veux pas non plus abuser ni de ton temps, ni de tes connaissances.
A très bientôt
MissB
Bonjour,
Hum... Je verrais cela dès qu tu auras joins ton fichier ! Bien sur je dois comprendre parfaitement cette histoire de relation entre BD. Comme il y a un lien rompu dans le fichier initial, "toussa" est incompréhensible.
Mais la première colonne est -en principe- non modifiable et gérée par le programme. Cette histoire de Code Client est donc à bien mettre au point.
Il y a aussi cette histoire de pollution qui m'inquiète pas mal... Ce fichier initial est inexploitable : Si le deuxième est de la même veine, il y a du souçi à se faire !
Bien sur c'est important pour que que je colle le plus possible à la réalité.
Je soupçonnais déjà cette histoire de 2ème BD et ça m'inquiète un peu mébon...
Il n'y a aucun inconvénient à fonctionner en aveugle, mais dans un premier temps, c'est important de voir immédiatement le résultat d'une saisie. Car je ne suis pas exempt de faire des bourdes : Une période d’essuyage de plâtres et de traque de bugs est à prévoir !
Mais ne te précipite pas, je ne t'ai joins ce fichier que pour te montrer comment on peut gérer ça pour que ce soit fiable... On ne peut pas le faire dans l'improvisation avec juste de simples bouts de codes glanés de ci de là !
A+