Super débutant: ! VBA sélection plage de données variable

Bonjour à tous,

Je ne suis pas hyper à l'aise avec Excel et vraiment débutant en VBA mais je m'accroche!

Petite explication de la situation, dans le cadre professionnel je dois:

1) Extraire d'un fichier les lignes correspondant à une position pédale donnée (située entre un min et un max) par tranches de 10%. En manuel je le fais à l'aide de "Données/Filtrer".

2) Une fois ces lignes affichées, elles sont copiées puis collées dans une nouvelle feuille, la moyenne de ces lignes est alors calculée.

3) Enfin cette moyenne est collée (collage spécial) dans une dernière feuille qui récapitule les moyennes de toutes les positions pédale et les paramètres associés.

Problème: 50 fichiers à traiter contenant chacun 11 position pédale, j'ai commencé en manuel mais vous vous en doutez, avec la méthode manuelle j'y passe beaucoup de temps et je dois rendre ça pour mardi.

La partie la plus chronophage étant "Définir les valeurs hautes et basse du filtre -> Copier les valeurs filtrées dans la feuille moyenne "

J'ai donc enregistré une macro et j'ai décortiqué le code mais je me heurte au souci suivant:

Le résultat issu de l'étape 1 a un nombre de lignes variables (le nombre de colonnes reste toujours le même) car les appuis pédale n'ont pas tous la même durée et donc je suis obligé de spécifier la plage de sélection à chaque fois que je change de plage ou de fichier, c'est ballot.

J'ai fouillé sur le Web, j'ai appliqué une solution qui "marchotte" mais parfois me renvoie des résultats bizarres et puis surtout que je n'ai pas compris!

Pour plus de compréhension je vous joint un fichier qui, je l'espère, vous aidera à comprendre et m'aider à trouver une solution.

Je pense que le souci vient de cette ligne de code (que je ne sais pas interpréter), j'ai compris que c'est ici que se fait la sélection des variables après filtrage:

Range("A6", [W65536].End(xlUp).Address).SpecialCells(xlCellTypeVisible).Copy

Merci de m'avoir lu jusqu'au bout et bonne journée à vous.

Bonjour,
Un début de réponse dans le fichier joint.
Les données ont été mises sous forme de tableaux structurés.
Pour tester, modifie les intervalles.
Il n'y a pas de gestion d'erreur dans cet exemple.
Cdlt.

Public Sub CopyFilterData()
Dim loData As ListObject, loFilter As ListObject
Dim rCell As Range

    Set loData = Range("t_données").ListObject
    Set loFilter = Range("t_filtré").ListObject

    With loFilter
        .ShowTotals = False
        If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
        Set rCell = .InsertRowRange.Cells(1)
    End With

    With loData
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        .Range.AutoFilter _
                field:=2, _
                Criteria1:=">=40", _
                Operator:=xlAnd, _
                Criteria2:="<=41"
        .AutoFilter.Range.Offset(1).Copy Destination:=rCell
        .Range.AutoFilter field:=2
    End With

    loFilter.ShowTotals = True

End Sub

Bonjour Jean-Eric,

Merci pour votre aide.

De ce que je comprends, votre code concerne le "filtrage", corrigez moi si je me trompe. Or le filtrage dans ma macro fonctionne bien, c'est la sélection automatique des données filtrées qui me pose pb. En effet en fonction des résultats après filtrage le nombre de lignes varie et du coup je dois modifier le code et ce pour toutes les positions pédale.

Néanmoins j'ai essayé le code, modifié ce qui me semble être la plage de cellules de ma feuille ainsi que la plage de cellules après filtrage:

Set loData = Range("A4:W500").ListObject Set loFilter = Range("A4:W500").ListObject

mais il plante ici:.ShowTotals = False

Désolé mais je ne sais pas quoi faire...

Safir, VBA -1...

Re,
As tu testé différents intervalles avec la procédure dans mon fichier ?
Quels sont les résultats ? Corrects, incorrects ?
Tu dois mettre tes données sous forme de tableaux structurés. Elles sont alors dynamiques.

Sinon

.AutoFilter.Range.Offset(1).Copy Destination:=rCell

copie la plage filtrée (plage dynamique suivant le filtre demandé) dans la cellule destination rCell, première cellule de t_Filtré.

Bonjour Jean-Eric,

Merci de l'intérêt porté à mon pb.

J'ai créé un nouveau module sous mon "VBAProject" et j'y ai collé ton code après avoir modifié ce qui me semble être la plage de données:

Set loData = Range("A1:W255").ListObject
Set loFilter = Range("A1:W255").ListObject

Les critères Criteria1:=">=40" et Criteria2:="<=41" sont restés tels quels car ce sont des valeurs que je cherche.

capture

Malheureusement ça coince ici: .ShowTotals = False

Mon absence de connaissances me bloque...

Safir

Re

Nouvel essai, création d'une nouvelle feuille avec les données à filtrer, mise en forme sous forme de tableau structuré puis exécution de ton code. La feuille m'affiche une ligne vide:

apres filtre

Je vais tenter avec de nouvelles valeurs...

Safir

Bonjour,
Quand tu crées les tableaux dans les feuilles de calcul, tu dois les renommer (t_données et t_filtré).
Ensuite tu initialises tes variables :

Set loData = Range("t_données").ListObject
Set loFilter = Range("t_filtré").ListObject

Dans t_filtré, tu dois intégrer une ligne de total, nommée Moyenne avec le calcul de moyenne.
Vois mon exemple.
Cela peut expliquer l'erreur !...

Cdlt.

YESSS!!!

Ce que j'ai fait (il y a peut-être d'autres débutants que ça peut intéresser):

  • J'ai mis la feuille contenant mes données en "tableau" que j'ai nommé "t_données"
  • Création d'une nouvelle feuille sous forme de "tableau" également qui accueille les données filtrées nommé "t_filtré"
  • Exécution de la macro de Jean-Eric et ça fonctionne!!! La feuille "t_données" contient bien bien toutes les lignes dont la position pédale est comprise entre deux valeurs. Ici compris entre 10 et 11%

Tout ceci peut faire sourire, mais ce sont ce genre de détails qui peuvent manquer aux débutants.

Bravo à Jean-Eric qui vient de me faire gagner un nombre d'heures considérables!!

Je n'ai plus qu'à ajouter des boutons et leur attribuer une valeur de filtrage associée à une macro spécifique, si vous avez de meilleures idées, n'hésitez pas.

Mille merci et longue vie à ce forum.

Safir

Encore deux questions:

  • Impossible de créer une nouvelle macro avec le code, ce qui me bloque pour créer des boutons associés à des valeurs de filtrage. Pour dépanner je créé un module pour chaque valeur à rechercher.
  • Comment créer une ligne qui calcule la moyenne de toutes les colonnes filtrées. Chaque résultat après filtrage renvoie un nombre de lignes différent.

Malgré tout je progresse.

Safir

Re,
Joins ton classeur modifié .
Cdlt.

Voici mon classeur modifié, j'avais créé des boutons associés à chaque module (dans feuille Datas filtrées) mais ils ont disparu.

De plus je suis obligé de créer une nouvelle ligne de calcul de moyenne après chaque filtrage.

Safir

Re,
Une mise à jour.
A méditer.
Cdlt.

Wouahhhh! Je suis scotché!!

Encore merci Jean-Eric, c'est vraiment nickel!!

Je vais examiner le code et tenter de comprendre ce qu'il fait!!

Safir

Re-Bonjour,

Je dois faire évoluer la macro car il y a besoin d'un bouton supplémentaire pour une valeur de 15%.:

Pour se faire, j'ai dupliqué le bouton 10 que j'ai renommé 15.

Ensuite dans la Macro, j'ai ajouté une ligne: Case 15: v = ">15": v2 = "<=16"

Malheureusement ça ne fonctionne pas:

Erreur d'exécution'9':

L'indice n'appartient pas à la sélection.

J'ai (encore) besoin de votre aide car mes recherches n'ont rien donné.

Merci

Safir

Re-Bonjour,

J'ai trouvé!

Il fallait modifier le nom du bouton ici, liste déroulante des noms:

image

Côté Macro j'avais déjà ajouté cette ligne:

image

En espérant que cela puisse aider.

Safir

Rechercher des sujets similaires à "super debutant vba selection plage donnees variable"