CopyFromRecordset et filtre automatique

Résolu
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016 - 19 janv. 2016 à 12:05
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016 - 1 févr. 2016 à 15:01
Bonjour,

Cela fait bien longtemps que je n'avais pas été bloquée sur VB! J'espère que vous pourrez m'aider, voici mon problème:
Je copie des données d'une base SQL SERVER dans un onglet Excel, avec la commande CopyFromRecordset. Mon programme lance régulièrement cette commande pour remettre à jour la liste. Or, j'ai ajouté la possibilité de trier cet onglet par un filtre automatique. Jusque là pas de pb, sauf que lorsque je relance mon CopyFromRecordset, je veux conserver les filtres choisis par les utilisateurs, et là j'ai des doublons dans les données retournées par mon CopyFromRecordset.
Un petit exemple pour aider la compréhension, le CopyFromRecordset renvoie dans l'onglet Excel:
DUPONT A 500
DUPUIS B 400
MARTIN A 300
DURAND A 500
DEROY C 100

Les utilisateurs trient par exemple la colonne 2 sur les valeurs "A". Donc je vois:
DUPONT A 500
MARTIN A 300
DURAND A 500

Ils font un traitement, et automatiquement mon programme relance le CopyFromRecordset (permettant de remettre à jour les valeurs de la colonne 3). Les données alors affichées sont incohérentes, je vois avoir quelque chose du style:
DUPONT A 500
DUPONT A 500
DURAND A 500.

Pensez-vous que je dois stocker les valeurs choisies dans le filtre automatique, enlever le filtre, faire mon CopyFromRecordset puis réactive rle filtre?
Ou par chance, y-aurait-il un petit critère à ajouter dans le CopyFromRecordset pour lui dire de copier sans tenir compte du filtre?

Merci de votre aide précieuse

4 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2016 à 18:01
Bonjour,
La méthode CopyFromRecordset ne possède aucun argument permettant d'ignorer le filtre appliqué.
Enlève donc ton filtre puis mets à jour, puis refiltre comme tu l'entends, puis refais ton recordset
Ceci étant dit, je ne comprends pas à quoi te sert d'appliquer un filtre, alors que (puisque recordset) une requête SQL donnerait également ton résultat ...
0
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016
19 janv. 2016 à 21:03
Merci de ton retour. Les utilisateurs ont besoin de voir l'ensemble de la liste, et de filtrer sur une ou plusieurs colonnes. J'aurais pu mettre des listes déroulantes de sélection dans des cellules, et filtrer ensuite le résultat via le SELECT, mais je perds en souplesse d'utilisation, car l'utilisateur va filtrer sur la colonne B, puis la colonne C, puis va changer son filtre pour travailler sur une autre valeur, etc. Et je peux difficilement traiter un cas: certains utilisateurs vont sélectionner plusieurs valeurs dans une colonne, donc difficile de les passer dans le SELECT sans faire un traitement lourd.
Je vais chercher comment mémoriser les valeurs sélectionnées par l'utilisateur dans les filtres, pour les réappliquer.
C'est tout de même étrange le comportement du CopyFromRecordset dans cette situation
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2016 à 22:17
Pas trop le temps de chercher, mais (exemple) :
Worksheets("Feuil1").AutoFilter.Filters(2)
est l'objet filtre d'indice 2 mis sur la feuille Feuil1
Cet objet a les propriétés suivantes :
Nom Description
Application Utilisée sans qualificateur d'objet, cette propriété renvoie un objet Application qui représente l'application Microsoft Excel. Lorsqu'elle est utilisée avec un qualificateur d'objet, elle renvoie un objet Application représentant l'application ayant créé l'objet spécifié (vous pouvez utiliser cette propriété avec un objet OLE Automation qui renvoie l'application d'origine de cet objet). En lecture seule.
Count Cette propriété renvoie le nombre d'objets de la collection. Type de données Long en lecture seule.
Criteria1 Cette propriété renvoie la première valeur filtrée de la colonne spécifiée d'une plage filtrée. Type de données Variant en lecture seule.
Criteria2 Cette propriété renvoie la deuxième valeur filtrée de la colonne spécifiée d'une plage filtrée. Type de données Variant en lecture seule.
On Cette propriété a la valeur True si le filtre spécifié est activé. Type de données Boolean en lecture seule.
Operator Cette propriété renvoie une valeur XlAutoFilterOperator qui représente l'opérateur qui associe les deux critères appliqués par le filtre spécifié.
Parent Cette propriété renvoie l'objet parent de l'objet spécifié. En lecture seule

Il devrait donc te suffire :
d'extraire les éléments qui sont utiles à ta requête SQL (Criteria1, Criteria2 et Operator) pour construire ta requête si On = True.
0
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016
1 févr. 2016 à 15:01
Merci de ton retour, j'ai finalement opté pour faire des filtres dans directement dans la requête SQL, en fonction de 2 cellules où l'utilisateur peut choisir la valeur dans des listes déroulantes. Seul défaut, c'est qu'on ne peut pas choisir 2 valeurs simultanément, mais cela me suffira pour le moment :-) On perd la souplesse des filtres automatiques, mais au moins ça fonctionne bien!

Merci beaucoup
0
Rejoignez-nous