Développer un UserForm
Salut les Experts
s'il serait possible de m'aider à développer un user form établi par mon ami GMB.
lorsque il ya un doublon dans la colonne E (FEUILLE MAGASIN) il me provoque un problème il distingue pas les quantités colonne E
dans la feuille magasin User Form 2 (colonne E) lorsque je l'ouvre et je sélectionne la référence 10-0023C il m’affiche la mémé quantité pourtant elles sont différente!!!!
je serais reconnaissant à vous
merci infiniment
bye bye
Bonjour,
Il n'est pas nécessaire d'effectuer une recherche avec Find (surtout si il y a des doublons !), il faut utiliser directement l'index de la ListBox et effectuer le décalage nécessaire car l'index de base de la ListBox est 0 et comme tu as des entêtes de colonnes, il te faut rajouter 2 pour tomber sur la bonne ligne :
Sub FormulaireModif()
UserForm2.Width = 740
'CommandButton2.Visible = False
CommandButton3.Visible = False
CommandButton4.Visible = False
CommandButton5.Visible = False
TextBox6 = TextBox1
For j = 1 To 15
Controls("Textbox" & j + 1) = Cells(ListBox1.ListIndex + 2, j)
Next j
TextBox18 = 0
TextBox19 = 0
Call TextBox18_Change
Call TextBox19_Change
TextBox15.Locked = True
TextBox16.Locked = True
End Sub
Salut Theze
si vous pouvez l'appliquer dans mon fichier please
merci beaucoup
bye
Tu ouvre le module du formulaire UserForm2 puis Ctrl+F et dans le champ tu colles ces mots "Sub FormulaireModif()" tu coches les cases "Mot entier" et "Respecter la casse" puis clic sur le bouton "Suivant" tu vas tomber sur la Sub et tu la remplaces par le code que je t'ai posté.
Salut THeze
comme ca User form il distingue mais il reste un petit problème si vous pouvez le résoudre
quand je sélectionne celui qui a la quantité 6 et je clique sur sortir il se mets dans la feuille bon de sortir
lorsque je saisir la quantité (la cellule O11 feuille bon de sortie) il me demande de retirer la quantité de la la feuille magasin je clique oui
le problème qu'il se déduit de la référence celle ki a la quantité 125 (non sélectionne )!!! au lieu de celui ki a 6.
je vous remercie beaucoup
bye bye
Bonjour,
Le problème de la recherche avec Find, si il y a des doublons, le numéro de ligne du premier trouvé sera retournée !
t = fm.Range("C:C").Find(TextBox4, lookat:=xlWhole).Row
Remplace le code du bouton "Private Sub CommandButton2_Click()" de la Form "UserForm2" par celui-ci :
Private Sub CommandButton2_Click()
n = 0
For I = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(I) = True Then
lgn = IIf(fb.Range("A" & Rows.Count).End(xlUp).Row = 10, 11, fb.Range("A" & Rows.Count).End(xlUp)(3).Row)
'c'est ici qu'il faut mémoriser la position de la séléction dans la listbox non pas faire une recherche
'car si doublon, la ligne du premier trouvé sera retournée
t = ListBox1.ListIndex + 2
n = fb.Range("A" & lgn - 2) + 1
fb.Range("A" & lgn) = n
For j = 1 To 4
colM = Choose(j, 1, 3, 5, 14)
colB = Choose(j, 2, 3, 12, 17)
fb.Cells(lgn, colB).Value = fm.Cells(t, colM).Value
Next j
End If
Next I
fb.Select
Unload Me
End Sub
Il faudrait revoir le code dans son ensemble car il y a des choses qui finiront par poser problème tôt ou tard comme les Ranges qui ne sont pas parentés donc, si on ouvre une Form sur une feuille qui n'est pas sa cible ça devient n'importe quoi !
Salut
le problème se persiste toujours il diminue la quantité de 125 de la cellule E2
pourtant moi j'ai sélectionné la cellule E3 qui a la quantité 6 lorsque j'ai fais sortir il devrai déduire de cette quantité
et pas celle de E2 125
voila le grand problème
s'il serait possible de le régler je serai très heureux
merci infiniment
bye
Bonjour,
Le problème vient du fait que pour la récupération de la ligne ou se situe l'élément visé se fait par une recherche Find et donc, problème quand il y a doublon.
Pour régler ce problème, il te faut déclarer dans un module standard une variable publique. Comme la variable "t" est utiliser dans l'UserForm2 pour connaître la position de l'élément, il suffit de la supprimer de la Form et de la déclarer Public dans un module :
'en tête de module
Public T As Long
Et dans le module de la feuille "BON DE SORTIE", remplacer la procédure évènementielle par celle-ci :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 2 Then Exit Sub
Application.EnableEvents = False
Set fb = Sheets("BON DE SORTIE")
Set fm = Sheets("MAGASIN")
derln = Application.Max(11, fb.Range("B" & Rows.Count).End(xlUp).Row)
If Not Intersect(Target, fb.Range("O11:O" & fb.Range("O" & derln).Row)) Is Nothing Then
ref = Target.Offset(0, -3)
lgn = T 'fm.Range("E:E").Find(ref, lookat:=xlWhole).Row
rep = MsgBox("Vous allez retirer une quantité de " & Target & " à la quantité de '' " & Target.Offset(0, -12) & _
" disponible en magasin." & Chr(13) & Chr(13) & _
"Confirmez-vous ?", 20)
If rep = 7 Then
Target = ""
GoTo fin
End If
fm.Range("O" & lgn) = fm.Range("O" & lgn) - Target
End If
fin:
Application.EnableEvents = True
End Sub
C'est juste la ligne -->"lgn = fm.Range("E:E").Find(ref, lookat:=xlWhole).Row"<-- qui est remplacée par -->"lgn = T"<--
Je pense que le code de l'ensemble du classeur devrait être repris. Le mieux serait de contacter le créateur de ce code car je dois passer un peu trop de temps à en comprendre le fonctionnement.