Un peu d'aide pour un débutant

Bonsoir,

Etant très mauvais en VBA, j'e voudrais utiliser le moins possible les macros.

Je dois faire un tableau avec 5 feuilles ( menu, stock, commande, vente et conso perso)

Dans menu, je rentre trois paramètres, le type de produit, pour quel section (stock, vente ect...), la quantité et la date si possible (pour commande uniquement).

En cliquant sur un bouton, je voudrais comparer le produit (rentré dans le menu) à tous les produits de mon classeur et la section (rentrée dans le menu lui aussi) au nom de mes feuilles (possible ?). Des que ça match, la quantité est automatiquement ajoutée ou déduite à la quantité actuelle du produit en question. Mais si je change les paramètres dans le menu, la quantité reste en l'état.

Je suis débutant en vba soyez indulgent ...

Merci, cordialement

Bonjour

Pourquoi joindre un fichier :

Sur la charte du Forum

https://forum.excel-pratique.com/annonces/explications-et-regles-a-respecter-t13.html

Point 6 : • Pensez à joindre un fichier pour faciliter la compréhension du problème et augmenter les chances de vous faire aider (taille limite : 1 mo, n'hésitez pas à compresser vos fichiers).

Cordialement

Voilà j'ai mis mon excel, j'ai pour l'instant seulement pris la valeur de la quantité et je la copie dans une autre cellule ... Il manque les tests mais je n'arrive pas à écire : Si C6=C4 et D6=L3 (ou nom de la feuille ?) alors tu copie la valeur de la quantité dans une autre celulle.

Merci

17test.xlsm (22.62 Ko)

Bonjour,

Ton sujet ne provoque pas beaucoup d'inspirations !

Je suggèrerais d'abord d'éliminer ton look Faire-part de décès...

Ensuite, il me paraîtrait souhaitable pour les feuilles autres que Menu tu te souviennes que toute ligne et toute colonne peuvent avoir leur utilité et que mettre quelque chose en ligne 1 ou colonne 1 ne fait pas courir de risque sinon celui de retrouver plus facilement ce qui s'y trouve car il est somme toute plus naturel de commencer à 1 plutôt qu'à 3...

Certes on peut vouloir réserver des emplacements pour des boutons par exemple, ou des indications particulières, mais tout cela devrait en tout état de cause être pensé au préalable et donner lieu à une description conceptuelle du projet à mettre en place.

Tu as effectivement le choix, mais il faut faire des choix : utiliser des tableaux Excel qui peuvent présenter divers avantages dont l'auto-extensibilité étendant les formats et d'autres caractéristiques éventuelles, ainsi que la possibilité d'accès direct au tableau, ou utiliser des tableaux en plages normales mais en les dotant de noms dynamiques permettant également des possibilités d'accès direct...

En tout état de cause il convient aussi de finaliser le contenu de chaque feuille en étant autant que possible exhaustif en ce qui concerne les libellés de champs de la ligne d'en-tête.

Cela évitera de mettre la charrue avant les boeufs et travailler dans un ordre logique.

Autres conseils préalables que je donne volontiers : oublier l'enregistreur, au profit de commandes VBA que tu utilises en connaissance de cause. L'enregistreur peut avoir son utilité, pour élucider un point de syntaxe dans un cas douteux par exemple, mais s'en servir pour produire du code que tu vas utiliser sans en comprendre la majorité des lignes de commandes ne présente aucun intérêt.

Je serais curieux de te voir m'expliquer la signification de chaque ligne de commande de ta Macro1 ! Si tu les comprenais, tu aurais supprimé la plupart des lignes et modifié celles que tu aurais conservées pour aboutir au résultat de façon nettement plus efficace...

Et en l'occurrence, une connaissance minimale du modèle objet d'Excel, des principales méthodes et propriétés des objets que tu est amené à utiliser d'une part, ainsi que des systèmes de couleur utilisés par Excel t'aurait conduit à écrire d'emblée autrement ce code... (bien que je continue de recommander de supprimer ce bord noir !!! )

Dès le départ il sera bon de limiter à un le nombre de modules Standard destiné à accueillir ton code ! Cela t'évitera de t'encombrer de composants qui ralentiront le travail sans autre apport bénéfique. Il est utile d'ajouter un module lorsque cela est justifié par la nature du code qui y est placé (options particulières, sous-programme autonome...) mais disperser le code Standard de ton application dans une multitude de modules c'est te compliquer la tâche pour rien.

Ta feuille Menu est conçue en fait comme formulaire de saisie, pourquoi pas ?

Mais un bouton intitulé Archiver... ! Archiver c'est en quelque sorter enterrer les données qui ne sont plus actives... c'est peut-être la justification du liséré mortuaire !

En tout cas, tes rubriques Produit et Section mériterait d'être sous liste déroulante pour éviter des saisies inapropriées. Avec sans doute insertion automatique d'un nouveau produit saisi...

Les opérations sont également à être conçues et décrites dans tous leurs détails, pour pouvoir être correctement programmées : en matière de Stock on gère en principe des entrées et sorties, on ne voit pas ce qui pourrait les distinguer dans ton modèle, on peut concevoir une sortie automatique pour Vente ou Conso, cela n'épuise pas les possibilités de sortie.

Bon courage. Cordialement.

Bonjour,

Merci de ta réponse.

Je m'y connais bien en langage C donc je comprend les lignes de codes... Mais je n'arrive simplement pas à écrire les lignes car y'a quelques différences entre ce dernier et le vba.

Après ça fais deux jours que je me penche dessus je commence à comprendre la synthaxe du VBA même si je galère encore un peu je progresse bien !!!

Je reviendrai vers vous d'ici 2 3 jours pour vous montrez ma macro (et me faire engueuler parce que je code mal haha)

Cordialement,

On verra ça ! Bon courage...

Bon et bien voilà !

J'ai réussi à faire tout ce que je voulais.

Petite question peut t'on brider un bouton ? Mettre 2 s avant chaque prise en compte de l'appuie par exemple.

L'excel est en pièce jointe

Cordialement,

12gestion-stock.xlsm (26.03 Ko)

Bonsoir,

Juste pour l'exercice (gratuit, car ne cadre pas avec la finalité potentielle du projet... )

Sub AjouterRetrancher(Optional msq As Boolean)
    Dim q, P$, T$, m%, i%, f%
    m = IIf(Application.Caller = "Ajouter", 1, -1)
    With ActiveSheet.Range("F14")
        P = .Cells(1, 1): T = .Cells(1, 2): q = .Cells(1, 3)
    End With
    For f = 2 To Worksheets.Count
        If Worksheets(f).Range("F11") = T Then
            With Worksheets(f).Range("F14")
                Do
                    i = i + 1
                    If .Cells(i, 1) = P Then Exit Do
                Loop While .Cells(i, 1) <> ""
                If .Cells(i, 1) = "" Then .Cells(i, 1) = P
                .Cells(i, 3) = .Cells(i, 3) + q * m
            End With
            Exit For
        End If
    Next f
    If f > Worksheets.Count Then
        MsgBox "Type non identifié !", vbCritical, "Erreur"
    Else
        P = StrConv(P, vbProperCase)
        MsgBox "Opération réalisée.", vbInformation, P
    End If
    ActiveSheet.Range("F14:I14").ClearContents
End Sub

La macro est affectée aux deux boutons (renommés pour la circonstance...). L'argument est juste destiné à faire disparaître la macro de la boîte de dialogue macro pour éviter qu'on la lance à partir de là...

Pour le reste, je te laisse analyser...

Pourquoi voudrais-tu temporiser l'action ?

NB- Il faut revoir ta façon d'indenter le code qui brouille la lecture !

Je t'engage à relire les commentaires de mon précédent post, car on n'est pas vraiment ici dans une configuration favorable...

Cordialement.

Bonjour,

ha oui ... je ne comprend pas tout mais je comprend globalement...

Si vous pourriez m'expliquer un peu je serais pas contre

J'ai indenté mon code à la fin car je l'ai modifié !!!

Merci

Il faudrait dire ce qui te chagrine ou ce que tu crois ne pas interpréter...

Quelques explications :

1) Déclaration de toutes les variables, et systématiquement en tête de procédure.

J'utilise souvent les caractères de déclaration de type, pour réduire la place occupée par les déclarations.

Je conseille toujours de respecter cette règle conventionnelle, on s'y retrouve mieux, et je pense que VBA aussi : les déclarations lui font réserver les emplacements mémoire pour chaque variable, déclarées avant le code exécutable, il fait ça au démarrage de la macro en une seule fois.

q est non typée car le type exact de la quantité n'est pas clairement défini, ce pourrait être Long ou Double.

2) Application.Caller : cette commande renvoie une information sur l'élément ayant appelé la macro. Ce peut être une donnée de type diversifié, voire même une valeur d'erreur... Dans le cas de contrôle de formulaire ou de Shapes, cela renvoie le nom de l'objet (type String), d'où le renommage effectué des boutons, pour pouvoir prévoir ce qui sera renvoyé.

Cette commande est utilisée ici pour savoir si le bouton 'Ajouter' a été actionné, ou l'autre, et permet de définir un paramètre multiplicateur m à 1 pour ajouter et -1 dans le cas contraire, ce qui permet de ne plus se préoccuper de savoir si l'on ajoute ou retranche, l'application du paramètre aboutira au résultat...

Cela explique aussi l'utilité de rendre la macro invisible dans la boîte de dialogue, car si elle était lancée de là, cela provoquerait une erreur.

3) Utilisation de With : Cette instruction a pour effet de mettre en mémoire un objet renvoyé par une expression, a laquelle on a à se référer plus d'une fois à l'intérieur de l'instruction : toute expression précédée d'un point se réfère à l'objet référencé.

Cela peut réduire sensiblement le volume de code à écrire, et cela rend surtout l'exécution plus rapide.

Des instructions With peuvent être imbriquées sans problème, mais éviter de le faire pour un bloc With dont l'objet n'a rien à voir avec celui du bloc dans lequel on le met (dans ce cas utiliser une variable pour le second objet).

4) Les données de la feuille Menu sont mémorisées dans des variables au départ. On le fait avec une bloc With qui référence la cellule F14 de la feuille... Noter l'adressage relatif à cette cellule des cellules où sont prélevées les valeurs.

5) J'ai conservé ta méthode de recherche de l'emplacement cible (en gros ! )

On parcourt les feuilles : lorsqu'on trouve la valeur de T en F11, c'est la bonne feuille.

On parcourt donc la colonne F à partir de la ligne 14 pour trouver le produit : boucle Do... Loop qui s'achèvera lorsqu'elle arrivera dans une cellule vide, mais on en sort avant si on trouve le produit.

D'où le test en sortie de boucle, si on est sur une cellule vide, c'est que le produit n'y est pas ! On l'ajoute... Sinon on est sur la ligne Produit. Au bout du compte on est sur la ligne Produit, puisqu'on la crée si on n'y était pas !

i a été incrémenté à partir de F14, on affecte la quantité en l'ajoutant ou retranchant de celle existante dans la 3e colonne à partir de F (on est ici aussi en adressage relatif à partir de F14).

La 3e colonne tient compte de la fusion : je déconseille ces fusions totalement injustifiées. C'est une source d'erreurs potentielles.

6) Message de fin : pour informer l'utilisateur que l'opération a abouti ou non (il ne le voit pas sinon).

On met l'initiale de T en majuscule : NB- j'ai mis P par erreur, c'est T le type d'opération. Mon idée était de te faire remarquer que tu écris vente avec une minuscule initiale et dans ta recherche tu effectueras une comparaison d'égalité avec une cellule portant cette mention, avec la même casse. Donc pas de problème... Mais tu aurais pu faire une comparaison avec le nom de la feuille (Vente) qui là aurait échoué car VBA est par défaut sensible à la casse.

Mais si tu avais simplement ciblé la feuille avec : With Worksheets(T).Range("F14"), cela aurait fonctionné, parce que Excel par défaut n'est pas sensible à la casse.

C'est un aspect auquel il faut penser lorsqu'on fait des comparaisons.

Nota: on utilise fréquemment UCase ou LCase pour ramener à la même casse des éléments à comparer lorsqu'ils peuvent avoir été diversement saisis à cet égard.

On peut aussi au niveau d'un Module définir Option Compare Text pour que les comparaisons se fassent en ignorant la casse au sein du Module.

On a aussi la possibilité de définir le mode de comparaison dans certaines fonctions VBA qui disposent d'un argument à cet effet (par exemple StrComp). On paramètre alors l'argument avec la constante VBA vbTextCompare.

Si quelque chose t'échappe encore, demande...

Cordialement.

Rechercher des sujets similaires à "peu aide debutant"