IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tableaux structurés : Explorer la zone filtrée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut Tableaux structurés : Explorer la zone filtrée
    Bonjour,
    Je n'ignore pas qu'il est possible de filtrer les tableaux structurés au moyen de filtres élaborés. Cependant dans le cas d'espèce cette méthode n'est pas envisageable : Je dois exporter les données filtrées en explorant chaque ligne dans un Array pour récupérer ligne par ligne la colonne 2, la colonne 22,23...
    En résumé on ne doit pas transférer un bloc (redimensionné ou non) on ne peut que passer par une boucle sur chaque ligne visible.
    C'est là que j'ai un problème de syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub MajCible()
    Dim i&, LR As ListRow
    Dim TData As ListObject, Arr, ArrS(6)
    Dim plage As Range, k%
    Set TData = Range("TBut").ListObject
       On Error Resume Next 'Réinitialise le tableau 'TBut"
          Range("TBut").ListObject.DataBodyRange.Delete
       On Error GoTo 0
              For Each plage In Range("TSrc").SpecialCells(xlCellTypeVisible).Areas 'ligne Problématique ???
                k = k + 1
                Arr = plage.Value
                If k = 1 Then
                   Set LR = TData.ListRows(1)
                Else
                   Set LR = TData.ListRows.Add
                End If
                    ArrS(0) = Arr(i, 2)
                    ArrS(1) = Arr(i, 21)
                    ArrS(2) = Arr(i, 22)
                    ArrS(3) = Arr(i, 23)
                    ArrS(4) = Arr(i, 24)
                    ArrS(5) = Arr(i, 25)
                    LR.Range.Value = ArrS
             Next
    End Sub
    La ligne problématique passe mais la plage est vide...
    Le problème à été posé ailleurs mais dès qu'on parle de Tableaux structurés...
    Merci.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Que voulez-vous faire exactement ?
    Exporter quoi et sous quelle conditions ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Bonjour,
    "TSrc" est un tableau structuré filtré.
    J'ai besoin d'en exporter les lignes visibles vers un autre tableau structuré "Tbut"
    A chaque fois qu'on lance la macro "TBut" est réinitialisé et "in fine" le but est de récupérer ligne après ligne les quelques cellules qui m'intéressent.
    C'est pourquoi je cherche à récupérer ces lignes par la méthode des Arrays (comme si on était dans un userForm en mode ajout)
    J'ai un classeur Test si tu veux :
    https://www.mazurczak.fr/excel/files2021/TestTrans.xlsm
    Merci.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Bien qu'il soit sans doute plus judicieux d'utiliser Power Query, j'ai écrit une contribution sur le sujet La méthode AdvancedFilter et l'objet ListObject où je donne entre autres un exemple avec un tableau structuré comme "source" et un autre comme "cible"
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Bonjour,
    Oui, j'ai vu mais en l'occurence le filtre avancé ne convient pas...
    Je me répond à moi même et je donne la solution qui me crevait les yeux et pourtant j'ai passé toute une après midi dessus hier !
    La macro corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub MajCible()
    Dim i&, LR As ListRow
    Dim TData As ListObject, Arr(), ArrS(6)
    Dim plage As Range, k%
    Set TData = Range("TBut").ListObject
       On Error Resume Next
          TData.DataBodyRange.Delete
       On Error GoTo 0
              For Each plage In Range("TSrc").SpecialCells(xlCellTypeVisible).Areas
                Set LR = TData.ListRows.Add
                Arr = plage.Value
                    ArrS(0) = Arr(1, 2)
                    ArrS(1) = Arr(1, 21)
                    ArrS(2) = Arr(1, 22)
                    ArrS(3) = Arr(1, 23)
                    ArrS(4) = Arr(1, 24)
                    ArrS(5) = Arr(1, 25)
                    LR.Range.Value = ArrS
             Next
    End Sub
    Merci quand même !
    A+

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Oui, j'ai vu mais en l'occurence le filtre avancé ne convient pas...
    Je ne vois pas en quoi, le filtre avancé ne peux résoudre le problème de même d'ailleurs que Power Query

    J'ai donc ouvert le classeur à télécharger dans le Fil #3 pour découvrir le mystère qui empêcherait d'utiliser la méthode AdvancedFilter et j'ai donc pu constater qu'évidemment c'était possible

    Pour réduire le nombre de lignes, j'utilise une exportation temporaire à l'aide de la méthode AdvancedFilter et la méthode Copy pour copier de la plage temporaire vers le tableau structuré "cible"
    On aurait pu se passer du UserForm et utiliser une liste de Validation de données ce qui aurait réduit encore le nombre de ligne mais j'ai voulu conserver au maximum ce que vous utilisez

    J'ai utilisé deux plages nommées areaCriteria et areaTarget contenant comme leur nom l'indique la plage des critères et la plage d'exportation

    La procédure ci-dessous
    • Invoque le UserForm pour la sélection du critère contenu dans la table structurée nommée tEng
    • Utilise la méthode AdvancedFilter pour effectuer une exportation temporaire vers la plage nommée areaTarget suivant le critère sélectionné
    • Utilise la méthode Copy pour copier les données de la plage temporaire vers la table structurée nommée tBut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub Main()
      ' Déclaration
      Dim areaSource As Range
      Dim lstTarget As ListObject
      Set areaSource = Range("tSrc").ListObject.Range
      Set lstTarget = Range("tBut").ListObject
      ' Invocation su UserForm pour choisir le critère
      With usfTest
      .cboChoix.List = Range("tEng").Value
      .Show
       Range("areaCriteria").Item(2).Value = .cboChoix.Value
      End With
      ' Exportation vers une plage temporaire suivant critère
      areaSource.AdvancedFilter Action:=xlFilterCopy, _
                                CriteriaRange:=Range("areaCriteria"), _
                                CopyToRange:=Range("areaTarget")
      ' Copie de la plage temporaire vers la plage cible
      With Range("areaTarget").CurrentRegion
        Set areaSource = .Offset(1).Resize(.Rows.Count - 1)
      End With
      With lstTarget
      .DataBodyRange.Delete
       areaSource.Copy Destination:=.Range.Offset(1)
      End With
      ' End
      Set areaSource = Nothing
      Set lstTarget = Nothing
    End Sub
    Le code du UserForm se résume à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub cboChoix_Click()
      Unload Me
    End Sub
    Pour moi, il serait plus simple d'utiliser une liste déroulante (Validation de données) inclue dans la plage nommée areaCriteria et intercepter le choix par la procédure événementielleWorksheet_Change ce qui permettrait de supprimer le UserForm ainsi que les lignes 7 à 12

    Illustration des plages nommées areaCriteria (C1:C2), areaTarget (E1:J1) et le tableau structuré tEng

    Nom : 211030 dvp AdvancedFilter - Transfer.png
Affichages : 412
Taille : 9,1 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Zone filtrée et variable tableau
    Par nzamata dans le forum Excel
    Réponses: 5
    Dernier message: 06/07/2009, 17h51
  2. explication sur tableaux structuré
    Par frost80500 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 18/01/2008, 19h02
  3. [Tableaux] Structure PHP pour variable complexe
    Par winnie82 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2006, 13h53
  4. [Tableaux] structure des liens de mon site
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2006, 16h28
  5. [Tableaux] structure C/C++
    Par pittacos dans le forum Langage
    Réponses: 4
    Dernier message: 21/12/2005, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo