Gestion d'inventaire/stock - Créer une fenêtre d'ajout/retrait

Bonjour Matbaldy et salut à Jacky
Une autre approche avec 2 Tableaux Structurés et un formulaire de saisie.
-Tableau1 qui reprend les 5 colonnes de la BDD. Si d'autres colonnes doivent s'ajouter, il faudra modifier la macro suivante en conséquence, en ajouter des ElseIf

        If Me.ComboBox1 = "Aile" Then
            Me.ComboBox2.List = [Tableau1[Aile]].Value
        ElseIf Me.ComboBox1 = "Alliage" Then
            Me.ComboBox2.List = [Tableau1[Alliage]].Value
         ElseIf Me.ComboBox1 = "Bois" Then
            Me.ComboBox2.List = [Tableau1[Bois]].Value
         ElseIf Me.ComboBox1 = "Bourgeon" Then
            Me.ComboBox2.List = [Tableau1[Bourgeon]].Value
         ElseIf Me.ComboBox1 = "Carapace" Then
            Me.ComboBox2.List = [Tableau1[Carapace]].Value

-Tableau2 destiné à recevoir les enregistrements de la saisie.
A voir
Cdt
Papy Henri

20matbaldy1.xlsm (29.63 Ko)
Il faudra surement adapter la taille de la fenêtre et activer le déroulement par la molette

Bonsoir,

Je crois qu'avec ce dernier fichier tu auras satisfaction

Que veux tu dire, la fenêtre dont tu parles quelle est elle? et même chose qu'attands tu par déroulement d ela molette, laquelle ?

J'ai interdit les valeurs négatives pour les quantités

11test-36-copie.xlsm (38.26 Ko)

Bonsoir Papy Henri,

bravo, ta solution est interessante
Au plaisir de te retouver sur le Forum

Ta dernière version semble bonne.

Peut on améliorer les points suivants :

  • Permettre le défilement des 2 listes "Famille" et "Objet" via la molette de la souris et pas seulement par l'ascenseur? Pour le moment la BDD d'exemple est peu fournie mais j'ai déjà une version (non définitive) avec des dizaines de familles dont certaines avec plusieurs centaines d'objets. L'utilisation de la molette serait très appréciable.
  • Est ce compliqué d'afficher directement toutes les familles dans la liste de gauche et une fois qu'un est sélectionné afficher tous les objets s'y référent? Les 2 champs en haut de la fenêtre (Choix de famille et Famille choisie) sont au final peu utile.
    • De cette façon le problème du respect de la case serait à oublier
  • L'ajout d'un objet avec une quantité à 0 est possible, il faudrait l'éviter je pense

Je vais essayer d'adapter ton code à la BDD plus conséquente que j'ai sous la main pour voir si cela pose des soucis et je reviens vers toi.

Autre chose : je dois m'attaquer au design de la fenêtre d'ajout/retrait, est ce que tu aurais des ressources (tuto, vidéo) à me conseiller?

Bonjour Matbaldy et salut @ Jacky

Pour le moment la BDD d'exemple est peu fournie mais j'ai déjà une version (non définitive) avec des dizaines de familles dont certaines avec plusieurs centaines d'objets

La BDD reprise dans le Tableau1 permet
- de rajouter autant de colonnes "Familles" que nécessaire.
- de rajouter dans toutes les colonnes autant d'objets que l'on souhaite.
Ces nouvelles familles seront intégrées automatiquement dans la liste des "Familles" (ComboBox1), et au choix de la famille, la liste des objets apparaitra dans le ComboBox2.

L'ajout d'un objet avec une quantité à 0 est possible, il faudrait l'éviter je pense

Avec cette version, impossible de saisir la valeur 0, et nul besoin de venir modifier les macros.
Cdt
Papy Henri

7matbaldy2.xlsm (30.73 Ko)

Bonjour,

Avec la molette, je ne sais pas, mais tu peux faire défiler les items en gardant la touche gauche de la souris enfoncée et en déplaçant la souris.

Re bonjour
Voici ma version3 qui permet de filtrer la ListBox caractère par caractère. En cliquant sur l'objet voulu, Le TextBox1 (non accessible) est renseigné.

Cdt
Papy Henri

12matbaldy3.xlsm (33.29 Ko)

Bonjour Papy,

Merci pour ta proposition, elle est intéressante. J'aime bien le champ de recherche pour affiner l'affichage.

Par contre il y a le problème de l'ajout/retrait avec des nombres négatifs.

Bonjour,
Je suppose que vous voulez parler de ceci:

si l'objet est présent dans la la liste de l'inventaire, retirer une quantité mettre à jour la quantité déjà présente ou supprimera l'objet de l'inventaire si la quantité tombe à 0 ou négative

A vous relire

Non je veux dire que le formulaire autorise la validation avec une valeur négative. Mais le but n'est d'avoir que des valeurs supérieure à 0 dans la liste affichée. Si la valeur tombe à 0 suite à un retrait la ligne disparait. Aucune valeur native n'est censée apparaitre.

Comme cette version 4?

9matbaldy4.xlsm (29.58 Ko)

L'alerte pour demander la confirmation de retrait en cas de valeur à 0 me parait inutile (même si elle reste intéressante pour d'autre cas). On peut la retirer.

Je me rend compte que le fait de cliquer sur le bouton pour lancer le formulaire est peut être de trop. Est ce que l'affichage du formulaire peut se faire directement sur la page? Vu que le fichier ne servira qu'a ça (mettre à jour un inventaire) et rien d'autre autant l'afficher directement et enlever le bouton "Quitter".

J'ai prévu de protéger la feuille pour la rendre non modifiable, mais je crois qu'on peut le faire sur une partie de la feuille seulement donc ça semblerais possible de prévoir un espace (à droite du tableau par exemple) pour afficher le formulaire.

Bonjour Matbaldy et le forum
Beaucoup de remarques, mais vous pouvez faire ces modifications tout seul. Bel apprentissage de VBA.
J'ai supprimé l'alerte en mettant une apostrophe devant les lignes de code suivantes: (si besoin, enlever les apostrophes)

            ElseIf Me.OptionButton2 = True Then
                If .Item(Ligne, 3) - CDbl(Me.TextBox2) < 1 Then
                    Me.TextBox4 = .Item(Ligne, 3) - CDbl(Me.TextBox2)
                   ' If MsgBox("La qté en stock est négative ou nulle, Confirmez-vous la suppression de cette ligne dans la liste?", vbYesNo,         "Confirmation de suppression") = vbYes Then
                        .Rows(Ligne).Delete
                   ' End If
                Else
            .Item(Ligne, 3) = .Item(Ligne, 3) - CDbl(Me.TextBox2)
                End If

J'ai gardé le bouton vert pour lancer le formulaire. Si vous souhaitez le supprimer, il faut ôter la protection de la feuille (Menu Format-> ôter la protection), puis clic-doit sur le bouton vert-> Couper.
J'ai enlevé le bouton QUITTER. Donc pour quitter le formulaire-> cliquez sur la croix rouge en haut à droite.
Le formulaire est décalé sur la droite, si ce n'est pas assez, rectifiez les codes suivants:

Private Sub UserForm_Initialize()
Me.Left = Application.Left + 450
Me.Top = Application.Top + 150

Si vous souhaitez que le formulaire apparaisse à l'ouverture du fichier, mettre ce code sous ThisWorkbook (Clic-droit sur l'onglet "Inventaire" puis Visualiser le code, puis cliquer sur ThisWorkbook situé à gauche et coller ce code)

Private Sub Workbook_Open()
    Sheets("Inventaire").Activate
    Gestion.Show
End Sub

Voici la version5
Cdt
Papy Henri

17matbaldy5.xlsm (26.26 Ko)

Bonjour,
une petite coquille dans le filtrage des noms ( je faisais référence à Ws1 au lieu de TS1), remplacez le code par celui-ci:

Private Sub TextBox3_Change()
    Dim Var As String, TblBD(), Tbl()
    Dim cle, n
    Dim i As Integer, k As Integer
    Var = Me.ComboBox1
    TblBD = TS1.ListColumns(Var).DataBodyRange.Value
            cle = "*" & TextBox3.Value & "*": n = 0
        For i = 1 To UBound(TblBD)
            On Error Resume Next
                If TblBD(i, 1) Like cle Then
                    n = n + 1: ReDim Preserve Tbl(1 To UBound(TblBD, 1), 1 To n)

                    For k = 1 To UBound(TblBD, 1): Tbl(k, n) = TblBD(i, k): Next k
                 End If
        Next i
    If n > 0 Then Me.ListBox1.Column = Tbl Else Me.ListBox1.Clear
End Sub

Ou utilisez cette version Bis, qui simplifie l'utilisation. La liste des familles est présente dès l'ouverture du formulaire, en cliquant sur une famille la liste des noms est renseignée pour le choix à faire (avec le filtrage ou sans ).
Cdt
Papy Henri

9matbaldy5-bis.xlsm (32.34 Ko)

C'est franchement super propre.

J'essaye d'intégrer les images liées à chaque item mais je ne sais trop comment faire dans le code. Je peux ajouter une colonne supplémentaire entre les objets d'une famille et de la suivante. Elle afficherai l'image correspondante pour pouvoir l'ajouter dans l'inventaire automatiquement.

Mais une fois que c'est fait le code est trop incompréhensible pour moi. Je suppose que cela va s'intégrer à cet endroit :

  If Ligne = 0 Then ' Le Nom n'existe pas
                'alors on ajoute une nouvelle ligne au tableau
                .ListRows.Add
                Ligne = .ListRows.Count
                End If

Bonsoir,

Iil ne faut surtout pas modifier la structure de la feuille "base de données" sinon rien ne fonctionnera plus.
Où sont stockées vos images et avec quels noms?
Papy Henri

Bonjour,

Elle ne sont stockées nul part pour le moment.

Je peux les télécharger en dur sur mon poste et les classer ou alors récupérer une URL distante. L'avantage de la première option étant que je peux les manipuler (nom, taille, etc ...)

Bonsoir,
Voici ma version 5ter qui permet de visualiser l'image dans le formulaire, au clic sur l'objet dans la liste 2.
Pour ce faire, il faut mettre les images en .jpg, soit dans le même répertoire, soit dans un autre. Renommer toutes les images avec l'orthographe exacte de la BDD.
-Même répertoire:

Chemin = ThisWorkbook.Path & "\"

-Sous répertoire (que j'ai nommé Photos)

Chemin = ThisWorkbook.Path & "\" & "Photos" & "\"

et ceci dans la macro suivante

Private Sub ListBox2_Click()
Dim position As Integer
Dim Chemin, Fichier As String
    Me.TextBox3 = ""
    With TS2
    On Error Resume Next
    position = Application.Match(Me.ListBox2.Value, .ListColumns(2).DataBodyRange, 0)
    Chemin = ThisWorkbook.Path & "\" & "Photos" & "\"
    Fichier = Chemin & Me.ListBox2.Value
    Me.Image1.Picture = LoadPicture(Fichier & ".jpg")
    If position > 0 Then
    Me.TextBox3 = .DataBodyRange.Item(position, 3)
    End If
    End With

End Sub

Bonne fin de WE
Cdt,
Papy Henri

16matbaldy5ter.xlsm (36.36 Ko)

Re

Plus simplement, créer autant de sous-répertoires que de familles (avec le nom identique à la liste des familles de la BDD)
Mettre les images dans les sous-répertoires appropriés et modifier le chemin comme ceci:

    Chemin = ThisWorkbook.Path & "\" & Me.ListBox1 & "\"
    

Bonjour Papy Henri,

J'ai donc le code suivant :

Private Sub ListBox2_Click()
Dim position As Integer
Dim Chemin, Fichier As String
    Me.TextBox3 = ""
    With TS2
    On Error Resume Next
    position = Application.Match(Me.ListBox2.Value, .ListColumns(2).DataBodyRange, 0)
    Chemin = ThisWorkbook.Path & "\" & Me.ListBox1 & "\"
    Fichier = Chemin & Me.ListBox2.Value
    Me.Image1.Picture = LoadPicture(Fichier & ".png")
    If position > 0 Then
    Me.TextBox3 = .DataBodyRange.Item(position, 3)
    End If
    End With

End Sub

Au même endroit que le fichier Excel j'ai créer un sous répertoire "Aile". A l'intérieur toutes les images des noms présents dans la BDD pour la catégorie Aile (j'ai fait des copier/coller des noms pour avoir une orthographe identique). J'ai simplement modifier le .jpg en .png et cela ne semble pas fonctionner car la fenêtre de formulaire n'affiche pas l'image. Est ce que cela peut venir de la taille de l'image qu'il faut respecter ou limiter? Est ce que l'extension PNG ne convient pas? est ce que le chemin n'est pas bon?

Rechercher des sujets similaires à "gestion inventaire stock creer fenetre ajout retrait"