Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J'essaie de me faire une base pour gérer ma cave.
Je tâtonne depuis longtemps pour avoir quelque chose qui me convienne.
J'ai trouvé un programme de Dranreb qui permet des recherches avec différents combo
Le fonctionnement est superbe.
J'ai essayé de le continuer pour le personnaliser mais je n'y suis pas arrivé !
Voici donc le fichier joint modifié ........ en attente et qui demande de l'aide
Merci à vous et à Dranreb si il voit cette requête
La première chose qui me dérange en ouvrant le fichier ce sont les lignes à partir de la 39 dans la feuille DB. S'il est spécifié un Rows(2) à la méthode Plage d'un ComboBoxLié(e)s, elle vont gêner, c'est sûr. Mais je n'en suis qu'au tout début de mon analyse du fichier, il y aura sans doute de nombreux édits de ce poste.
1) - Même déjà la plage _FilterDataBase recouvre n'importe quoi !
2) - Mise à part qu'il propose des "(vide)" dans les ComboBox, à cause du point précédent évoqué, le fonctionnement du ComboBoxLiés me parait normal. Pour info: j'en ai depuis peu une version ComboBoxLiées qui n'utilise plus de Dictionary.
3) - Pour récupérer les infos associées il manquait ces instructions dans la CL_Résultat:
VB:
Private Sub CL_Résultat(Lignes() As Long)
Dim VLgn()
If UBound(Lignes) <> 1 Then Exit Sub
VLgn = CL.PlgTablo.Rows(Lignes(1)).Resize(, 16).Value
Me.NomVigneron = VLgn(1, 12)
Me.AdresseVigneron = VLgn(1, 13)
Me.TelFixe = VLgn(1, 14)
Me.Telportable = VLgn(1, 15)
Me.Messagerie = VLgn(1, 16)
LabInfo = "Date d'achat " & VLgn(1, 1)
End Sub
Remarque: je les mets souvent dans une procédure à part appelée GarnirChamps si l'application doit permettre les créations, avec VLgn() déclaré en global en tête de l'userform, comme ça la même procédure permet de les vider…
4) - Pas de contrôle pour le Contenant ni la Couleur ni la quantité ni le prix unitaire ?
5) - À étudier: la possibilité de tout gérer sur une seule feuille avec un historique formé d'environ 3 paires de colonnes en fin, comprenant chacune Date et Quantité en + ou en -, ajouté ou retiré.
Ou même pourquoi pas juste une feuille de mouvements avec une date et une quantité en stock. Il faudrait alors se baser plutôt sur le fait que CL_Change rend Complet plutôt que NbrLgn=1 pour afficher tout ce qui concerne le dernier mouvement.
C'est tout pour le moment.
6) - Ah, si, encore un point: si l'userform doit permettre d'ajouter de nouvelles lignes, il serait préférable de remplacer CL.CorrespRequise = True par CL.CouleurSympa pour repérer visuellement les caractéristiques qui n'existent encore pas.
À +
Tout d'abord, merci de cette réponse.
Il n'y a rien après la ligne 39. C'est une partie que j'ai oublié d'enlever avant d'envoyer
J'avais essayé avec la méthode du genre
Range("B" & ligne).Value = Nom.Value qui se révèle innéfficace dans le cas présent.
J'ai collé le code avec les VLgn et bien sûr cela fonctionne.
Si les cellules vides posent un problème, il suffirait peut-être d'écrire juste un point. Ca ne nuirait pas à l'info.
J'ai rajouté les contôles Contenant et couleur
Quant à la possibilité de tout gérer sur la même feuille, ça me parait pratique.
C'est que même les totaux en I39 et K39 sont gênants. Une solution pour les garder serait de mettre un nom dans le classeur pour les lignes entières, par exemple Tablo, et spécifier CL.Plage Sheet1.[Tablo] au lieu de Sheet1.Rows(2).
Sinon il y a ça qui marche pas mal aussi :
VB:
CL.Plage ColUti(Sheet1.[A2:H2])
Il faudrait sans doute quelques autre boutons, encore que "Ajouter" et "Modifier" peuvent n'en faire qu'un, vu qu'une seule des deux opérations sera possible à un moment donné.
Remplacer CL.CorrespRequise = True par CL.CouleurSympa
L'affectation des valeurs de ComboBox, mais seulement pour une nouvelle ligne (pour une existante elles y sont déjà), peut se faire quelque part au moyen de ce code, que vous ne pouviez inventer :
VB:
Dim I As Long
For I = 1 To CL.Count: With CL.Item(I): VLgn(1, .Col) = .CBx.Text: End With: Next I
VLgn() étant déclaré global plutôt.
Déclarez aussi en tête un LCou As Long, qui permettra de savoir partout dans l'Userform si on est en phase d'ajout d'une nouvelle ligne (LCou = 0) ou en phase de modification de la ligne LCou. On y mettra = 0 dans la CL_Change si NbrLgn = 0 et dans la CL_Résultat = Lignes(1)
Edit: Souhaitez vous stocker les numéros de téléphone en tant que textes ou en tant que nombres ? Actuellement les cellules ont un format de nombre mais qui n'est pas partout utilisé vu que certaines contiennent du texte.
Qu'est-ce qu'on attaque comme problème maintenant, pour continuer ?
Les totaux en I39 et K39 ne sont pas à leur place définitive
Je les ai placés à cet endroit car je n'ai pas rentré encore d'autre données
Je pensais les mettre beaucoup plus bas (par ex ligne 500) car je doute
que je dépose plus de 499 bouteilles dans ma cave, et garder le
système "NombreCave.Value = [Stock!P2].Value" mais sans doute un peu simpliste
Je savais bien que plus ça allait avancer dans les réponses et que plus je
perdrais pied. Voilà, c'est fait !
Les changements proposés me laissent perplexe et je n'ai pas su les mettre en place
Pour les n° de Tél.: est-ce que que le formatage en n° spécial tél. des 2 colonnes
ne convient pas ?
Commencer par choisir une stratégie, si vous êtes d'accord pour tout noter dans une seule feuille et mettez les boutons qu'il faut pour entériner finalement chaque action précise.
J'en vois 3 :
BtnValider, Caption variable: "Ajouter"/"Modifier",
BtnRetirer, Caption: "Retirer une bouteille",
BtnSupprimer, Caption: "Supprimer".
Le 1er code indiqué dans mon poste précédent se met dans l'Userform_Initialize à la place de CL Plage Shee1.Rows(2).
Le 2ième dans une procédure qui n'est sans doute pas encore écrite lorsqu'on veut ajouter une nouvelle ligne dans la base.
Moi je n'aime pas les N° de tél. en nombres mais ça peut se faire. Encore faudra-t-il veiller à bien ranger des nombres dans les cellules et non les textes bruts venant des TextBox.
Les TextBox pour saisir la couleur et le contenant ne sont pas très visibles.
Et il n'y a rien pour saisir la quantité initiale ni le prix unitaire.
Avec les contrôles existant actuellement, la principale procédure manquante pourrait s'écrire comme ça :
VB:
Private Sub BtnValider_Click()
Dim I As Long
If LCou = 0 Then
CL.PlgTablo.Rows(1).Copy
CL.PlgTablo.Rows(2).Insert
ReDim VLgn(1 To 1, 1 To 16)
For I = 1 To CL.Count: With CL.Item(I): VLgn(1, .Col) = .CBx.Text: End With: Next I
LCou = 1: End If
VLgn(1, 7) = Me.Contenant
VLgn(1, 8) = Me.Couleur
VLgn(1, 12) = Me.NomVigneron
VLgn(1, 13) = Me.AdresseVigneron
VLgn(1, 14) = CDbl(Me.TelFixe)
VLgn(1, 15) = CDbl(Me.Telportable)
VLgn(1, 16) = Me.Messagerie
CL.PlgTablo.Rows(LCou).Resize(, 16).Value2 = VLgn
CL.Actualiser
End Sub
Rappel: Déclaré en tête, juste derrière Dim WithEvents CL As ComboBoxLiés :
VB:
Dim LCou As Long, VLgn()
Tiens, un détail anecdotique qui m'intrigue: sauf pour les Edelzwicker (ce qui se prononce Ed'lswick'r), les noms de crus de vins d’Alsace commencent toujours par leurs noms de cépage… Est-ce un Riesling ou un Pinot gris médaillé d'or ? Ce n'est pas du tout la même chose.
Voici le fichier dans son état actuel et avec votre idée initiale. Je pense que le plus gros est fait. Mais il reste encore du travail et des tests à faire si on veut que ce soit fait sérieusement. En particulier j'écris souvent une procédure HabiliterContrôles, appelée à la fin de toutes les autres procédures et qui veille à ce qu'un bouton ou même un TextBox, soit inutilisable (Enabled = False) si toutes les conditions ne sont pas réunies pour qu'il le soit. Au hasard: ne pas pouvoir retirer une bouteille s'il en reste 0, et plein d'autres cas comme ça. Ce serait peut être même plutôt à cette procédure qu'incomberait de mettre "Modifier" ou "Ajouter" au BtnValider selon que LCou est >0 ou non. On peut aller jusqu'à parcourir tous les contrôles pour interdire le bouton BtnValider si en fait rien n'a encore été modifié.
Le fait de tout inscrire sur une seule feuille est finalement intéressant.
J'ai rajouté une colonne "stock "
Par contre, dans mon idée de départ sur 2 feuilles, du fait que je recopiais toutes les sorties sur la 2ème feuille, je gardais toutes mes données d'achat sur la 1ère. J'aimerais donc garder cette façon de faire. Les sorties viennent en déduction du nombre total de l'achat. Le nouveau nombre s'affiche dans la colonne "disponible". Le jour ou le stock est nul, la ligne de données ne s'efface pas alors que les colonnes nombre bouteilles achetées et stock seront à 0
Ca ne fonctionne pas lorsque je retire une bouteille ( copie d'écran)
Pour les Alsace, il faudra que je précise. Encore une remarque judicieuse (hic! )
Re,
Ça progresse !
Si j'entre un nouveau vin ou rajoute éventuellement un vin à un identique déjà en cave, il faudrait que le stock soit mis à jour
ex: j'ai déjà 10 bt, j'en rajoute 6 le stoxk passe automatiquement à 16
j'achète 12 bt d'un nouveau vin ce qui donnerait 12 bt en cave et bien sûr dans colonne stock 12
Je suppose qu'il faut pouvoir modifier la quantité en cave soit directement dans une TextBox qui la reflète soit dans une TextBox de la quantité achetée qui sera ajoutée à la quantité en cave puis effacée. À vrai dire depuis le début je ne comprends pas bien cette histoire de stock et de cave. Enfin la cave si, c'est clair, mais le stock je ne sais pas bien à quoi il correspond. Vous ne sortez pas seulement une bouteille de la cave pour la consommer, mais pour la stocker ailleurs ? Enfin faites pour le mieux selon vos besoins. Faites les opérations appropriées sur les bonnes colonnes de VLgn
Il n'y plus lieu de conserver les instructions qui copient la ligne LCou dans la Sheet2 si celle ci est appelée à disparaître.
Convertissez en nombre les Text des TextBox quand il le faut pour éviter tout risque de les ranger dans les cellules sous forme de textes.
Mon idée de départ était de conserver l'historique de tous mes achats, ce qui alimente en même tempsles
combobox (données existantes), et avoir le stock réel au fur et à mesure des retraits.
Ensuite, le jour ou j'entrerai une ou plusieurs bouteilles, il faudrait que la colonne J (quantité achetée) se remplisse
ainsi que la colonne K (Stock disponible). Lorsque je sors une ou plusieurs bouteille, le stock colonne K diminue
d'autant.
La correction proposée VLgn(1, 9) = CDbl(Me.NbrBouteille) VLgn(1, 10) = CDbl(Me.TBxQtéCave) VLgn(1, 11) = CCur(Me.PrixAchatBout) ne fonctionne pas
Dans les combo "Nom de domaine" et "Nom du cru" apparaissent des lignes de code de VBA ????
Je viens de faire une bourde.
J'ai supprimé la ligne des titres par erreur. Je l'ai recréée et depuis j'ai "Erreur exécution" à l'appel de l'userform.
Je suis désolé de vous ennuyer avec mes approximations mais j'espère que vous pourrez réparer
Ensuite, le jour ou j'entrerai une ou plusieurs bouteilles, il faudrait que la colonne J (quantité achetée) se remplisse
ainsi que la colonne K (Stock disponible). Lorsque je sors une ou plusieurs bouteille, le stock colonne K diminue
d'autant.
Et bien alors faites le, qu'est-ce que vous attendez ?
Je ne vois toujours pas de TextBox pour entrer un nombre de bouteille achetées. Ou alors c'est l'autre qui manque ? Celle du nombre de bouteilles en stock pour ce crû ? Vous ne voulez pas l'afficher ? Vous voulez simplement faire comme ça :
VB:
If IsNumeric(Me.NbrBouteille.Text) Then
N = CLng(Me.NbrBouteille.Text)
VLgn(1, 10) = VLgn(1, 10) + N
VLgn(1, 11) = VLgn(1, 11) + N
End If
La correction proposée VLgn(1, 9) = CDbl(Me.NbrBouteille) VLgn(1, 10) = CDbl(Me.TBxQtéCave) VLgn(1, 11) = CCur(Me.PrixAchatBout) ne fonctionne pas
Qu'est-ce qui ne fonctionne pas, et de quelle façon, message d'erreur ou mauvais résultat ?
j'avais oublié aussi VLgn(1, 1) = CDate(Me.DateAchat)
Je viens de faire une bourde.
J'ai supprimé la ligne des titres par erreur. Je l'ai recréée et depuis j'ai "Erreur exécution" à l'appel de l'userform.
Je suis désolé de vous ennuyer avec mes approximations mais j'espère que vous pourrez réparer
Oui, ça a juste fusillé les formules dans la feuille Stock. J'avais exprès mis =SOMME(DECALER(DB!$J$1;1;0):
DECALER(DB!$J$39;-1;0)) au lieu de simplement =SOMME(DB!$J$2:$J$38) pour que ça ne la fusille pas si on supprime la ligne 2 ou la dernière, mais évidemment si on supprime la ligne de titres ça la fusille quand même ! Mais est-ce qu'elle sert encore à quelque chose cette feuille Stock ? Je vous avais indiqué le moyen de calculer ces 4 chiffres avec NombreCave.Value = WorksheetFunction.Sum(CL.PlgTablo.Columns(10)) et pareil pour les 3 autres bien évidemment.
Conseil: mettez ces 4 instructions das une procédure séparée pour pouvoir l'appeler non seulement dans l'UserForm_Initialize mais aussi après une modification.
Par ailleurs il vaut peut être mieux supprimer le bouton BtnRetirer1, surtout si vous voulez pouvoir en retirer plusieurs et prévoir une TextBox pour le nombre à retirer, et la traiter un peu comme celle pour acheter, dans la BtnValider_Click. Ou bien est-ce qu'elle existe déjà et ce serait la TextBox Stock ? Ce n'est pas très clair tout ça. Au lieu de NbrBouteille vous devriez l'appeler NbBoutAchat pour que ce soit clair, et tout à l'avenant. Et encore c'est parce que je vous fait grâce du préfixe de 3 lettres identifiant le type de contrôle, ce serait TBxNBoutAchat chez moi ! Vous devriez peut être mettre d'autres Frame pour bien distinguer l'"Existant du crû" des "Achats et retraits". Et mettre ensemble toutes les infos globales de la base. Enfin moi je m'y perdais complètement dans tout ça !
Voila, je pense être arrivé au bout.
Avec des méthodes qui ne sont sans doute pas dans les règles de l'art, mais ça fonctionne.
J'aurais préféré, pour ce côté plus agéable, faire fonctionner l'évolution de mon stock avec le bouton que vous aviez mis en place
mais je n'y suis pas arrivé. Je l'ai laissé en place pour le moment.
Il est facile de comprendre que pour les personnes qui maitrisent totalement leur sujet, (comme ça a l'air d'être le cas pour beaucoup sur ce forum) les questions posées par les petits joueurs dont je fait partie, peuvent paraitre énervantes, voire naïves. Arriver dans le monde de la programmation est un gros morceau.
Si vous penser pouvoir apporter une touche finale, je suis preneur et encore une fois je vous remercie pour le temps passé à m'avoir aidé
Vous êtes cordialement invité à venir déguster un t'iote bouteille
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD