Filtrer données avec 2 combobox

matrix

XLDnaute Occasionnel
Voici mon problème de macro.

Mon premier combobox du nom: "CboxWBS" contient les noms de la colonne B, et le comboBox du nom: "CboxNetwork" contient les prenoms qui va avec le nom, et ces prenoms sont dans la colonne C.

Alors si je choisit un nom "CboxWBS" et un prenom "CboxNetwork", selon les 2 valeurs des 2 combobox, il me donne la valeur de la colonne F (Téléphone) de la même ligne dans mon TextBox1, ensuite la valeur de la colonne I (Cellulaire) de la même ligne dans le textbox2 ainsi que la valeur de la colonne J (Courriel 1) dans le TextBox3.


Voici mon script jusqu'à maintenant:
Code:
Dim i As Long, DerL As Long, r As Long, Opid1 As String, Opid2 As String
 
DerL = Sheets("Base de donnée").Cells(Rows.Count, 1).End(xlUp).Row
 
For i = 2 To DerL
Opid1 = CboxWBS.Text
Opid2 = CboxNetwork.Text
    Set c = Sheets("Base de donnée").Range("b:b").Find(What:=Opid1, LookAt:=xlWhole)
    Set d = Sheets("Base de donnée").Range("c:c").Find(What:=Opid2, LookAt:=xlWhole)
        If Not c Is Nothing Then
        On Error Resume Next
            r = c.Row
            s = d.Row
            CboxCPM = Sheets("Base de donnée").Cells(r & s, 1)
            TextBox1 = Sheets("Base de donnée").Cells(r & s, 6)
            TextBox2 = Sheets("Base de donnée").Cells(r & s, 9)
            TextBox3 = Sheets("Base de donnée").Cells(r & s, 10)
            TextBox4 = Sheets("Base de donnée").Cells(r & s, 13)
            DTPicker2 = Sheets("Base de donnée").Cells(r & s, 12).Value
            'Label19 = DateDiff(Date - Sheets("Base de donnée").Cells(r, 12) + 365))
            p = Sheets("Base de donnée").Cells(r, 12).Value + 365
            
           Label19 = DateDiff("d", Date, p)
            Label20 = "jour(s) restant avant expiration"
           If Label19 > "365" Then
           Label19 = "Expiré"
           Label20 = "Vous devez renouvler l'antivirus"
       Else
        
        If Sheets("Base de donnée").Cells(r, 12).Value = vbNullString Then
         DTPicker2.Enabled = False
          Label19 = ""
           Label20 = "Aucun antivirus n'a été installé sur cette ordinateur"
        Else
 
        End If
        End If
        End If
Next i

Comment faire s.v.p?

Merci pour votre aide.
 

Pièces jointes

  • test1.zip
    39.8 KB · Affichages: 54
  • test1.zip
    39.8 KB · Affichages: 56
  • test1.zip
    39.8 KB · Affichages: 57

Gorfael

XLDnaute Barbatruc
Re : Filtrer données avec 2 combobox

Salut matrix et le forum
Si tu veux qu'on puisse t'aider à corriger un code, il faut que la description du but à atteindre soit en correspondance avec le code. C'est quoi cet antivirus ???
Tu parles de script ? pas de VBA ? Je ne donne qu'une macro, pas un script.
Une proposition non testée :
Code:
Sub test()
'"CboxWBS" contient les noms de la colonne B
'"CboxNetwork" contient les prenoms dans la colonne C.
'F => TextBox1
'I => textbox2
'J => TextBox3.
'Dim i As Long, DerL As Long, r As Long, Opid1 As String, Opid2 As String
Dim F As Worksheet, Cel_N As Range, Cel As Range
 
set F = Sheets("Base de donnée").
Set Cel_N = F.Columns(2).Find(CboxWBS, LookIn:=xlValues)
Set Cel = Cel_N
Do
    If Cel_N Is Nothing Then
        MsgBox "Pas de correspondant de trouvée!!!", vbCritical + vbOKOnly, "Recherche de nom"
        Exit Sub
    Else
        
        If Cel_N.Offset(0, 1) = Me.CboxNetwork Then
            Me.TextBox1 = F.Range("F" & Cel_N.Row)
            Me.TextBox2 = F.Range("I" & Cel_N.Row)
            Me.TextBox3 = F.Range("J" & Cel_N.Row)
            Exit Sub
        End If
    End If
    Set Cel_N = F.Columns(2).Find(CboxWBS, LookIn:=xlValues)
    If Cel_N.Address = Cel.Address Then Set Cel_N = Nothing
Loop
End Sub
Remarques sur le "code" donné :
- Déclarer les variables c'est bien. Mais pourquoi que certaines et pas toutes ?
- Ce code semble être utilisé sur un USF : pourquoi ne pas le préciser ?
Code:
On Error Resume Next
Tu travailles chez microsoft :D ?
Quand tu as une erreur, la camoufler est rarement une bonne solution. Il vaut mieux en être averti et la traiter, sauf dans les rares cas où tu ne peux la traiter, ou tu l'utilises (comme utiliser une collection pour éliminer les doublons).

-"Voici mon script jusqu'à maintenant" : pour moi, c'est une copie non comprise d'un code existant (mais je peux me tromper). Si c'est le cas dis-le! Il n'y a aucune honte à avoir, tout le monde a commencé par ça. Mais dans ce cas, j'explique plus ce que je fais et pourquoi.
A+
 

Modeste

XLDnaute Barbatruc
Re : Filtrer données avec 2 combobox

Bonjour matrix, Gorfael, le forum,

... Gorfael a certainement un niveau de compétence supérieur au mien. Cependant, comme j'y travaillais en même temps, ... ben voilà:
à la ligne 70 du code USF "accueil":
Code:
 DerL = Sheets("Base de donnée").Cells(Rows.Count, [B][COLOR="Red"]2[/COLOR][/B]).End(xlUp).Row
... puisque la colonne A ne contient qu'une valeur !

Dans la partie:
Code:
Private Sub CboxNetwork_Change()
Opid1 = CboxWBS.Text
Opid2 = CboxNetwork.Text
[COLOR="Red"]With Sheets("Base de donnée")
    For i = 2 To DerL
        If .Range("B" & i).Value = Opid1 Then
            If .Range("C" & i).Value = Opid2 Then r = i
        End If
    Next i
End With[/COLOR]
'    Set c = Sheets("Base de donnée").Range("b:b").Find(What:=Opid1, LookAt:=xlWhole)
'    Set d = Sheets("Base de donnée").Range("c:c").Find(What:=Opid2, LookAt:=xlWhole)
'        If Not c Is Nothing Then
'        On Error Resume Next
'            r = c.Row
'            s = d.Row
            CboxCPM = Sheets("Base de donnée").Cells(r, 1)
            TextBox1 = Sheets("Base de donnée").Cells(r, 6)
            TextBox2 = Sheets("Base de donnée").Cells(r, 9)
            TextBox3 = Sheets("Base de donnée").Cells(r, 10)
            TextBox4 = Sheets("Base de donnée").Cells(r, 13)
            DTPicker2 = Sheets("Base de donnée").Cells(r, 12).Value
etc ...

en remplaçant les 6 lignes mises en commentaires par les 7 lignes en rouge, les textBox se "garnissent" comme attendu.

... à mon avis, il y aura encore du boulot pour le reste, mais bon: "à chaque jour suffit sa peine !"

Bon courage,

Modeste
 

matrix

XLDnaute Occasionnel
Re : Filtrer données avec 2 combobox

Merci beaucoup a vous 2.

J,ai commencé par faire le test avec celui de Gorfael. Ça fonctionne bien sauf pour une chose. Pour l'exemple du nom de famille POITRAS. Le premier nom MARCEL qui correspond avec le nom de famille, j'ai les données dans les textboxs. Par contre si je choisis le 2e nom, toujours avec le même nom de famille, il me donne le message :Pas de correspondant de trouvée!!!

Pourtant, il devrait me donner l'info dans les textbox.

Gorfael, désolé pour les termes que je peux utiliser parfois comme macro et script. Pour moi, c'est la même chose. Je ne connais pas la différence n'étant pas une personne expérimentée en VBA.

Là je sais que ce n'est pas la même chose.


Je faire faire le test avec la macro de Modeste aussi.
 

Gorfael

XLDnaute Barbatruc
Re : Filtrer données avec 2 combobox

Salut matrix et le forum
Ne pouvant ouvrir ton exemple, je ne peux que travailler sur ton code. Et à force de manip, j'ai un peu merdu sur mon code
Code:
Sub test()
'"CboxWBS" contient les noms de la colonne B
'"CboxNetwork" contient les prenoms dans la colonne C.
'F => TextBox1
'I => textbox2
'J => TextBox3.
'Dim i As Long, DerL As Long, r As Long, Opid1 As String, Opid2 As String
Dim F As Worksheet, Cel_N As Range, Cel As Range
 
set F = Sheets("Base de donnée").
Set Cel_N = F.Columns(2).Find(CboxWBS, LookIn:=xlValues)
Set Cel = Cel_N
Do
    If Cel_N Is Nothing Then
        MsgBox "Pas de correspondant de trouvée!!!", vbCritical + vbOKOnly, "Recherche de nom"
        Exit Sub
    Else
        
        If Cel_N.Offset(0, 1) = Me.CboxNetwork Then
            Me.TextBox1 = F.Range("F" & Cel_N.Row)
            Me.TextBox2 = F.Range("I" & Cel_N.Row)
            Me.TextBox3 = F.Range("J" & Cel_N.Row)
            Exit Sub
        End If
    End If
    Set Cel_N = F.Columns(2).FindNext '***************
    If Cel_N.Address = Cel.Address Then Set Cel_N = Nothing
Loop
End Sub
J'ai corrigé (j'espère) la ligne avec **************

Modeste : personne n'est meilleur qu'un autre : sur excel, c'est l'idée (l'algorythme, pour faire celui qui connaît :D) qui est intéressante, et on est tous au même niveau.
Juste une remarque sur ton code :
Code:
[COLOR=black]With Sheets("Base de donnée")
    For i = 2 To DerL
        If .Range("B" & i).Value = Opid1 Then
            If .Range("C" & i).Value = Opid2 Then r = i
        End If
    Next i
End With[/COLOR]
c'est sa lenteur qui me gène. tu as 20000 nom en B et tu trouves la correspondance en ligne 3 => 19997 passages dans la boucle pour rien... On peut améliorer avec :
Code:
[COLOR=black]With Sheets("Base de donnée")
    For i = 2 To DerL
        If .Range("B" & i).Value = Opid1 Then
            If .Range("C" & i).Value = Opid2 Then [/COLOR]
[COLOR=black]                 r = i[/COLOR]
[COLOR=black]                 exit for
            End If[/COLOR]
[COLOR=black]        End If
    Next i
End With[/COLOR]
N'ayant pas accès au fichier, je ne peux savoir si B/C sont triées dans ce cas, trouver le nom pourrait se faire avec un find, et le prénom avec une boucle (Do.. loop until) avec une sortie en exit do
A+
 

Cousinhub

XLDnaute Barbatruc
Re : Filtrer données avec 2 combobox

Bonjour,

comme te l'avait (presque) montré Gorfael, il faut corriger la ligne :

Code:
    Set Cel_N = F.Columns(2).FindNext(Cel_N)

ce qui donne ce code :

Code:
Private Sub CboxNetwork_Change()
Dim F As Worksheet, Cel_N As Range, Cel As Range
 
Set F = Sheets("Base de donnée")
Set Cel_N = F.Columns(2).Find(CboxWBS, LookIn:=xlValues)
Set Cel = Cel_N
Do
    If Cel_N Is Nothing Then
        MsgBox "Pas de correspondant de trouvée!!!", vbCritical + vbOKOnly, "Recherche de nom"
        Exit Sub
    Else
        
        If Cel_N.Offset(0, 1) = Me.CboxNetwork Then
            Me.TextBox1 = F.Range("F" & Cel_N.Row)
            Me.TextBox2 = F.Range("I" & Cel_N.Row)
            Me.TextBox3 = F.Range("J" & Cel_N.Row)
            Exit Sub
        End If
    End If
    Set Cel_N = F.Columns(2).FindNext(Cel_N)
    If Cel_N.Address = Cel.Address Then Set Cel_N = Nothing
Loop


End Sub
 

Modeste

XLDnaute Barbatruc
Re : Filtrer données avec 2 combobox

re-bonjour aux deux premiers, salut bhbh,

Modeste : personne n'est meilleur qu'un autre
Tu noteras que j'ai parlé de niveau de compétences ... Il faut quand même reconnaître que certains sont "balèzes"
sur excel, c'est l'idée (l'algorythme, pour faire celui qui connaît :D) qui est intéressante, et on est tous au même niveau.
J'ai hésité, mais pas pu résister: c'est 'algorithme' ... (pour faire celui qui connaît aussi :eek:) ... t'es pas fâché, dis Gorfael ?? ... maintenant je vais me poser la question pendant 15 jours
Juste une remarque sur ton code :[...] c'est sa lenteur qui me gène. tu as 20000 nom en B et tu trouves la correspondance en ligne 3 => 19997 passages dans la boucle pour rien...
Effectivement, tu as mille fois raison. J'aurais pu (ou dû?) y penser

Modeste
 

Discussions similaires

Réponses
17
Affichages
941

Statistiques des forums

Discussions
312 658
Messages
2 090 616
Membres
104 610
dernier inscrit
jeanMe