Passage d'InputBox à un UserForm.
Bonjour à tous !
Après avoir créé une macro utilisant plusieurs InputBox et une boucle conditionnelle utilisant les données entrées dans les InputBox, j'ai voulu simplifier la procédure en utilisant un unique UserForm contenant plusieurs TextBox correspondant au champs anciennement renseignés dans mes InputBox.
Seulement voila, ma boucle ne foncionne plus correctement et réagit désormais de façon un peu eratique.
Ma façon de procéder a été la suivante:
J'ai tout d'abord renommé mes textbox
J'ai déclaré mes variables
Puis copié/collé cette macro dans le code UserForm1
Enfin j'ai fais un "Call" vers cette procedure lorsque le Bouton Executer est cliquer.
Voici le code en question:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
Private Sub Exécuter_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button Then Call TRIP
Unload UserForm1
Sheets("Gestion").Activate
End Sub
Sub TRIP()
Sheets("Gestion").Activate
lDerniereLigne = Range("W1").End(xlDown).Address
lDerniereLigne = Range(lDerniereLigne).Row
For I = 2 To lDerniereLigne
While Range("S" & I) <> Empty
Rows(I).Select
Selection.Delete Shift:=xlUp
Wend
Next
Sheets("Projets négo").Activate
Dim minkch As Integer
Dim maxkch As Integer
Dim montantexportmin As Long
Dim montantexportmax As Long
Dim montantimportmin As Long
Dim montantimportmax As Long
Dim echeance As Date
Dim Devise2 As String
Dim Devise1 As String
lDerniereLigneReelle = Range("W2").End(xlDown).Address
lDerniereLigneReelle = Range(lDerniereLigneReelle).Row
Range("A:A,E:E").Replace What:=" ", Replacement:="", LookAt:=xlPart
Range("A:A,E:E").Replace What:="à", Replacement:="", LookAt:=xlPart
End Sub
For u = 2 To lDerniereLigneReelle
If Range("A" & u) = UserForm1.Devise1.Text And Range("B" & u) = UserForm1.Devise2.Text Then
If Range("S" & u) >= UserForm1.minkch.Value _
And Range("S" & u) <= UserForm1.maxkch.Value _
And Range("K" & u) <= UserForm1.echeance _
And UserForm1.montantexportmin.Value >= Range("L" & u).Value _
And Range("L" & u) <= UserForm1.montantexportmax.Value Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow
End If
Else
If UserForm1.Devise1.Text = "" _
And Range("B" & u) = UserForm1.Devise2.Text Then
If Range("S" & u) >= UserForm1.minkch.Value _
And Range("S" & u) <= UserForm1.maxkch.Value _
And Range("K" & u) <= UserForm1.echeance _
And Range("L" & u) <= UserForm1.montantexportmax.Value _
And Range("L" & u) >= UserForm1.montantexportmin.Value Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow
End If
Else
If Range("A" & u) = UserForm1.Devise1.Text _
And UserForm1.Devise2.Text = "" Then
If Range("S" & u) >= UserForm1.minkch.Value _
And Range("S" & u) <= UserForm1.maxkch.Value _
And Range("K" & u) <= UserForm1.echeance _
And Range("L" & u) <= UserForm1.montantexportmax.Value _
And Range("L" & u) >= UserForm1.montantexportmin.Value Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow
End If
Else
If UserForm1.Devise1.Text = "" _
And UserForm1.Devise2.Text = "" Then
If Range("S" & u) >= UserForm1.minkch.Value _
And Range("S" & u) <= UserForm1.maxkch.Value _
And UserForm1.montantexportmin >= Range("L" & u) _
And Range("L" & u) <= UserForm1.montantexportmax Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow
End If
End If
End If
End If
End If
Next u
Sheets("Gestion").Activate
With ActiveSheet.UsedRange
derLi = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For R = derLi To 1 Step -1
If Application.CountA(Rows(R)) = 0 Then Rows(R).Delete
Next R
Sheets("Gestion").Activate
End Sub |
Merci pour vos futurs éclairages.
Cordialement,
RSoul
Après Prise en compte de vos conseils:
J'ai essayer de clarifier un petit peu mon codes en ajoutant qques com.
Ne connaisant pas la manip de "Case" je prefere me contenter pour l'instant de la fonction IF, si vs pensez que case serait mieux adaptés à mon cas je my mettrais!
En attendant de profiter de vos éclairages bonne aprem!!
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
Private Sub Exécuter_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Me.Hide = True 'j'ai testé ce private sub mais le mess d'erreur suivant apparait:" erreur de compilation: Affectation à une constante non autorisée"
TRIP
End Sub
Sub TRIP()
'déclaration de mes var
Dim minkch As Integer, maxkch As Integer '<---minkch= coef de chance le plus petit que l'on souhaite, Max =le plus gran
Dim montantexportmin As Long, montantexportmax As Long '<---montantexportmin= montant min et montant max pour montantexportmax
Dim echeance As Date, Devise2 As String, Devise1 As String '<---- echeance =date max que l'on souhaite//Devise1= 1ere devise du projet et Devise2=2ieme devis
Dim lDerniereLigneReelle As Integer
Dim I As Integer, u As Integer '<---I et u = compteurs
'je commence par "nettoyer" ma feuille "Gestion" des données précedentes en concervant l'entete.
With Sheets("Gestion")
For I = 2 To .Range("W1").End(xlDown).Row
If .Range("S" & I) <> "" Then .Rows(I).Delete
Next
End With
' Maintenant le but est d'utiliser un Userform ( le "Userform1" en locurence) afin de faire un tri parmi tous le projets qui se trouvent dans "Projets négos" et en fonction des données entrées dans mon Userform1, les lignes correspondant chacune a un projet sont exportées da la feuille "Gestion"
With Sheets("Projets négo")
'Parametrage de mon compteur
lDerniereLigneReelle = Range("W2").End(xlDown).Address
lDerniereLigneReelle = Range(lDerniereLigneReelle).Row
'
For u = 2 To lDerniereLigneReelle
If Range("A" & u) = UserForm1.Devise1.Text And Range("B" & u) = UserForm1.Devise2.Text Then ' si dans l'userform, l'utilisateur renseigne les 2 devises qu'il recherche alors on peut passer à la suite;
If Range("S" & u) >= UserForm1.minkch.Value And Range("S" & u) <= UserForm1.maxkch.Value And Range("K" & u) <= UserForm1.echeance And UserForm1.montantexportmin.Value >= Range("L" & u).Value And Range("L" & u) <= UserForm1.montantexportmax.Value Then ' si parmi les projets dont les devises correspondent à celle renseignées plus tot, le KCH est compris entre le minkch(au choix de l'utlisateur mais minimum=0) et la maxkcx (au choix de l'utilisateur mais max=100), et si le date des projets est ineferieure à la date entrée par l'utilisateur et en si la somme est sup a montantexportmin et inf a montantexportmax alors:
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow 'la ligne est copiée
End If
Else 'ou
If UserForm1.Devise1.Text = "" And Range("B" & u) = UserForm1.Devise2.Text Then ' si l'user décide de ne renseigner qu'un des 2 champs de devises alors la la procédure doit etre semblale à la precedente, sauf que tous les projets ayant la devise2 entrée par le user devront cette fois ci etre selectionnés
If Range("S" & u) >= UserForm1.minkch.Value And Range("S" & u) <= UserForm1.maxkch.Value And Range("K" & u) <= UserForm1.echeance And Range("L" & u) <= UserForm1.montantexportmax.Value And Range("L" & u) >= UserForm1.montantexportmin.Value Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow ' et donc copié dans"Gestion"
End If
Else
If Range("A" & u) = UserForm1.Devise1.Text And UserForm1.Devise2.Text = "" Then 'idem a l'etape precedente, sauf que cette fois ci on envisage le cas ou le user a renseigné la 1ere devise et pas la seconde
If Range("S" & u) >= UserForm1.minkch.Value And Range("S" & u) <= UserForm1.maxkch.Value And Range("K" & u) <= UserForm1.echeance And Range("L" & u) <= UserForm1.montantexportmax.Value And Range("L" & u) >= UserForm1.montantexportmin.Value Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow
End If
Else
If UserForm1.Devise1.Text = "" And UserForm1.Devise2.Text = "" Then ' enfin dans le cas ou le user n'aurait renseigné aucune des devises les projets respectant les conditions suivantes seront selectionnés.
If Range("S" & u) >= UserForm1.minkch.Value And Range("S" & u) <= UserForm1.maxkch.Value And UserForm1.montantexportmin >= Range("L" & u) And Range("L" & u) <= UserForm1.montantexportmax Then
Rows(u).Copy Destination:=Worksheets("Gestion").Rows(u).EntireRow
End If
End If
End If
End If
End If
Next u
' le process suivant vise à remonter ttes les ligne et a suprmer les blanc
Sheets("Gestion").Activate
With ActiveSheet.UsedRange
derLi = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For R = derLi To 1 Step -1
If Application.CountA(Rows(R)) = 0 Then Rows(R).Delete
Next R
Sheets("Gestion").Activate
End Sub |