OVH Cloud OVH Cloud

Récupération des valeurs de listes de filtrage

12 réponses
Avatar
Herdet
Bonsoir à tous,
Je sais, un dimanche en plein pont du 11 novembre (en France), j'ai peu de
chance d'avoir une réponse, mais bon... essayons.
Exposé du propblème :
Après l'utilisation de filtre automatique, je cherche à récupérer en VBA
dans des Combobox les items qui sont visibles en cliquant dans les petites
flêches bleue de chaque colonne d'un tableau de données.

Pour mon exemple, j'ai 3 combo nommées CBX1, CBX2,CBX3 (en réalité j'en ai
11) disposées sur une feuille.
La feuille de données est nommée Sht_base et est masquée en utilisation (si
possible très masquée par Visible=xlSheetVeryHidden)

Si je fais une sélection dans la combo CBX1
Private Sub CBX1_Change()
Sht_base.Range("A3").AutoFilter field:=3,
Criteria1:=Sht_Rech.CBX1.Value, VisibleDropDown:=True
'-------- récupération dans CBX1 et CBX2 des valeurs des nouvelles
listes
' de la filtration automatique qui sont en principe plus réduites
' et c'est là que j'ai besoin de vos lumières (SOS)!

End Sub

Merci et à bientôt.
Robert Dezan

2 réponses

1 2
Avatar
Denis Michon
Une dernière version... pour tenir compte qu'il y a peut être des cellules vides dans ta plage de données... dans ce cas
, les procédures soumises sont inadéquates..

Voici la correction qui en tient compte ....


.--------------------------
Sub Initialer_Contenu_Des_Combobox()

Dim Rg As Range, DerLig As Long, Rg1 As Range
Dim Tblo As Variant, NomCombobox As String
Dim Sh As Worksheet, Shp As Shape, Arr(), A As Integer

'********Variable à définir**********

NomCombobox = "Combobox" 'Sans l'index
Set Sh = Worksheets("Feuil1")
Arr = Array(1, 3, 5) 'à déterminer

'Ne pas oublier aussi la plage de cellule
'exemple --> .Range("A:K")...

'************************************

With Sh
'Cellule de destintation où se fera
'un filtre élaboré sans doublons.
Set Rg1 = .Range("IV25000")
'détermine la dernière lignes de données
DerLig = .Range("A:K").Find("*", SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Set Rg = .Range("A1:K" & DerLig)
End With
'On Error Resume Next

For Each Shp In Sh.Shapes
'Cette ligne de code génère une erreur si le
'contrôle n'est pas un objet provenant de la barre
'outils contrôle --> raison du On error ...
If TypeName(Shp.OLEFormat.Object.Object) = "ComboBox" Then
If Err = 0 Then
A = A + 1
With Sh
.Range(Rg1, .Range(Rg1.Address).End(xlDown)).Clear
With Rg.Columns(Application.Index(Arr, A))
.AdvancedFilter xlFilterCopy, , Rg1, True
End With

With Rg1.Offset(1).Resize(Rg(1).Row + DerLig)
.Sort Key1:=Rg1.Offset(1), order1:=xlAscending
Tblo = .Value
End With
.Shapes(NomCombobox & A).OLEFormat.Object.Object.List = Tblo
End With
Else
Err = 0
End If
End If
Next

Set Rg = Nothing: Set Rg1 = Nothing
Set Sh = Nothing: Set Shp = Nothing

End Sub
.--------------------------


Salutations!




"Denis Michon" a écrit dans le message de news:R%Lrb.26799$
Bonjour Robert,

La même procédure avec un ajout d'une variable de type "array" que tu dois définir avec une liste des numéros de colonne
"RELATIF" à la plage que tu as défini.

J'ai ajouté aussi une ligne de code, qui met en ordre croissant le contenu des combobox.

Variables à définir :
1 ) Nom de la feuille
2 ) Nom des combobox (sans l'index)
3 ) liste des colonnes dans "Array"
4 ) Plage globale de ton tableau de cellules


'----------------------------------------
Sub Initialer_Contenu_Des_Combobox()

Dim Rg As Range, DerLig As Long, Rg1 As Range
Dim Tblo As Variant, NomCombobox As String
Dim Sh As Worksheet, Shp As Shape, Arr(), A As Integer

'********Variable à définir**********

NomCombobox = "Combobox" 'Sans l'index
Set Sh = Worksheets("Feuil1")
Arr = Array(1, 3, 5) 'à déterminer

'Ne pas oublier aussi la plage de cellule
'exemple --> .Range("A:K")...

'************************************

With Sh
'Cellule de destintation où se fera
'un filtre élaboré sans doublons.
Set Rg1 = .Range("IV25000")
'détermine la dernière lignes de données
DerLig = .Range("A:K").Find("*", SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Set Rg = .Range("A1:K" & DerLig)
End With
'On Error Resume Next

For Each Shp In Sh.Shapes
'Cette ligne de code génère une erreur si le
'contrôle n'est pas un objet provenant de la barre
'outils contrôle --> raison du On error ...
If TypeName(Shp.OLEFormat.Object.Object) = "ComboBox" Then
If Err = 0 Then
A = A + 1
With Sh
.Range(Rg1, .Range(Rg1.Address).End(xlDown)).Clear
With Rg.Columns(Application.Index(Arr, A)). _
SpecialCells(xlCellTypeConstants)
.AdvancedFilter xlFilterCopy, , Rg1, True
End With
With .Range(Rg1.Offset(1), .Range(Rg1.Address).End(xlDown))
.Sort Key1:=Rg1.Offset(1), order1:=xlAscending
Tblo = .Value
End With
.Shapes(NomCombobox & A).OLEFormat.Object.Object.List = Tblo
End With
Else
Err = 0
End If
End If
Next

Set Rg = Nothing: Set Rg1 = Nothing
Set Sh = Nothing: Set Shp = Nothing

End Sub
'----------------------------------------


Salutations!



"Herdet" a écrit dans le message de news:
Bonjour (ou bonsoir) Denis,
Si je reprend ta réponse :
<<J'ai pris pour acquis que tu n'avais pas plus de 11 combobox dans la
feuille ,
chacun attaché aux 11 colonnes de ta plage de cellules.(et ce pour les fins
de la boucle dans la procécure ... for each ... in ...)
Évidemment, les 11 colonnes doivent être adjacentes...>>

Manque de chance, les 11 combo utilisent 11 champs non adjacents parmi les
40 de la base.
Je vais étudier de près ta solution et voir si je peux l'adapter.
Merci en tout cas d'avoir passé un peu de ton temps sur ce problème.
Salutations
Robert

"Denis Michon" a écrit dans le message de news:
cyGrb.26507$
Bonsoir Robert,

Voici une procédure que tu peux lancer à l'ouverture du fichier, elle va
initialer tous les combobox de ta feuille d'un

seul coup.

la plage de cellules IV25000 et plus est réservée à un filtre élaboré sans
doublon pour récupérer les listes.


J'ai pris pour acquis que tu n'avais pas plus de 11 combobox dans la
feuille , chacun attaché aux 11 colonnes de ta

plage de cellules.(et ce pour les fins de la boucle dans la procécure ...
for each ... in ...)


Évidemment, les 11 colonnes doivent être adjacentes...

Tu n'as qu'à définir quelques variables selon la donne de ton projet.


'-----------------------------------------
Sub Initialer_Contenu_Des_Combobox()

Dim Rg As Range, DerLig As Long, Rg1 As Range
Dim Tblo As Variant, NomCombobox As String
Dim Sh As Worksheet, Shp As Shape

'********Variable à définir**********

NomCombobox = "Combobox" 'Sans l'index
Set Sh = Worksheets("Feuil1")

'Ne pas oublier aussi la plage de cellule
'exemple --> .Range("A:K")...

'************************************

With Sh
'Cellule de destintation où se fera
'un filtre élaboré sans doublons.
Set Rg1 = .Range("IV25000")
'détermine la dernière lignes de données
DerLig = .Range("A:K").Find("*", SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Set Rg = .Range("A1:K" & DerLig)
End With
On Error Resume Next

For Each Shp In Sh.Shapes
'Cette ligne de code génère une erreur si le
'contrôle n'est pas un objet provenant de la barre
'outils contrôle --> raison du On error ...
If TypeName(Shp.OLEFormat.Object.Object) = "ComboBox" Then
If Err = 0 Then
A = A + 1
With Sh
.Range(Rg1, .Range(Rg1.Address).End(xlDown)).Clear
With Rg.Columns(A).SpecialCells(xlCellTypeConstants)
.AdvancedFilter xlFilterCopy, , Rg1, True
End With
Tblo = .Range(Rg1.Offset(1),
.Range(Rg1.Address).End(xlDown))

.Shapes(NomCombobox & A).OLEFormat.Object.Object.List Tblo
End With
Else
Err = 0
End If
End If
Next

Set Rg = Nothing: Set Rg1 = Nothing
Set Sh = Nothing: Set Shp = Nothing

End Sub
'-----------------------------------------


Salutations!






"Herdet" a écrit dans le message de
news:

Bonsoir Denis,
Bon, faisons au plus simple et j'adapterai la solution (si elle existe)
J'ai un tableau de données A1:A101 avec en A1 le nom de champ "Prix" puis
100 lignes de valeurs quelconques.
Je créé un Filtre automatique sur "Prix"
Je clique sur la petite flêche bleue qui déroule un certain nb de valeurs
sans doublon.
Comment récupérer ces valeurs sans doublon dans un tableau VBA nommé
TAprix

?

Je pense que cela devrait être plus compréhensible.
A bientôt
Robert


"michdenis" a écrit dans le message de news:
#
Bonsoir Robert,


Je n'ai pas tout compris ...

tu as 11 colonnes et chacune d'elles est contenu dans un combobox.

Si tu choisis une valeur dans le combobox1 représentant les valeurs de
ta


première colonne de ta table des données, tu
voudrais que suite à un filtre automatique que le même combobox affiche
le


résultat du filtre automatique. Est-ce que
j'ai bien compris ? Chaque colonne est indépendante des unes des autres
lors de l'application des filtres ?




Salutations!



"Herdet" a écrit dans le message de
news:

Bonsoir à tous,
Je sais, un dimanche en plein pont du 11 novembre (en France), j'ai peu
de


chance d'avoir une réponse, mais bon... essayons.
Exposé du propblème :
Après l'utilisation de filtre automatique, je cherche à récupérer en VBA
dans des Combobox les items qui sont visibles en cliquant dans les
petites


flêches bleue de chaque colonne d'un tableau de données.

Pour mon exemple, j'ai 3 combo nommées CBX1, CBX2,CBX3 (en réalité j'en
ai


11) disposées sur une feuille.
La feuille de données est nommée Sht_base et est masquée en utilisation
(si

possible très masquée par Visible=xlSheetVeryHidden)

Si je fais une sélection dans la combo CBX1
Private Sub CBX1_Change()
Sht_base.Range("A3").AutoFilter field:=3,
Criteria1:=Sht_Rech.CBX1.Value, VisibleDropDown:=True
'-------- récupération dans CBX1 et CBX2 des valeurs des nouvelles
listes
' de la filtration automatique qui sont en principe plus
réduites


' et c'est là que j'ai besoin de vos lumières (SOS)!

End Sub

Merci et à bientôt.
Robert Dezan











Avatar
gee-dee-
Bonsoir Bebert.....
Je prends lecture de cette ficelle et n'ai pu donc te fournir ma solution,
mais je constate que Denis et AV ont encore été à la hauteur de leur
réputation....

histoire d'apporter quand même mon grain de sel :
lorsque j'avais fait ces mêmes expérimentations, dont migration Excel 95
vers Excel 2000
comme dit plus tot, il convenait d'ajouter une cellule correspondante à
toutes les données
eh bien avec EXCEL 95 il fallait ecrire "Tout" au lieu de "Tous"
et j'avais été bien embété à l'époque pour identifier la version Excel afin
d'écrire le bon "Tou?"
j'ajouterai qu'il en est de même pour les pages de TCD.

;-)))
@+
1 2