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 !
 
Bonjour BenHarber, sylvanu, le forum,

J'interviens après avoir vu le post #11 de sylvanu.

Quand on utilise DataBodyRange il faut faire attention au cas où celui-ci n'existe pas (Is Nothing), il peut créer un bug.

Perso j'utiliserais une seule macro dans ThisWorkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
With Sheets("Pannes")
    If Sh.Name = .Name Then Exit Sub
    If .ListObjects(1).DataBodyRange Is Nothing Then
1       If Not Sh.ListObjects(1).DataBodyRange Is Nothing Then Sh.ListObjects(1).DataBodyRange.Delete xlUp
        Exit Sub
    End If
    If Application.CountIf(.ListObjects(1).DataBodyRange.Columns(8), Replace(Sh.Name, "é", "e")) = 0 Then GoTo 1
    With .ListObjects(1).DataBodyRange
        .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(2, 1) 'copier-coller
        .AutoFilter 8
    End With
End With
End Sub
A+
 

Pièces jointes

Bonjour @job75 ,
Merci pour ton intervention qui, du coup, m'a permis de solutionner mon pb de syntaxe !
Il suffisait donc d'écrire "Destination:=Sheets("OngletDestination").ListObjects("tableauDestination").Range(2,1)"

Perso., je ne connaissais pas du tout cette formulation "Range(2,1)" (pour moi, c'est soit 'cells(2,1)', soit 'Range("A2")'

@job75 et @sylvanu : un grand merci pour vos éclairages et remarques !
 
Maintenant si la feuille source est dans un autre fichier on utilisera ce code, toujours dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
Workbook_SheetActivate ActiveSheet 'lance la macro
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Application.ScreenUpdating = False
On Error Resume Next
With Workbooks.Open(ThisWorkbook.Path & "\Fichier source.xlsx").Sheets(1) 'nom du fichier à adapter
    If Err Then MsgBox "Le fichier 'Fichier source.xlsx' est introuvable !", 4: Exit Sub
    On Error GoTo 0
    If .ListObjects(1).DataBodyRange Is Nothing Then
1       If Not Sh.ListObjects(1).DataBodyRange Is Nothing Then Sh.ListObjects(1).DataBodyRange.Delete xlUp
        GoTo 2
    End If
    If Application.CountIf(.ListObjects(1).DataBodyRange.Columns(8), Replace(Sh.Name, "é", "e")) = 0 Then GoTo 1
    With .ListObjects(1).DataBodyRange
        .AutoFilter 8, Replace(Sh.Name, "é", "e") 'il ne faut pas d'accents
        If Not Sh.ListObjects(1).DataBodyRange Is Nothing Then Sh.ListObjects(1).DataBodyRange.Delete xlUp 'RAZ
        .SpecialCells(xlCellTypeVisible).Copy Sh.ListObjects(1).Range(2, 1) 'copier-coller
        .AutoFilter 8
    End With
2   .Parent.Close False 'ferme le fichier source
End With
End Sub
Téléchargez les 2 fichiers joints dans le même dossier (le bureau) et ouvrez le fichier de destination.
 

Pièces jointes

Bonjour,

L'intérêt de Sh.ListObjects(1).Range(2, 1) c'est que la référence se fait par rapport au tableau et fonctionne même si on le déplace.
Est-ce qu'il faut en fait lire :
"L'intérêt de Sh.ListObjects(1).Range(2, 1) c'est que la référence se fait par rapport au tableau dans la feuille et fonctionne même si on le déplace dans la feuille." ?
 
La macro ne permet pas de faire un Copier-Coller ou un Couper-Coller vers une autre feuille 🙄
Est-ce à dire qu'il fallait donc en fait lire :
"L'intérêt L'inconvénient de Sh.ListObjects(1).Range(2, 1) c'est que la référence se fait par rapport au tableau dans la feuille et fonctionne même si on le déplace dans la feuille." ? 🤔 😅


Je n'ai pas de réponse à ma question, ou du moins je n'ai pas compris si la réponse était "oui" ou "non", mais au moins ça aura un peu égayé ma journée. 😉


Bonne journée ensoleillée
🌞
 
Merci pour ton complément de réponse.

En fait au départ je posais la question, non pas spécifiquement sur cette macro, mais plus généralement sur la syntaxe et son implication, parce que je ne sais jamais vraiment comment écrire les instructions concernant les TS.
 
bonjour le Fil
je crois qu'on peut s'affranchir du Sh, en utilisant la syntaxe
Code:
[NomListObject].range(2.1)
On peut aussi avoir

VB:
Range("NomListObject").ListObject.DataBodyRange.Cells(1, 1)
Range("NomListObject").ListObject évite la référence à la feuille Source , on peut ainsi le mettre ou l'on veut dans la feuille ou le Fichier

cette écriture [NomListObject] a ce que j'en ai compris , n'est pas recommandée (Idem référence à plage Nommée)
Bonne Journée
Jean marie
 
moi je fais un truc du genre
if .listrows.count<>0 then
.databodyrange.delete
end if
ind=.listrows.add.index

.databodyrange(ind).resize(ubound(tablo,1))=tablo

après;. il me semble qu'on est loin de la question d'origine...

Filtrer dans une variable-tableau : possible ? ==> OUI​

 
- 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