IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

ComboBox "Filtrée" et "Combinée" [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut ComboBox "Filtrée" et "Combinée"
    Bonjour à tous ,

    De retour pour me permettre de comprendre si vous le voulez bien
    le code suivant dont l'inspiration est issue de ce forum :

    Plantons le décor
    un USF avec 2 ComboBox
    -> (Box2) = filtrée
    -> (Box3) = filtré à partir des données de Box2
    ensuite recherche dans la feuille choisie des données à mettre à jour puis sauvegarde ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Private Sub Box2_Change()
    Dim c As Range
     
    'filtrage de la feuille de donnée sur la valeur de combo et remplissage
    'de combo2 par les valeurs des cellules filtrées et le numéro de ligne
     
    'Application.ScreenUpdating = False
     
    Me.Box3.Clear
    With Sheets("TR" & Box1.Value)
       .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter field:=1, Criteria1:=Box2.Value
       For Each c In .Range("B6:B" & .Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible)
          With Me.Box3
             .AddItem c.Value
             .List(.ListCount - 1, 1) = c.Row
          End With
       Next c
       .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter
    End With
    Me.Box2.Locked = True <----- (2)
     
    End Sub
    J'ai trois problèmes distincts liés à ce code

    1 ) celui remplit parfaitement son rôle qui consiste à mettre dans Box3.value le resultat de la colone B ( chiffre ) + le N° de la ligne pour une utilisation ulterieure mais ne fonctionnement plus dès qu'il s'agit de la 1ere ligne de la feuille ( ici "TR"+... ) pour resoudre ce pb j'ai du mettre "B5:B" au lieu de "B6:B" (?)

    2) si l'utilisateur veut réactualiser Box2.value , çà plante et j'ai du mettre la ligne en (2) là aussi çà marche mais je sais pas (?)

    3) malgre l'utilisation "Range("A5"....).autofilter ,le filtre sur la feuille concerné disparait


    Voilà en quelques mots mes divers pb
    Merci par avance de bien vouloir me preter un petit coup de main et Bon WE à tous !!
    A++

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour,
    Et voilà, les aléas de partir sans dire adieu. (tu as compris de quoi je parle: regarde du côté de la dernière réponse de ton précédent sujet)
    J'explique et tu auras les réponses toi-même.
    Les données de la feuille Feuil1 commencent à partir de la ligne 6 (la ligne 5 étant celle des titres: obligatoires pour le filtrage).
    Le filtre étant une étape intermédiaire, à la fin il a été spécialement désactivé.
    Ci-joint code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
    Dim Lig As Long
     
    Private Sub UserForm_Initialize()
    Dim T As Object
    Dim Temp
    Dim c As Range
     
    Set T = CreateObject("Scripting.Dictionary")
    'Remplissage de la Box2 sans doublons
    With Sheets("Feuil1")
       For Each c In .Range("A6", .Cells(Rows.Count, 1).End(xlUp))  'Ligne 6 ligne réservée aux titres
          T.Item(c.Value) = c.Value
       Next c
    End With
    Temp = T.items
    Tri Temp, LBound(Temp), UBound(Temp)
    Me.Box2.List = Temp
     
    Set T = Nothing
    'Définition de la Box3 à 2 colonnes
    With Me.Box3
       .ColumnCount = 2
       .ColumnWidths = .Width - 2 & ";0"
    End With
    End Sub
     
    Private Sub Box2_AfterUpdate()
    Dim c As Range
     
    Me.Box3.Clear
    If Me.Box2.ListIndex > -1 Then
       Application.ScreenUpdating = False
       'filtrage de la feuille de donnée sur la vaaleur de combo et remplissage
       'de combo2 par les valeurs des cellules filtées et le numéro de ligne
       With Sheets("Feuil1")
          .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter field:=1, Criteria1:=Me.Box2.Value  'Ligne 5: ligne des titres
          For Each c In .Range("B6:B" & .Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible) 'Données à partir de la ligne 6
             With Me.Box3
                .AddItem c.Value
                .List(.ListCount - 1, 1) = c.Row
             End With
          Next c
          .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter
       End With
    End If
    End Sub
     
    Private Sub Box3_AfterUpdate()
    'Récupération du n° de la ligne contenant les données
    If Me.Box3.ListIndex > -1 Then Lig = Me.Box3.List(Me.Box3.ListIndex, 1)
     
    End Sub
     
    Private Sub CommandButton1_Click()
     
    If Lig > 5 Then
       With Sheets("Feuil1")
          .Range("C" & Lig) = Me.TextBox1
          .Range("D" & Lig) = Me.TextBox2
          .Range("E" & Lig) = Me.TextBox3
       End With
       Lig = 0     'Réinitialisation de Lig
    End If
    Unload Me
    End Sub
     
    Sub Tri(Tableau, L As Integer, R As Integer)
    Dim G As Integer, D As Integer
    Dim Ref, Temp
     
    Ref = Tableau((L + R) \ 2)
    G = L
    D = R
    Do
       Do While Tableau(G) < Ref
          G = G + 1
       Loop
       Do While Ref < Tableau(D)
          D = D - 1
       Loop
       If G <= D Then
          Temp = Tableau(G)
          Tableau(G) = Tableau(D)
          Tableau(D) = Temp
          G = G + 1
          D = D - 1
       End If
    Loop While G <= D
    If G < R Then Tri Tableau, G, R
    If L < D Then Tri Tableau, L, D
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut
    Mille et uns pardons mercatog
    mais si j'ai manqué de politesse dans ma démarche
    saches que ce n'est franchement pas volontaire et te demandes de bien vouloir m'en excuser , j'étais peut-être trop fixé sur la résolution de ma demande et pas assez sur le dialogue
    Il serait absurde de ma part de ne pas vous associer à cette demarche devant tout le besoin que demontre le forum
    Encore donc milles excuses

    Cordialement

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Si tu remarque que le code est sur l'évènement Afterupdate avec le test sur le contenu de Box2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.Box2.ListIndex > -1 Then
    Pour que cette méthode fonctionne, il est impératif qu'une ligne soit réservée aux titres de colonnes.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut RE
    =mercatog
    Les données de la feuille Feuil1 commencent à partir de la ligne 6 (la ligne 5 étant celle des titres: obligatoires pour le filtrage).
    Le filtre étant une étape intermédiaire, à la fin il a été spécialement désactivé.
    Ci-joint code complet...
    Precise-moi une chose STP
    Dans ton code , tu poses bien un filtre que sur la première colonne puis à la fin du calcul , tu l'élimines ? c'est cela ?

    En fait , j'utilise dans mon tableau une ligne que j'appelle" ligne de filtre" après
    la ligne de titre avec en plus un bouton "RAZ Filtre" pemettant à l'utilisateur
    de retirer tous les filtres existants sur la feuille
    Serait-ce peut-être cela la cause de la perte du filtre ?

    A+

  6. #6
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut
    Ok mal vu donc ..

    J'avais pas vu que Box2 était sur l'évènement Afterupdate
    je l'ai mis sur change()

    A+

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Dim c As Range
     
    Me.Box3.Clear
    If Me.Box2.ListIndex > -1 Then
       Application.ScreenUpdating = False
       'filtrage de la feuille de donnée sur la vaaleur de combo et remplissage
       'de combo2 par les valeurs des cellules filtées et le numéro de ligne
       With Sheets("Feuil1")
          .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter field:=1, Criteria1:=Me.Box2.Value  'Ligne 5: ligne des titres
          For Each c In .Range("B6:B" & .Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible) 'Données à partir de la ligne 6
             With Me.Box3
                .AddItem c.Value
                .List(.ListCount - 1, 1) = c.Row
             End With
          Next c
          .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter  '<---ICI on supprime le filtre
       End With
    End If
    End Sub
    Le filtre est supprimé à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter  '<---ICI on supprime le filtre
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  8. #8
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut
    OK donc si je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A5", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter  '<---ICI on supprime le filtre
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A5","M5").AutoFilter  '<---ma ligne de filtre
    çà pourrait marcher ?
    A+

  9. #9
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    En fait, t'as raison,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A5").AutoFilter
    suffit pour supprimer la filtre
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  10. #10
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Temp = T.items
    Tri Temp, LBound(Temp), UBound(Temp)
    J'aurais besoin STP quelques explications sur ce bout de code
    Il s'agit de trier la liste mais j'ai un plantage d'enfer
    sur la ligne :
    Temp = T.items

    l'erreur est : variable objet non definie ???

    j'ai bien mis la déclaration "Dim Temp" mais ...

    A+

  11. #11
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut
    OK merci à toi


    A++

  12. #12
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    788
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 788
    Points : 230
    Points
    230
    Par défaut RE
    Suite l'envoi du fichier Combox.xls" et aux corrections apportées
    çà marche nickel !!

    Je pense que tu as repondu à l'ensemble de mes petits problèmes
    je clos la demande

    Merci donc à toi mercatog pour tes lumières et au forum bien sûr ..

    l'aventure continue ...
    A++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtre VBA, problemme avec double quote
    Par choubak dans le forum VBA Access
    Réponses: 7
    Dernier message: 29/06/2007, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo