Microsoft 365 Filtrer dans une variable-tableau : possible ?

  • Initiateur de la discussion Initiateur de la discussion BenHarber
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
Une petite question de principe (…et je m’en excuse par avance si elle est complètement saugrenue 😌) :

Est-ce qu’il est « VBAment » possible, à partir d’une VARIABLE-TABLEAU (comportant x lignes et y colonnes), de « filtrer » certaines données pour les coller sur une feuille Excel ? (je sais faire la manip à partir d’un tableau Excel mais je me demandais si on pourrait le faire à partir d’une variable-tableau).

Merci d’avance pour vos idées…et votre indulgence !
 
Ben je vois que ça phosphore !!!
Je reprends le code de @job75 et souhaiterais avoir un éclaircissement sur la ligne surlignée ci-dessous. Lorsque j'ai zéro enregistrement correspondant à mon filtre, la copie ne peut pas se faire et la macro bugge en indiquant une erreur d'exécution '1004' : qq'1 pourrait-il SVP m'indiquer la syntaxe qui équivaut à "S'il y a zéro enregistrement correspondant" ? Merci d'avance !

1742479897584.png
 
Lorsque j'ai zéro enregistrement correspondant à mon filtre, la copie ne peut pas se faire et la macro bugge en indiquant une erreur d'exécution '1004'
Que racontez-vous ?

Je ne vois pas comment il peut y avoir un bug car quand il n'y a pas d'enregistrement filtré cette ligne :
VB:
If Application.CountIf(.ListObjects(1).DataBodyRange.Columns(8), Replace(Sh.Name, "é", "e")) = 0 Then GoTo 1
conduit à l'étiquette 1 qui met un terme à la macro (Application.CountIf c'est NB.SI).

Testez en effaçant les cellules H30 H37 et H40 de la feuille source et activez la feuille "Expéditions"...
 
J'ai une question @BenHarber : pourquoi voulez-vous copier le DataBodyRange, c'est quand même bien plus simple avec le Range :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
With Sheets("Pannes")
    If Sh.Name = .Name Then Exit Sub
    With .ListObjects(1).Range
        .AutoFilter 8, Replace(Sh.Name, "é", "e") 'il ne faut pas d'accents
        Application.ScreenUpdating = False
        If Not Sh.ListObjects(1).DataBodyRange Is Nothing Then Sh.ListObjects(1).DataBodyRange.Delete xlUp 'RAZ
        .SpecialCells(xlCellTypeVisible).Copy Sh.ListObjects(1).Range(1) 'copier-coller
        .AutoFilter 8
    End With
End With
End Sub
Normalement les lignes d'en-têtes sont identiques, ce n'est donc pas gênant de les copier...
 

Pièces jointes

Encore une chose, si le tableau de destination est filtré il y a bug sur la ligne du RAZ, pour l'éviter il faut tout afficher :
VB:
        With Sh.ListObjects(1).Range
            .AutoFilter
            .AutoFilter 'affiche tout
        End With
        If Not Sh.ListObjects(1).DataBodyRange Is Nothing Then Sh.ListObjects(1).DataBodyRange.Delete xlUp 'RAZ
 

Pièces jointes

Que racontez-vous ?

Je ne vois pas comment il peut y avoir un bug car quand il n'y a pas d'enregistrement filtré cette ligne :
VB:
If Application.CountIf(.ListObjects(1).DataBodyRange.Columns(8), Replace(Sh.Name, "é", "e")) = 0 Then GoTo 1
conduit à l'étiquette 1 qui met un terme à la macro (Application.CountIf c'est NB.SI).

Testez en effaçant les cellules H30 H37 et H40 de la feuille source et activez la feuille "Expéditions"...
Bonjour @job75 ,
Oups désolé, je n'avais pas vu cette partie du code : merci de votre alerte !
En fait, les exemples que je soumets sur ce site ne correspondent jamais aux les fichiers sur lesquels je travaille et qui contiennent souvent des données sensibles (hé oui, c'est ça l'inconvénient de travailler dans le contre-espionnage ! 😆).
Du coup, je ne fais jamais de copier-coller de l'intégralité de vos propositions de code mais je vais piocher ça et là les syntaxes sur lesquelles je butte.
Encore merci pour votre collaboration 👍
 
J'ai une question @BenHarber : pourquoi voulez-vous copier le DataBodyRange, c'est quand même bien plus simple avec le Range :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
With Sheets("Pannes")
    If Sh.Name = .Name Then Exit Sub
    With .ListObjects(1).Range
        .AutoFilter 8, Replace(Sh.Name, "é", "e") 'il ne faut pas d'accents
        Application.ScreenUpdating = False
        If Not Sh.ListObjects(1).DataBodyRange Is Nothing Then Sh.ListObjects(1).DataBodyRange.Delete xlUp 'RAZ
        .SpecialCells(xlCellTypeVisible).Copy Sh.ListObjects(1).Range(1) 'copier-coller
        .AutoFilter 8
    End With
End With
End Sub
Normalement les lignes d'en-têtes sont identiques, ce n'est donc pas gênant de les copier...
Re,
En fait, j'exporte des données filtrées sur un autre fichier qui contient des formules de calcul liées au tableau-structuré de destination. Donc si je supprime purement ce tableau, toutes les formules vont renvoyer un message d'erreur...alors que si j'efface et remplace simplement la partie des données, tout est OK.
 
Bonjour à tous,
Dans le fichier joint, par curiosité (cela pourra me servir dans d'autres circonstances), j'ai essayé de remplacer la commande suivante :
.SpecialCells(xlCellTypeVisible).Copy Sh.ListObjects(1).Range(1) 'copier-coller

par les 2 lignes suivantes :
dataRange = .SpecialCells(xlCellTypeVisible).Value
Sh.ListObjects(1).ListColumns("DATE").Range(2, 1).Resize(UBound(dataRange, 1), UBound(dataRange, 2)) = dataRange
(cf. PJ)

Mais cela ne copie sur l'onglet de destination que le "1er bloc" filtré : savez-vous pourquoi ?
A votre avis y existe-t-il une autre syntaxe qui permette de coller l'intégralité des données filtrées et discontinues ?
(A ce stade, la seule solution que j'entrevois pour remédier à ce pb serait, en début de macro, de faire un tri PREALABLE de l'onglet 'Pannes' sur la colonne 'H'/Service mais peut-être existe-t-il une solution plus...'propre' ?)

Merci d'avance pour vos suggestions, toujours bien utiles !
 

Pièces jointes

Dernière édition:
Si je comprends bien tu filtres un tableau puis tu copies les lignes visibles dudit tableau, et tu colles ces lignes dans un TS situé dans un autre classeur. J'ai bon ???

Le TS cible est-il vidé avant le collage, ou contient-il des lignes de données ?
Bonjour @TooFatBoy ,
Oui c'est bien ça. Et le tableau de destination est toujours préalablement vidé avant de coller les données 👍
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

C
Réponses
41
Affichages
3 K
Réponses
5
Affichages
542
Retour