Gestion de Stock

Bonjour

Quand je choisis dans combobox1 le nom et textbox1 le code, la dernière valeur apparaît dans textbox3 comme dans la feuille, mais il y a une valeur différente

Sachant qu'il y a des données en double, mais je veux un autre événement

je ne veux pas ajouter ce code
Me.TextBox3 = ActiveCell.Offset(0, 2).Text
Le résultat dans textbox3 est la valeur de la cellule D3 qui est 662 .
Je ne veux pas que la zone de textbox3 soit dans la cellule D11

28433ab1 10b5 435e 9b15 d330f874e090

38stock.xlsm (17.88 Ko)
28433ab1 10b5 435e 9b15 d330f874e090

Bonjour,

J'ai regardé votre code. Je me demande comment vous pouvez différencier les 3 "bb" (ligne 3, 7 et 11), ils ont le même code et le même nom de produit. Donc votre code s'arrêtera sur le premier qui vous donne 662 pour la quantité.
Cdlt
Jacky

Bonjour

Gestion des stocks Je souhaite afficher la dernière valeur de 163 basée sur deux critères combobox1 et textbox1 malgré la redondance des données

Bonsoir,

Je comprends bien, mais comme je le dis précédemment il y a "confusion" entre les 3 lignes contenant les valeurs sur lesquelles vous faites votre recherche, donc lors de cette recherche le code retient la première de ces trois lignes et attribue donc la valeur 662 et non 163.
Il faudrait un colonne supplémentaire afin de différencier ces 3 lignes et baser votre recherche sur le contenu des cellules de cette colonne supplémentaire. Par exemple pour différencier : bb - 101 - nn - 662 de bb - 101- nn - 21 et de bb- 101 - nn - 163, ajouter un n° d'ordre et faites votre recherche sur ce n° d'ordre.
Je me tiens à votre disposition.
Cdlt
Jacky

Re,

Selon ton code :

Sheet1.Activate
iii = 2
Do Until Sheet1.Cells(iii, "b").Text = ""
    If Me.TextBox1.Text = Sheet1.Cells(iii, "b").Value Then
        Cells(iii, "b").Activate
        Me.TextBox2 = ActiveCell.Offset(0, 1).Text
        Me.TextBox3 = ActiveCell.Offset(0, 2).Text
        Exit Sub
    End If
    iii = iii + 1
Loop
End Sub

Tu crées une boucle "Do Until" 'Loop" qui tournera tant que la cellule Cells(iii, "b") n'est pas vide, ce qui signifie que si il existe une ligne vide intercalée parmi toutes les lignes que tu veux tester alors tu sortiras de la boucle. Exemple intercale une ligne vide entre les lignes 6 et 7 et regarde ce qui se passe .... bizarre tu obtiens satisfaction. Normal vu qu'il n'y a que cette ligne qui répond à ta demande avant la ligne vide.
Ensuite, dans ta boucle tu compares le contenu de ton TextBox1 avec celui de la cellule Cells(iii, "b"), si les valeurs sont identiques tu remplis les textBox 2 et 3 et tu sors de ta procédure (Exit Sub), donc tu n'arriveras jamais à lire les lignes suivantes et en particulier celle qui t'intéresse.
Maintenant si enlèves le "Exit Sub" ta boucle se fera intégralement et en particulier elle te permettra de voir les deux autres "bb" - "101" - "nn" (pour le constater ajoute la ligne suivante par exemple avant les lignes "Me.TextBox 2 = ......") et seules les données correspondantes à la dernière ligne "bb" .... seront retenues. Tu me diras que c'est que tu veux, mais si tu veux la valeur 662 correspondant à la première ligne contenant "bb" ...., alors ça n'ira plus.

        MsgBox (ActiveCell.Offset(0, 1).Text & "     " & ActiveCell.Offset(0, 2).Text)

J'ai été long mais j'ai tenu à être très précis pour te faire comprendre qu'il faudra choisir un champ supplémentaire et surtout un champ dont le contenu sera différent pour chaque ligne, et faire ta recherche sur ce champ.
A+
Jacky

Salut Jackie, y a-t-il une autre solution ou un autre code qui vient avec la valeur 163

Bonjour,

Comme je l'ai dit précédemment la solution est de créer un nouveau champ (n° d'ordre par exemple) afin de différencier chacune des lignes et de faire la recherche sur ce champ.
Mais je suppose que le fichier que tu joins n'est que partiel et que la colonne A contient des Noms. J'en déduis donc que "bb" est le nom d'une personne dont le code est "101", elle a effectué 3 "transactions" concernant le produit "nn". Je suppose également que ces "transactions" ont été effectuées à des dates différentes. Donc pourquoi ne pas utiliser un champ date pour faire tes recherches.
Si ce que je viens d'expliquer ne correspond absolument pas à ton travail, peux tu m'expliquer clairement ce que tu désires faire et me préciser ce que tu désires faire une fois l'Userform renseigné.
Je regarderai ce soir ou demain
Bonne journée
Jacky

Bonjour…

Jacky , avec ce que j'ai cru comprendre ...

La plage en Tableau (structuré)* nommé TB, tes contrôles nommés C1 (CombobBox…), T1 TextBox…), T2 puis T3 :

Dim R As Range, i As Long
Private Sub UserForm_Initialize()
  For Each R In [TB].Columns(1).Cells
    C1 = R
    If C1.ListIndex < 0 Then C1.AddItem R
  Next
  C1.ListIndex = 0
End Sub

Private Sub C1_Change()
  i = C1.ListIndex
  If i < 0 Then T1 = "": T2 = "": T3 = "": Exit Sub
  T1 = C1.Text: T2 = [TB].Item(i + 1, 2)
  i = [TB].Rows.Count + 1
  While [TB].Item(i, 1) <> C1: i = i - 1: T3 = [TB].Item(i, 4): Wend
End Sub

*pourquoi se priver d’un tel objet si indispensable dans le traitement de basses de données, surtout s’il est aussi à TCD, Power Querry ? D'autant plus que le projet est (ou sera plus) développé ?

17stock.xlsm (25.38 Ko)

Bonjour Ordonc,

Evidemment avec ce produit sensationnel qu'est le TCD ......
Mais en répondant à Mody, j'ai désiré conserver son idée première tout en lui expliquant le pourquoi des choses, sinon si ta proposition lui convient alors OK pour lui.
Bien cordialement et bonne fin de journée, au plaisir
Jacky

Bienvenue Ordonc

Vous êtes merveilleux, c'est vraiment ce que je voulais faire. Merci beaucoup et à tous ceux qui ont contribué à mon sujet, et vous avez mes salutations

Bonjour Ordonc,

Si j'ai bien compris avec le code que tu utilises tu recherches la dernière ligne dont la cellule de la colonne "A" contient la valeur demandée (ici "bb"). Est ce bien cela (il est vrai que je ne manipule pas très bien les TCD donc je peux faire erreur)
Si c'est le cas, en reprenant l'idée première de mody, il suffit de faire une boucle de recherche de la dernière ligne à la première step -1
Mais dans les deux cas de figure comment fait-il pour obtenir les données d'un "bb" intermédiaire ?
De plus aurais-tu la gentillesse d'expliquer les quelques lignes de code que tu utilises ?

Bien cordialement
Jacky

Bonjour …

Merci pour le retour Mody .

Jacky , comme tu l’as bien compris, je contruis ma boucle mais en gardant le style précédent.

Tu es plus habitué, me semble-t-il, à la boucle

For … To … Step …
  …
Next

D’autres le sont avec "je boucle jusqu’à ce que… "en anglais Until

Do
    …
Loop Until ... 

Ou avec "je boucle tant que" en anglais While

Do
    …
Loop While ...

Cette dernière étant équivalente à la forme moins utilisée avec une sortie programmée non pas à la fin mais au début

Ces boucles permettent de sortir plus vite en examinant moins de cas (comme le fait, d’ailleurs, la boucle Select Case End Select).

Il faut quand même faire très attention à bien programmer la sortie sous peine d’entrer dans une boucle sans fin bloquant le système.

Pour la seconde question, si j’avais compris qu’il fallait seulement la liste des données associées j’aurais flirté avec un Filtre.

Si j’ai parlé de TCD, Power Query, c’est tout simplement pour indiquer que le choix d’un objet est primordial pour éviter des lignes de VBA à tout va.

Voici quelques commentaires de ma proposition

Dim R As Range, i As Long ‘déclarations des variables (toujours présentes pour Moi !)
Private Sub UserForm_Initialize() ‘initialisation de la liste de C1 (très ancienne version !)
    For Each R In [TB].Columns(1).Cells ‘boucle sur les items donnés
       C1 = R
       If C1.ListIndex < 0 Then C1.AddItem R ‘doublons évités
    Next
    C1.ListIndex = 0
End Sub
Private Sub C1_Change() ‘selon le choix ou pas de l’item
    i = C1.ListIndex
    ‘si item pas choisi , mise à jour des contrôles avant la sortie
    If i < 0 Then T1 = "": T2 = "": T3 = "": Exit Sub 
    'sinon
    T1 = C1.Text: T2 = [TB].Item(i + 1, 2) ‘initialisations des 2 premiers contrôles
    ‘ligne sous la dernière à cause de la remontée  
    i = [TB].Rows.Count + 1
    'remontée d’une ligne tant que … puis sortie avec inscription dans le dernier contrôle
    While [TB].Item(i, 1) <> C1
        i = i - 1: T3 = [TB].Item(i, 4)
    Wend
End Sub

Bonjour Ordonc,

Merci pour ta réponse et pour tes explications surtout en ce qui concerne l'utilisation d'un TCD.
Je vais regarder cela de plus près et reviendrais vers toi pour te faire part de mes impressions.
Très cordialement et encore merci
Jacky

Rechercher des sujets similaires à "gestion stock"