Récupérer données lignes visibles

Signaler
-
 scribetout -
Bonjour,

J'ai besoin de votre aide pour une correction de code. Sur une feuille "BASE", j’applique un filtre conditionnel et récupère les données sur 2 feuilles ("EST" & "OUEST"). Débutant, j'ai bien compris l'utilisation d'un dictionnaire, mais dans ce cas il est inadapté. Et je n'arrive pas à trouver le code pour récupérer les données des lignes filtrées.
Sub essai1()
Dim bd As Object
Dim dico As Object
Dim o As Object
Dim dics As Object
Dim dl As Integer
Dim pl As Range
Dim cel As Range
Dim i As Integer
Dim temp As Variant
Dim tco As Variant
Dim tcc As Variant

Application.DisplayAlerts = False
temp = Array("EST", "OUEST")
Set bd = Sheets("BASE")

dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row
Set pl = bd.Range("A2:A" & dl)
For i = 0 To UBound(temp)
    Set o = Sheets(temp(i))
    o.Cells.Clear
    
If o.Name = "EST" Then
    bd.Range("A1").AutoFilter field:=1, Criteria1:=temp(i)
    bd.Range("A1").AutoFilter field:=3, Criteria1:="HP1"
Else
    bd.Range("A1").AutoFilter field:=1, Criteria1:=temp(i)
    bd.Range("A1").AutoFilter field:=3, Criteria1:="OR1"
End If
    
    tco = Array(0, 1, 2, 3, 4) 'tableau des colonnes Origine
    tcc = Array(1, 2, 3, 4, 8) 'tableau des colonnes Cible
    For x = 0 To 4
        Set dics = CreateObject("Scripting.Dictionary")
        For Each cel In pl.Offset(0, tco(x)).SpecialCells(xlCellTypeVisible)
            dics(cel.Value) = ""
        Next cel
        o.Cells(2, tcc(x)).Resize(dics.Count) = Application.Transpose(dics.keys)
    Next x
    bd.Range("A1").AutoFilter
Next i

MsgBox "Fait ! "
End Sub


je vous remercie beaucoup.

Cordialement,
Scribetout

9 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,
si tu veux mon aide, il va peut-être falloir que tu te contentes d'aller directement et uniquement à la finalité (sans même parler de ce que tu as utilisé - ton filtre - auparavant).
Direct ? === >> cela veut dire :
1) - exposé des tenants (une plage avec des lignes masquées, si j'ai bien compris). Et on part de ces seuls tenants !
2) - exposé purement technique (on ne parle ici que d'objets excel - classeurs, feuilles, plages, colonnes, lignes et cellules) : clair, précis et complet des aboutissants d'entrée de jeu (sans que d'autres questions n'aient à t'être posées).
Ma boule de cristal me crie déjà qu'un dictionnaire "tremplin" n'a rien à voir dans cette affaire et ne ferait qu'ajouter des lenteurs indues.
Prends ton temps avant de rédiger ta réponse, car si elle est telle (non suffisamment claire, technique et précise) que je serais obligé de te poser des questions pour y voir clair ===>> je laisserais tomber tout net.
A toi de voir, donc.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Bonjour,
Merci d'avoir répondu. En effet, un dictionnaire n'a rien avoir ici.

Sur une feuille "BASE", contenant Plage allant de "A:E", j'effectue 2 auto filtrages avec 2 critères (colA" EST " et ColC"HP1" puis ColA= " OUEST " et colC ="OR1"); je voudrais transférer les données des plages filtrées sur les feuilles respectives "EST" et "OUEST", avec un décalage des 2 dernières colonnes de 3 (les données des Col "D:E" de la feuille "BASE" se mettront en col "G:H" sur les feuilles "EST" et "OUEST".

J'espère avoir été clair, dans éventualité du contraire je joins une image.

Mes remerciements anticipés.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Et alors === >>> simple
Exemple à main levée pour la feuille EST (après avoir filtré) :
dim toto as range
set toto  = worksheets("BASE").range("A2:E" & dl).specialCells(xlcelltypevisible)
toto.copy destination:= worksheets("EST").range("B1")

Puis insère le nombre de colonnes que tu veux à partir de la colonne C de la feuille EST (ça, tu sais faire par code, hein...)
J'ai mis B1 pour commencer à la ligne 1. Mets B2, si tu veux commencer à la ligne 2, Bx pour commencer à la ligne x
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Je te remercie pour ta proposition très simple. Si j'ai voulu passé par des tableaux c'est dans un but d'apprentissage.

Merci.

Cordialement,
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Si j'ai voulu passé par des tableaux c'est dans un but d'apprentissage.

Bien, mais même avec un tableau : quelle nécessité aurais-tu eu de passer par un tremplin dictionnaire ? ===>> je ne vois pas.
Je suis un grand amoureux de l'utilisation de tableaux dynamiques (je te l'ai montré dès mes réponses à ta toute première discussion), mais là ... même un tableau retarderait.
Il faut savoir toujours choisir son outil : un tournevis ne doit pas être utilisé pour faire un trou, mais pour visser. Un burin est préférable pour faire un trou, mais ne doit pas servir à visser.
Si ce sujet est résolu, libère-le s'il te plait (tag "réponse acceptée").

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Tu faisais par contre une erreur fondamentale en recréant un dictionnaire à chaque tour de ta boucler For. Et ce n'était pas la seule anomalie, loin (très loin) de là.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Si mes souvenirs sont bons, il faut toujours "pondre" un code pour se voir donner un coup de main. C'est ce que j'ai fait. Je suis amateur, c'est pour cela que mes choix ("de l'outillage")ne sont pas adaptés aux situations. j'ai appris qu'un dictionnaire récupère les données sans doublons et j'ai un peu appris à m'en servir. Et là, je veux passer à autre chose.

Maintenant, si tu veux bien m'aider, corrige-moi le code que j'ai joint, en utilisant les tableaux, je suis dans l'impasse. ça me permettra surtout de me rendre compte de mes erreurs.

Je te remercie.

Cordialement,
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Maintenant, si tu veux bien m'aider, corrige-moi le code que j'ai joint, en utilisant les tableaux, je suis dans l'impasse

Désolé, mais non, car je n'encourage jamais les démarches qui ralentiraient l'exécution. Et celle-ci en serait une car il se trouve que l'utilisation d'un tableau dynamique ne permet une accélération réelle que lorsque sont traitées des plages continues, ce qui n'est ici pas le cas. La conséquence serait )à contre-sens du but recherché, car il faudrait alors sans cesse redimensionner le tableau dynamique ! Quel progrès, alors ? quel intérêt ? Je ne le vois vraiment pas !
Si tu veux t'exercer à l'utilisation de tableaux dynamiques, d'accord, mais fais-le alors uniquement à des fins de "progrès" et non à n'importe quelle fin.
En parcourant les diverses discussions/VBA auxquelles j'ai participé, tu en trouveras plusieurs où j'utilise (à bon escient) un ou des tableau(x) dynamique(s). Analyse-les et tu apprendras, tout en découvrant quand et pourquoi j'ai fait ce choix. Tu en découvriras d'autres où, au contraire, j'ai procédé (toujours à bon escient) tout-à-fait autrement. Analyse-les également et tu découvriras pourquoi, pour ces dernières, j'ai procédé autrement.
L'apprentissage du développement est aussi cela : savoir choisir la meilleure voie en fonction des tenants et aboutissants et non vouloir appliquer à tout prix (ralentissements) là ce qui s'est avéré excellent ailleurs. A chaque problème, une solution adaptée à CE problème précis et pas une "répétition" obstinée de ce qui a été mis en oeuvre pour traiter un AUTRE problème.
Voilà. Mon intervention dans cette discussion s'arrête donc très naturellement là.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.