Je d=E9sire :
1) Connaitre le nombre de valeurs diff=E9rentes dans une colonne de
_filterDataBase,
J'ai filtr=E9 en colonne "A" et veux lire les valeurs de la
coilonne "B"
2) R=E9cup=E9rer ces diff=E9rentes valeurs sans doublon
Et je s=E9che sur ces Pb, je suis sur de trouver ici solutions
Merci
Sub test() Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long Set Plage = Range("_filterdatabase").Offset(1) Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible) Set Plage = Intersect(Plage, [B:B]) Plage.Select Set Coll = New Collection On Error Resume Next
'add unique items to collection For Each c In Plage Coll.Add CStr(c), CStr(c) Next On Error GoTo 0 For Each Item In Coll Ctr = Ctr + 1 Cells(Ctr, 6) = Item Next Item MsgBox Ctr End Sub
Cordialement. Daniel "Le Nordiste" a écrit dans le message de news: Bonjour à tous,
Je désire : 1) Connaitre le nombre de valeurs différentes dans une colonne de _filterDataBase, J'ai filtré en colonne "A" et veux lire les valeurs de la coilonne "B" 2) Récupérer ces différentes valeurs sans doublon
Et je séche sur ces Pb, je suis sur de trouver ici solutions Merci
Bonjour.
Essaie :
Sub test()
Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long
Set Plage = Range("_filterdatabase").Offset(1)
Set Plage = Plage.Resize(Plage.Rows.Count -
1).SpecialCells(xlCellTypeVisible)
Set Plage = Intersect(Plage, [B:B])
Plage.Select
Set Coll = New Collection
On Error Resume Next
'add unique items to collection
For Each c In Plage
Coll.Add CStr(c), CStr(c)
Next
On Error GoTo 0
For Each Item In Coll
Ctr = Ctr + 1
Cells(Ctr, 6) = Item
Next Item
MsgBox Ctr
End Sub
Cordialement.
Daniel
"Le Nordiste" <jean-paul.bataille@neufcegetel.fr> a écrit dans le message de
news: c94c15b2-0582-486d-90c3-f40ae1b10724@r66g2000hsg.googlegroups.com...
Bonjour à tous,
Je désire :
1) Connaitre le nombre de valeurs différentes dans une colonne de
_filterDataBase,
J'ai filtré en colonne "A" et veux lire les valeurs de la
coilonne "B"
2) Récupérer ces différentes valeurs sans doublon
Et je séche sur ces Pb, je suis sur de trouver ici solutions
Merci
Sub test() Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long Set Plage = Range("_filterdatabase").Offset(1) Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible) Set Plage = Intersect(Plage, [B:B]) Plage.Select Set Coll = New Collection On Error Resume Next
'add unique items to collection For Each c In Plage Coll.Add CStr(c), CStr(c) Next On Error GoTo 0 For Each Item In Coll Ctr = Ctr + 1 Cells(Ctr, 6) = Item Next Item MsgBox Ctr End Sub
Cordialement. Daniel "Le Nordiste" a écrit dans le message de news: Bonjour à tous,
Je désire : 1) Connaitre le nombre de valeurs différentes dans une colonne de _filterDataBase, J'ai filtré en colonne "A" et veux lire les valeurs de la coilonne "B" 2) Récupérer ces différentes valeurs sans doublon
Et je séche sur ces Pb, je suis sur de trouver ici solutions Merci
Le Nordiste
daniel merci,
Je viens de tester vite fait cela m'ote une épine du pied. je vais adapter ton code à mon besoin mais l'idée de base te reviens, merci.
daniel merci,
Je viens de tester vite fait cela m'ote une épine du pied.
je vais adapter ton code à mon besoin mais l'idée de base te reviens,
merci.
Je viens de tester vite fait cela m'ote une épine du pied. je vais adapter ton code à mon besoin mais l'idée de base te reviens, merci.
Le Nordiste
Ok pour ton code Daniel,
mais je suis sous excel 2007 et vu le nombre de lignes à traiter (>75000) je cherche à éliminer le maximum de boucles. n'y a t'il pas une fonction -perso ou native- pour reprendre les valeurs filtrées sans doublon ?
Comment fait la fonction filtre pour constituer sa liste déroulante ?
Ok pour ton code Daniel,
mais je suis sous excel 2007 et vu le nombre de lignes à traiter
(>75000) je cherche à éliminer le maximum de boucles.
n'y a t'il pas une fonction -perso ou native- pour reprendre les
valeurs filtrées sans doublon ?
Comment fait la fonction filtre pour constituer sa liste déroulante ?
mais je suis sous excel 2007 et vu le nombre de lignes à traiter (>75000) je cherche à éliminer le maximum de boucles. n'y a t'il pas une fonction -perso ou native- pour reprendre les valeurs filtrées sans doublon ?
Comment fait la fonction filtre pour constituer sa liste déroulante ?
Alfred WALLACE
bonjour Daniel.C
j'ai regardé ton code et si tu permets je te pose les question dans les lignes :
On 14 mai, 11:26, "Daniel.C" wrote:
Bonjour. Essaie :
Sub test() Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long
Set Plage = Range("_filterdatabase").Offset(1) Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTy peVisible)
là j'ai remplacé ces lignes par :
Selection.CurrentRegion.Select Set Plage = Selection.CurrentRegion
Set Plage = Intersect(Plage, [B:B]) Plage.Select
Set Coll = New Collection On Error Resume Next
'add unique items to collection For Each c In Plage Coll.Add CStr(c), CStr(c) Next On Error GoTo 0
c'est surement que je ne connais pas la syntaxe, mais, pourquoi çà "add unique items" ??
For Each Item In Coll Ctr = Ctr + 1 Cells(Ctr, 6) = Item Next Item
MsgBox Ctr
est-ce que coll.count est valide ?
End Sub
je me dis que je peux utiliser cette methode pour faire un filtre élaboré avec une extraction unique dans une autre plage de cellule (ce que l'on fait en passant par le menu).
Dernière question, comment je peux "détruire" cette collection ? l'éffacer ? pour éventuellement changer de colonne ?
Merci encore pour vos commentaires et aide !
José
bonjour Daniel.C
j'ai regardé ton code et si tu permets je te pose les
question dans les lignes :
On 14 mai, 11:26, "Daniel.C" <dZZZcolarde...@free.fr> wrote:
Bonjour.
Essaie :
Sub test()
Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long
Set Plage = Range("_filterdatabase").Offset(1)
Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTy peVisible)
là j'ai remplacé ces lignes par :
Selection.CurrentRegion.Select
Set Plage = Selection.CurrentRegion
Set Plage = Intersect(Plage, [B:B])
Plage.Select
Set Coll = New Collection
On Error Resume Next
'add unique items to collection
For Each c In Plage
Coll.Add CStr(c), CStr(c)
Next
On Error GoTo 0
c'est surement que je ne connais pas la syntaxe, mais, pourquoi çà
"add unique items" ??
For Each Item In Coll
Ctr = Ctr + 1
Cells(Ctr, 6) = Item
Next Item
MsgBox Ctr
est-ce que coll.count est valide ?
End Sub
je me dis que je peux utiliser cette methode pour faire un filtre
élaboré avec
une extraction unique dans une autre plage de cellule (ce que l'on
fait
en passant par le menu).
Dernière question, comment je peux "détruire" cette collection ?
l'éffacer ? pour
éventuellement changer de colonne ?
j'ai regardé ton code et si tu permets je te pose les question dans les lignes :
On 14 mai, 11:26, "Daniel.C" wrote:
Bonjour. Essaie :
Sub test() Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long
Set Plage = Range("_filterdatabase").Offset(1) Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTy peVisible)
là j'ai remplacé ces lignes par :
Selection.CurrentRegion.Select Set Plage = Selection.CurrentRegion
Set Plage = Intersect(Plage, [B:B]) Plage.Select
Set Coll = New Collection On Error Resume Next
'add unique items to collection For Each c In Plage Coll.Add CStr(c), CStr(c) Next On Error GoTo 0
c'est surement que je ne connais pas la syntaxe, mais, pourquoi çà "add unique items" ??
For Each Item In Coll Ctr = Ctr + 1 Cells(Ctr, 6) = Item Next Item
MsgBox Ctr
est-ce que coll.count est valide ?
End Sub
je me dis que je peux utiliser cette methode pour faire un filtre élaboré avec une extraction unique dans une autre plage de cellule (ce que l'on fait en passant par le menu).
Dernière question, comment je peux "détruire" cette collection ? l'éffacer ? pour éventuellement changer de colonne ?
Merci encore pour vos commentaires et aide !
José
isabelle
bonjour Le Nordiste,
une solution serait de copier le résultat du filtre sur une feuille temporaire, et d'appliquer un filtre sans doublon sur cette nouvelle feuille.
isabelle
Ok pour ton code Daniel,
mais je suis sous excel 2007 et vu le nombre de lignes à traiter (>75000) je cherche à éliminer le maximum de boucles. n'y a t'il pas une fonction -perso ou native- pour reprendre les valeurs filtrées sans doublon ?
Comment fait la fonction filtre pour constituer sa liste déroulante ?
bonjour Le Nordiste,
une solution serait de copier le résultat du filtre sur une feuille temporaire,
et d'appliquer un filtre sans doublon sur cette nouvelle feuille.
isabelle
Ok pour ton code Daniel,
mais je suis sous excel 2007 et vu le nombre de lignes à traiter
(>75000) je cherche à éliminer le maximum de boucles.
n'y a t'il pas une fonction -perso ou native- pour reprendre les
valeurs filtrées sans doublon ?
Comment fait la fonction filtre pour constituer sa liste déroulante ?
une solution serait de copier le résultat du filtre sur une feuille temporaire, et d'appliquer un filtre sans doublon sur cette nouvelle feuille.
isabelle
Ok pour ton code Daniel,
mais je suis sous excel 2007 et vu le nombre de lignes à traiter (>75000) je cherche à éliminer le maximum de boucles. n'y a t'il pas une fonction -perso ou native- pour reprendre les valeurs filtrées sans doublon ?
Comment fait la fonction filtre pour constituer sa liste déroulante ?
Alfred WALLACE
Dernière question, comment je peux "détruire" cette collection ? l'éffacer ? pour éventuellement changer de colonne ?
Merci encore pour vos commentaires et aide !
José
En cherchant j'ai trouver çà pour vider la collection :
For x = 1 To Coll.Count Coll.Remove (x) Next
y'a rien de plus synthetique ? genre coll.kill ou un truc dans le genre ? parceke j'aimerai etre sûr que la mémoire est liberée.
Merci José
Dernière question, comment je peux "détruire" cette collection ?
l'éffacer ? pour
éventuellement changer de colonne ?
Merci encore pour vos commentaires et aide !
José
En cherchant j'ai trouver çà pour vider la collection :
For x = 1 To Coll.Count
Coll.Remove (x)
Next
y'a rien de plus synthetique ? genre coll.kill ou un truc dans le
genre ?
parceke j'aimerai etre sûr que la mémoire est liberée.
Dernière question, comment je peux "détruire" cette collection ? l'éffacer ? pour éventuellement changer de colonne ?
Merci encore pour vos commentaires et aide !
José
En cherchant j'ai trouver çà pour vider la collection :
For x = 1 To Coll.Count Coll.Remove (x) Next
y'a rien de plus synthetique ? genre coll.kill ou un truc dans le genre ? parceke j'aimerai etre sûr que la mémoire est liberée.
Merci José
MichDenis
| Set Plage = Range("_filterdatabase").Offset(1)
Il n'est pas souhaitable d'utiliser cette façon de définir une plage en utilisant "_FilterDataBase en début de procédure Car :
_FilterDataBase est un simple nom (name) de la collection "Names" qui est créé automatiquement APRÈS (pendant) l'exécution d'un filtre. Ce qui le distingue des "NOMS" que l'on crée via l'interface de la feuille de calcul, c'est qu'il a été créé par code, et qu'il est invisible par l'interface de la feuille de calcul. Voir l'aide dans vba...sur la méthode "ADD" à la collection "Names"
A - Le nom "_FilterDataBase" représente la plage de données sur laquelle s'est effectué le filtre. AVANT la toute première exécution d'un filtre (par macro ou à l'aide des commandes du menu) le nom de la plage est inexistant et provoque une erreur. À la limite, il pourrait aussi représenter une toute autre plage de la feuille où on a utilisé le filtre pour une toute autre raison. Une feuille de calcul ne peut contenir qu'UN "NOM" "_FilterDataBase" à la fois et ce que ce soit pour désigner la plage où s'est effectuée un filtre automatique ou élaboré.
B - Si des nouvelles données ont été ajoutées entre deux exécutions de la macro, définir en début de procédure la plage filtrée de cette manière signifie, ne pas tenir compte des ajouts des nouvelles données puisque le nom "_filterdatabase" est mis à jour suite à l'exécution du filtre et non avant. Avant que la commande du filtre s'exécute, le code doit permettre de définir l'étendue des données à tenir compte, de sorte que la commande "Filtre" pourra mettre à jour le nom "_FilterDataBase" (la plage qu'il représente)
Un petit exemple pour illustrer le tout :
L'une ou l'autre de ces syntaxes sont identiques...au niveau du résultat La méthode CurrentRegion est sous attendu à la ligne suivante du code Pour ceux qui connaissent mal le concept de CurrentRegion, il y a l'aide d'excel...
Range("A1").AutoFilter field:=1, Criteria1:=1 OU Range("A1").CurrentRegion.AutoFilter field:=1, Criteria1:=1
Pour limiter la plage de cellules à une plage spécifique, il faut y faire référence explicitement Range("A1:A10").AutoFilter field:=1, Criteria1:=1
Évidemment, la résultante est l'effet sur la plage que représente : "FilterDataBase".
"Daniel.C" a écrit dans le message de news:
Bonjour. Essaie :
Sub test() Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long Set Plage = Range("_filterdatabase").Offset(1) Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible) Set Plage = Intersect(Plage, [B:B]) Plage.Select Set Coll = New Collection On Error Resume Next
'add unique items to collection For Each c In Plage Coll.Add CStr(c), CStr(c) Next On Error GoTo 0 For Each Item In Coll Ctr = Ctr + 1 Cells(Ctr, 6) = Item Next Item MsgBox Ctr End Sub
Cordialement. Daniel "Le Nordiste" a écrit dans le message de news: Bonjour à tous,
Je désire : 1) Connaitre le nombre de valeurs différentes dans une colonne de _filterDataBase, J'ai filtré en colonne "A" et veux lire les valeurs de la coilonne "B" 2) Récupérer ces différentes valeurs sans doublon
Et je séche sur ces Pb, je suis sur de trouver ici solutions Merci
| Set Plage = Range("_filterdatabase").Offset(1)
Il n'est pas souhaitable d'utiliser cette façon de définir une plage en utilisant
"_FilterDataBase en début de procédure Car :
_FilterDataBase est un simple nom (name) de la collection "Names" qui est créé
automatiquement APRÈS (pendant) l'exécution d'un filtre. Ce qui le distingue des
"NOMS" que l'on crée via l'interface de la feuille de calcul, c'est qu'il a été créé
par code, et qu'il est invisible par l'interface de la feuille de calcul.
Voir l'aide dans vba...sur la méthode "ADD" à la collection "Names"
A -
Le nom "_FilterDataBase" représente la plage de données sur laquelle s'est effectué le filtre.
AVANT la toute première exécution d'un filtre (par macro ou à l'aide des commandes
du menu) le nom de la plage est inexistant et provoque une erreur.
À la limite, il pourrait aussi représenter une toute autre plage de la feuille où on a utilisé le
filtre
pour une toute autre raison. Une feuille de calcul ne peut contenir
qu'UN "NOM" "_FilterDataBase" à la fois et ce que ce soit pour désigner la plage
où s'est effectuée un filtre automatique ou élaboré.
B -
Si des nouvelles données ont été ajoutées entre deux exécutions de la macro,
définir en début de procédure la plage filtrée de cette manière signifie, ne pas
tenir compte des ajouts des nouvelles données puisque le nom "_filterdatabase"
est mis à jour suite à l'exécution du filtre et non avant. Avant que la commande du filtre
s'exécute, le code doit permettre de définir l'étendue des données à tenir compte, de sorte
que la commande "Filtre" pourra mettre à jour le nom "_FilterDataBase" (la plage qu'il représente)
Un petit exemple pour illustrer le tout :
L'une ou l'autre de ces syntaxes sont identiques...au niveau du résultat
La méthode CurrentRegion est sous attendu à la ligne suivante du code
Pour ceux qui connaissent mal le concept de CurrentRegion, il y a l'aide d'excel...
Range("A1").AutoFilter field:=1, Criteria1:=1
OU
Range("A1").CurrentRegion.AutoFilter field:=1, Criteria1:=1
Pour limiter la plage de cellules à une plage spécifique, il faut y faire référence explicitement
Range("A1:A10").AutoFilter field:=1, Criteria1:=1
Évidemment, la résultante est l'effet sur la plage que représente : "FilterDataBase".
"Daniel.C" <dZZZcolardelle@free.fr> a écrit dans le message de news:
OKzkfSatIHA.5580@TK2MSFTNGP04.phx.gbl...
Bonjour.
Essaie :
Sub test()
Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long
Set Plage = Range("_filterdatabase").Offset(1)
Set Plage = Plage.Resize(Plage.Rows.Count -
1).SpecialCells(xlCellTypeVisible)
Set Plage = Intersect(Plage, [B:B])
Plage.Select
Set Coll = New Collection
On Error Resume Next
'add unique items to collection
For Each c In Plage
Coll.Add CStr(c), CStr(c)
Next
On Error GoTo 0
For Each Item In Coll
Ctr = Ctr + 1
Cells(Ctr, 6) = Item
Next Item
MsgBox Ctr
End Sub
Cordialement.
Daniel
"Le Nordiste" <jean-paul.bataille@neufcegetel.fr> a écrit dans le message de
news: c94c15b2-0582-486d-90c3-f40ae1b10724@r66g2000hsg.googlegroups.com...
Bonjour à tous,
Je désire :
1) Connaitre le nombre de valeurs différentes dans une colonne de
_filterDataBase,
J'ai filtré en colonne "A" et veux lire les valeurs de la
coilonne "B"
2) Récupérer ces différentes valeurs sans doublon
Et je séche sur ces Pb, je suis sur de trouver ici solutions
Merci
Il n'est pas souhaitable d'utiliser cette façon de définir une plage en utilisant "_FilterDataBase en début de procédure Car :
_FilterDataBase est un simple nom (name) de la collection "Names" qui est créé automatiquement APRÈS (pendant) l'exécution d'un filtre. Ce qui le distingue des "NOMS" que l'on crée via l'interface de la feuille de calcul, c'est qu'il a été créé par code, et qu'il est invisible par l'interface de la feuille de calcul. Voir l'aide dans vba...sur la méthode "ADD" à la collection "Names"
A - Le nom "_FilterDataBase" représente la plage de données sur laquelle s'est effectué le filtre. AVANT la toute première exécution d'un filtre (par macro ou à l'aide des commandes du menu) le nom de la plage est inexistant et provoque une erreur. À la limite, il pourrait aussi représenter une toute autre plage de la feuille où on a utilisé le filtre pour une toute autre raison. Une feuille de calcul ne peut contenir qu'UN "NOM" "_FilterDataBase" à la fois et ce que ce soit pour désigner la plage où s'est effectuée un filtre automatique ou élaboré.
B - Si des nouvelles données ont été ajoutées entre deux exécutions de la macro, définir en début de procédure la plage filtrée de cette manière signifie, ne pas tenir compte des ajouts des nouvelles données puisque le nom "_filterdatabase" est mis à jour suite à l'exécution du filtre et non avant. Avant que la commande du filtre s'exécute, le code doit permettre de définir l'étendue des données à tenir compte, de sorte que la commande "Filtre" pourra mettre à jour le nom "_FilterDataBase" (la plage qu'il représente)
Un petit exemple pour illustrer le tout :
L'une ou l'autre de ces syntaxes sont identiques...au niveau du résultat La méthode CurrentRegion est sous attendu à la ligne suivante du code Pour ceux qui connaissent mal le concept de CurrentRegion, il y a l'aide d'excel...
Range("A1").AutoFilter field:=1, Criteria1:=1 OU Range("A1").CurrentRegion.AutoFilter field:=1, Criteria1:=1
Pour limiter la plage de cellules à une plage spécifique, il faut y faire référence explicitement Range("A1:A10").AutoFilter field:=1, Criteria1:=1
Évidemment, la résultante est l'effet sur la plage que représente : "FilterDataBase".
"Daniel.C" a écrit dans le message de news:
Bonjour. Essaie :
Sub test() Dim Plage As Range, Coll As Collection, c As Range, Ctr As Long Set Plage = Range("_filterdatabase").Offset(1) Set Plage = Plage.Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible) Set Plage = Intersect(Plage, [B:B]) Plage.Select Set Coll = New Collection On Error Resume Next
'add unique items to collection For Each c In Plage Coll.Add CStr(c), CStr(c) Next On Error GoTo 0 For Each Item In Coll Ctr = Ctr + 1 Cells(Ctr, 6) = Item Next Item MsgBox Ctr End Sub
Cordialement. Daniel "Le Nordiste" a écrit dans le message de news: Bonjour à tous,
Je désire : 1) Connaitre le nombre de valeurs différentes dans une colonne de _filterDataBase, J'ai filtré en colonne "A" et veux lire les valeurs de la coilonne "B" 2) Récupérer ces différentes valeurs sans doublon
Et je séche sur ces Pb, je suis sur de trouver ici solutions Merci
MichDenis
| En cherchant j'ai trouver çà pour vider la collection :
| For x = 1 To Coll.Count | Coll.Remove (x) | Next
Set Coll = Nothing
| En cherchant j'ai trouver çà pour vider la collection :
| For x = 1 To Coll.Count
| Coll.Remove (x)
| Next