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 :

problèmes Filtre combobox [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 13
    Par défaut problèmes Filtre combobox
    Bonjour à tous

    j'ai un combobox (désignation) que je filtre en fonction d'une autre ( catégorie articles).

    lorsque je choisis une valeur dans la catégorie articles, les valeurs correspondantes a la désignation s'affiche bien.

    mon soucis est que lorsque je choisis à nouveau un autre catégorie d'articles, au lieu que les valeurs dans le combobox désignation soit celle uniquement celle de la nouvelle catégorie , les nouvelles valeurs viennent s'ajouter à celle déjà saisie.

    voici le code que j'ai utilisé.

    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
    Private Sub ComboArticles_Change()
     
    Dim Lr As Long, i As Long
    Dim f As Worksheet
    Dim key As String
    Set f = Sheets("Articles")
     
    Me.ComboDesignation.ListIndex = -1
     
    Lr = f.Range("a" & Rows.Count).End(xlUp).Row
    key = Me.ComboArticles.Value
     
    For i = 2 To Lr
     
        If key = f.Range("l" & i).Value Then
     
            Me.ComboDesignation.AddItem f.Range("B" & i).Value
     
        End If
    Me.ComboDesignation.ListIndex = -1
     
    Next i
    Set f = Nothing
     
    End Sub
    Pj: le fichier exemple

    merci d'avance pour vos différentes contributions
    cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, il suffit de vider la combobox avant de la remplir à nouveau selon l'article avec .Clear

    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 ComboArticles_Change()
        Dim Lr As Long, i As Long
        Dim f As Worksheet
        Dim key As String
     
        Set f = Sheets("Articles")
     
        ' Vider la liste des items précédents
        Me.ComboDesignation.Clear
     
        Lr = f.Range("A" & f.Rows.Count).End(xlUp).Row
        key = Me.ComboArticles.Value
     
        For i = 2 To Lr
            If key = f.Range("L" & i).Value Then
                Me.ComboDesignation.AddItem f.Range("B" & i).Value
            End If
        Next i
     
        Me.ComboDesignation.ListIndex = -1
        Set f = Nothing
    End Sub

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 13
    Par défaut
    Merci Franc pour ta réponse!

    çà marche parfaitement.

    je voudrais profiter aussi pour soumettre un autre souci.

    Dans mon userform, j'alimente ma listview avec les infos provenant de détails facture.

    je voudrais que lorsque celle ci est alimenter (listview) pouvoir avec le bouton enregistrer exporter les données contenues dans le listview vers la feuille e calcul (Achat).

    j'ai essayer avec ce code mais il passe. aucune info n'est copié.
    je sais que ce n'est pas l'objet du topic. mais si tu pouvais y jeter un coup d'œil

    merci

    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
    Private Sub BtnEnregistrer_Click()
     
    Dim Ws As Worksheet
    Dim L As Long, Cl As Long, i As Long, j As Long, Lr As Long
    Dim Tbl() As Variant
     
    Set Ws = Worksheets("Achat")
    Ws.Select
    With Me.ListVAppro
     
        'mise en memoire de la listview
        L = .ListItems.Count
        Cl = .ColumnHeaders.Count
     
        ReDim Tbl(1 To L + 1, 1 To Cl)
     
        For i = 1 To L
            Tbl(i, 1) = .ListItems(i).Text
            For j = 1 To Cl - 1
                Tbl(i, j + 1) = .ListItems(i).ListSubItems(j).Text
            Next j
        Next i
     
    If .ListItems.Count < 1 Then
     
        MsgBox " Ajouter des produits a la facture!", vbCritical + vbOKOnly, ""
     
        Exit Sub
    Else
        If MsgBox("Voulez - vous enregistrer cette facture?", vbYesNo, "Demande de confirmation") = vbYes Then
     
            With Ws
            Lr = .Cells(Rows.Count, 1).End(xlUp).Row 'derniere ligne ocuppe sur la ligne A
     
            For i = 1 To L ' boucle sur les lignes du tableau
     
                .Range("c" & Lr + i) = Tbl(i, 1) ' Articles
                .Range("D" & Lr + i) = Tbl(i, 2) ' Qte
                .Range("e" & Lr + i) = Tbl(i, 3) ' PU
                .Range("f" & Lr + i) = Tbl(i, 4) ' Remise
                .Range("g" & Lr + i) = Tbl(i, 5) ' Montant
                .Range("b" & Lr + i) = CDate(Me.TextDate) ' Date
                .Range("h" & Lr + i) = Me.ComboFrs ' fournisseurs
                .Range("i" & Lr + i) = Tbl(i, 1) ' code facture
     
            Next i
     
          End With
     
        End If
    End If
    End With
     
    Unload Me
    FrmAppro.show
     
    ' reinitialiser listview
    'Me.ListVAppro.ListItems.Clear
     
    End Sub
    .

  4. #4
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 516
    Par défaut
    Bonsoir,
    De cette manière peut-être
    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
    Private Sub BtnEnregistrer_Click()
     
        Dim Ws As Worksheet
        Set Ws = ThisWorkbook.Worksheets("Achat")    ' // Travailler plutôt avec le nom de code de la feuille !
        Ws.Select
     
        With Me.ListVAppro
            ' Vérifier si la ListView est vide
            If .ListItems.Count > 0 Then
                ' Mise en mémoire du tableau de la ListView
                Dim L As Long
                L = .ListItems.Count
     
                Dim Cl As Long
                Cl = .ColumnHeaders.Count
     
                Dim newRow As Long
                newRow = Ws.Cells(Ws.Rows.Count, "A").End(xlUp).Row + 1
     
                ReDim Tbl(1 To L, 1 To Cl)
                Dim i As Long
                For i = 1 To L
                    Tbl(i, 1) = .ListItems(i).Text
                    Dim j As Long
                    For j = 1 To Cl - 1
                        Tbl(i, j + 1) = .ListItems(i).ListSubItems(j).Text
                    Next j
     
                    ' Effectuer les actions supplémentaires directement ici
                    If IsDate(Me.TextDate) Then: Ws.Range("B" & newRow + i - 1).Value = CDate(Me.TextDate)  ' Date
                    Ws.Range("H" & newRow + i - 1).Value = Me.ComboFrs ' Fournisseur
                    Ws.Range("I" & newRow + i - 1).Value = Tbl(i, 1) ' Code facture
                Next i
     
                ' Copier le tableau en une seule opération
                Ws.Range("C" & newRow).Resize(UBound(Tbl, 1), UBound(Tbl, 2)).Value = Tbl
            Else
                MsgBox "Ajouter des produits à la facture!", vbCritical + vbOKOnly, "Erreur"
            End If
     
        End With
     
        'ToDo "On doit trouver mieux pour faire cela."
        Unload Me
        FrmAppro.Show
     
    End Sub
    Mais sans fichier impossible de tester...

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, ta macro fonctionne, mais pour je ne sais quelle raison, la copie des données commence à la ligne 712, donc tu ne vois rien. J'ai testé en supprimant les lignes de 2 à 711 et la macro copie bien les données en-dessous des lignes existantes. Ceci dit, il me semble que les valeurs ne se copient pas dans les bonnes colonnes. Je te conseillerais d'utiliser un tableau structuré plutôt qu'une plage de cellules, pas besoin de chercher la dernière ligne, référence aux colonnes via leur nom, etc...

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 13
    Par défaut
    Citation Envoyé par Franc Voir le message
    Salut, ta macro fonctionne, mais pour je ne sais quelle raison, la copie des données commence à la ligne 712, donc tu ne vois rien. J'ai testé en supprimant les lignes de 2 à 711 et la macro copie bien les données en-dessous des lignes existantes. Ceci dit, il me semble que les valeurs ne se copient pas dans les bonnes colonnes. Je te conseillerais d'utiliser un tableau structuré plutôt qu'une plage de cellules, pas besoin de chercher la dernière ligne, référence aux colonnes via leur nom, etc...
    Bonjour Franc

    Excuse moi pour le temps de réponse. un peu déconnecté depuis.

    merci

    effectivement la copie des données commencent a partir de la ligne 712. je sais pas moi même pourquoi c'est ainsi.

    j'ai également revue l'ordre de copie des données.

    encore une fois merci

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

Discussions similaires

  1. UserForm extraction et Filtre ComboBox
    Par lchauvet1 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 15/06/2011, 15h22
  2. [XL-2007] Problème sur filtre combobox et userform
    Par Esak59 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 28/01/2011, 16h18
  3. [VB.NET] Filtre combobox - Datasource
    Par chepac dans le forum VB.NET
    Réponses: 15
    Dernier message: 16/06/2009, 14h28
  4. Construire un critère de filtre en utilisant des ComboBox
    Par mary17 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/04/2007, 09h19
  5. [VBA-A] Filtre ComboBox
    Par Mad X dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/05/2006, 13h23

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