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
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
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é ?
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
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