Développer un UserForm

Y compris Power BI, Power Query et toute autre question en lien avec Excel
m
medjsk
Membre fidèle
Membre fidèle
Messages : 163
Inscrit le : 26 juillet 2016
Version d'Excel : 2007

Message par medjsk » 11 septembre 2016, 15:50

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
Bon de sortie v28.xlsm
(181 Kio) Téléchargé 26 fois
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 11 septembre 2016, 16:50

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
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
m
medjsk
Membre fidèle
Membre fidèle
Messages : 163
Inscrit le : 26 juillet 2016
Version d'Excel : 2007

Message par medjsk » 11 septembre 2016, 16:55

Salut Theze

si vous pouvez l'appliquer dans mon fichier please

merci beaucoup
bye
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 11 septembre 2016, 17:07

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é.
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
m
medjsk
Membre fidèle
Membre fidèle
Messages : 163
Inscrit le : 26 juillet 2016
Version d'Excel : 2007

Message par medjsk » 11 septembre 2016, 18:04

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
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 15 septembre 2016, 16:15

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 !
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
m
medjsk
Membre fidèle
Membre fidèle
Messages : 163
Inscrit le : 26 juillet 2016
Version d'Excel : 2007

Message par medjsk » 15 septembre 2016, 17:50

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
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'513
Appréciations reçues : 242
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 17 septembre 2016, 09:01

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.
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message