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 :

SpecialCells(xlCellTypeVisible) et Listbox [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut SpecialCells(xlCellTypeVisible) et Listbox
    Bonjour,

    Dans un UserForm, j'ai une Listbox que j'aimerais alimenter à partir d'une plage de cellules filtrées. Je procède ainsi : je filtre ma plage de cellule, puis j'alimente ma Listbox, grâce à la propriété List et à la propriété SpecialCells(xlCellTypeVisible) pour la plage de cellule.
    Seulement, ma ListBox ne prend pas en compte toutes les cellules visibles. Elle prend en compte seulement les premières cellules (jusqu'à la première cellule non visible exclue). Par exemple avec les valeurs suivantes:
    FAUX
    FAUX
    VRAI
    FAUX
    Si je filtre sur FAUX, la ListBox ne m'affichera que les 2 premières lignes.
    Voici mon code :
    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
    Private Sub okButton_Click()
    '**** GET THE OPEN WORK ASSOCIATED TO CATEGORY FROM COMBOBOX ****
        Dim filterNum As Integer
        Dim row_n As Long
        'conditions pour obtenir filterNum --> pas intéressant pour la question
     
        With Sheets("Selection table")
            row_n = .Cells(Rows.Count, 1).End(xlUp).Row
            If filterNum <> 0 Then
                .Range("$A$1:$J$" & row_n).AutoFilter Field:=filterNum, Criteria1:=Sheets("Database").Range("CH1").Text    'filtre sur un tableau (ça marche comme il faut)
            End If
            Me.declaListBox.List = .Range("A2:F" & row_n).SpecialCells(xlCellTypeVisible).Value    'je veux récupérer dans la Listbox seulement les cellules visibles après le filtre.
            If filterNum <> 0 Then .Range("$A$1:$J$" & row_n).AutoFilter Field:=filterNum      
        End With
    End Sub
    Pour faire des tests, j'ai fait un copié-collé de la plage de cellules visibles et j'ai bien toutes les lignes visibles qui sont collées. Donc, a priori, c'est bien au niveau de la ListBox qu'il y a un problème.

    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
    Private Sub okButton_Click()
    '**** GET THE OPEN WORK ASSOCIATED TO CATEGORY FROM COMBOBOX ****
        Dim filterNum As Integer
        Dim row_n As Long
        'conditions pour obtenir filterNum --> pas intéressant pour la question
        
        With Sheets("Selection table")
            row_n = .Cells(Rows.Count, 1).End(xlUp).Row
            If filterNum <> 0 Then
                .Range("$A$1:$J$" & row_n).AutoFilter Field:=filterNum, Criteria1:=Sheets("Database").Range("CH1").Text    'filtre sur un tableau (ça marche comme il faut)
            End If
            .Range("A2:F" & row_n).SpecialCells(xlCellTypeVisible).Copy destination:=.Range("A10")
            Me.declaListBox.List = .Range("A2:F" & row_n).SpecialCells(xlCellTypeVisible).Value    'je veux récupérer dans la Listbox seulement les cellules visibles après le filtre.
            If filterNum <> 0 Then .Range("$A$1:$J$" & row_n).AutoFilter Field:=filterNum      
        End With
    End Sub
    Voyez-vous le problème?
    Merci beaucoup pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ListBox1.RowSource = Range("Feuil1!$A$1:$C$17").SpecialCells(xlCellTypeVisible).Address

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour Robert
    La propriété Rowsource ne sait à ma connaissance gérer qu'une plage de cellules contigües.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour unpari,
    Je vérifie

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour Robert, Unparia,
    La propriété Rowsource ne sait à ma connaissance gérer qu'une plage de cellules contigües
    Je confirme
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    Zone filtrée dans ListBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub UserForm_Initialize()
      Sheets.Add
      Sheets("BD").Range("_FilterDataBase").Offset(1).SpecialCells(xlCellTypeVisible).Copy [A1]
      Me.ListBox1.List = [A1].CurrentRegion.Value
      Application.DisplayAlerts = False
      ActiveSheet.Delete
      For i = 1 To 3
        Me("label" & i) = Sheets("bd").Cells(1, i)
      Next i
    End Sub
    Sans feuille intermédiaire (Colonnes 1 et 2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub UserForm_Initialize()
      Dim Liste(): ReDim Liste(1 To [_FilterDataBase].Offset(1).Resize(, 1).SpecialCells(xlCellTypeVisible).Count, 1 To 2)
      For Each c In [_FilterDataBase].Offset(1).Resize(, 1).SpecialCells(xlCellTypeVisible)
        i = i + 1:    Liste(i, 1) = c: Liste(i, 2) = c.Offset(, 1)
      Next c
      Me.ComboBox1.List = Liste
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  7. #7
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Merci, c'est parfait !
    J'ai utilisé la première méthode que je comprends mieux.
    Y a-t-il des avantages et des inconvénients à utiliser une méthode plutôt que l'autre?
    Si j'ai bien compris, la propriété List ne peut prendre qu'une plage de cellules contigues et c'est pourquoi j'avais mon problème?

    Merci à tous pour votre participation!

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Si j'ai bien compris, la propriété List ne peut prendre qu'une plage de cellules contigues et c'est pourquoi j'avais mon problème?
    De manière plus générale :
    on ne peut affecter directement les plages de cellules non contigües ni à une propriété Rowsource, ni à une matrice (pour les mêmes raisons, d'ailleurs).

    Or, tu précisais que tu avais des lignes non visibles intercalées.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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

Discussions similaires

  1. [XL-2007] Problème SpecialCells(xlCellTypeVisible) sur Filtre Automatique
    Par PyRo21 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/07/2015, 17h33
  2. [XL-2010] Problème avec SpecialCells(xlCellTypeVisible).Cells.Count
    Par moi244 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/02/2013, 20h58
  3. DrawItem d'un listbox...
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/06/2007, 15h50
  4. [Listbox] ScrollBar Horizontal
    Par haleem dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2005, 07h53
  5. Copier le texte d'un ListBox dans le clipboard.
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/08/2002, 08h20

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