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 :

Sélection dans plage de donnée nommée [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 24
    Par défaut Sélection dans plage de donnée nommée
    Bonjour à tous,
    Je dois travailler sur un classeur excel qui gère des projets. Malheureusement je ne peux pas le partager :3. Toutefois mon problème est "simple" à comprendre.
    En effet j'ai dans ce classeur 2 colonnes spécifiques que j'ai nommé "libelle_projet" et "Statut Actuel". Ce que je veux faire: c'est parcourir toute la colonne "libelle_projet" (jusque là tout va à peut près bien) et si qqch est écrit, je voudrais récupérer l'information se trouvant sur la même ligne mais dans la colonne Statut_actuel. Voilà où j'en suis dans le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
     
    For Each c In Range("libelle_projet").Cells
        If c.Value <> "" Then
                If Statut_actuel.Value = 3 Then
                    'creer_cellule ("projets_en_cours")
                End If
        End If
     
    Next
     
    End Sub
    Voila le code j'aimerai donc remplacer <<Statut_actuel.Value>> par la valeur contenue comme dit précédemment
    En espérant avoir été clair
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour et bienvenu sur ce forum

    Ouh la!

    A quoi sert la propriété Cells affectée à l'objet Range?
    Un conseil : rattache toujours les objets Range à leur feuille Parent
    Un autre conseil : Déclare tes variables (Tu peux rendre cette déclaration obligatoire par le menu VBE Outils\Options\Déclaration des variables obligatoi, Tous les modules standard auront pour en tête la mention "Option Explicit")
    Enfin, pour balayer les cellules non vides tu peux utiliser la méthode SpecialCells Voir l'aide Microsoft

    Question.
    Quel est l'usage des cellules dont tu veux voir la valeur retournée en 2ème colonne?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 24
    Par défaut
    Alors déjà pour la propriété cells, je pensais devoir obligatoirement la mettre étant donné que je cherche à utilisé la valeur de la cellule... Je viens de tester et ça marche à priori tres bien sans (je débute en vba haha).
    de plus je te remercie pour tes conseils je vais m'y pencher tout de suite.
    Enfin l'objectif est de parcourir la colonne "libelle_projet" et des que la cellule n'est pas vide je veux tester voir si dans la colonne "Statut_Actuel" (du meme projet donc) le statut est terminé ou autre. Si il est terminé alors je sélectionne la ligne, la copie et la colle dans une autre feuille prévu à cet effet (des problèmes vont surement arriver d'ici là ). Voila le projet et ce que j'essaye de faire avec mon code: la démarche n'est peut être pas la plus simple ou rapide je ne sais pas si vous avez d'autres conseils je suis preneur

    Un grand merci

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    (Comme tu es débutant, nous passerons sur la gestion de tableau)

    Dans ce cas, je te proposerais le processus suivant
    - Définir la dernière ligne de ta base
    - Appliquer un filtrer sur le(s) champ(s) concerné(s)
    - Copier les cellules spéciales (voir le lien que je t'ai indiqué) qui sont visibles vers la cellule de destination

    En tenant compte de mon premier post et de ces indications, tu peux essayer d'ébaucher une première procédure.

    Reviens donc avec ce premier code.

    (On va y arriver)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 24
    Par défaut
    ça marche je fais ça je reviens avec le code comme tu me l'as demandé merci encore.

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 676
    Par défaut
    Bonjour,
    Enfin l'objectif est de parcourir la colonne "libelle_projet" et des que la cellule n'est pas vide je veux tester voir si dans la colonne "Statut_Actuel" (du meme projet donc) le statut est terminé ou autre. Si il est terminé alors je sélectionne la ligne, la copie et la colle dans une autre feuille prévu à cet effet (des problèmes vont surement arriver d'ici là ).
    Les filtres avancés permettent notamment en plus du filtre classique de copier directement les données.
    Un petit tuto pour le fonctionnement: https://philippetulliez.developpez.c...dvancedfilter/

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut halaster,

    Ici, au vu de la demande, affecter un filtre élaboré n'est pas rentable.
    Après un filtre normal, une copie des cellules visibles répondra aux besoins de notre ami.
    Et ce d'autant que la copie aura pour destination une autre feuille. (Même s'il existe des moyens de contournement.)

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 24
    Par défaut
    Je reviens la tête à moitié basse, je n'ai pas réussi à utiliser tout ce que tu m'avais proposé (j'ai tout de meme essayé mais sans trop savoir où j'allais). Toutefois j'ai réussi à sortir quelque choses:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Sub MaMacro()
     
    'LastRowP = Range("libelle_projet").End(xlUp).Row
     
    Sheets("Mois en cours").Range("Statut_actuel").AutoFilter Field:=32, Criteria1:="7- Terminé"
     
    reset_donees = effacer_donnees("Projets terminés", "A1")
     
    Copy_paste = Copier_Coller("Mois en cours", "Projets terminés")
     
    'ActiveSheet.Cells.SpecialCells(xlCellTypeVisible).Select
     
     
    End Sub
     
    Function Copier_Coller(feuille_de_copie, feuille_de_colle)
     
    Sheets(feuille_de_copie).Select
    Range("B16").Select
    Set tbl = ActiveCell.CurrentRegion
    tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy
     
        Sheets(feuille_de_colle).Select
        Range("A1").Select
     
        Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
     
        ActiveSheet.Paste
     
    End Function
     
    Function effacer_donnees(Mafeuille, Cellule)
     
    Sheets(Mafeuille).Select
    Range(Cellule).Select
    Set tbl = ActiveCell.CurrentRegion
    tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Select
    Selection.ClearContents
     
    End Function
    Voilà ce m'à l'air de fonctionner, la manière dont je sélectionne (avec offset et resize), me parait pas très stable.
    Pour revenir à tes conseils, une fois que j'avais définit la dernière ligne (ligne 2 du code ci-dessus), je ne savais pas trop comment l'utiliser... De plus je n'ai pas réussi à appréhender les specialCells j'ai un peu compris le fonctionnement mais je ne sais quel type utiliser...
    J'ai tout de même voulu revenir avec quelque chose même si je ne sais pas s'il est fiable à 100%.
    Qu'en penses-tu ? Que dois-je corriger ? Bref comment m'améliorer.

    PS:Je n'ai pas oublié ton conseil au niveau de la déclaration de variable je m'en occupe

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Normalement, tes projets sont une table de données (et normalement, il ne devrait pas s'y trouver de projet sans intitulé, d'où ma perplexité sur le fait de devoir tester que la cellule est remplie...). Dès lors, tu pourrais utiliser une solution s'appuyant sur les références structurées de tes tables de données.

    Pour l'exemple, une table de données de projets t_Projets contenant deux colonnes (ici en A:B), une table de données t_Terminés qui contiendra les projets terminés (ici en H:I). Je les ai placés sur la même feuille mais tu peux les placer où tu veux, le code proposé n'a pas besoin de savoir où les tableaux se trouvent. Le code proposé est à mon avis explicite et illustre l'intérêt de passer par les références nommées.

    Nom : 2019-05-28_144838.png
Affichages : 1078
Taille : 10,0 Ko


    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
    Sub TransferProjects()
      Dim Cell As Range
      Dim Counter As Long
      Dim NewRow As Range
      Dim Index As Long
     
      For Each Cell In Range("t_Projets[Projet]")
        Counter = Counter + 1
        If Cell.Value <> "" And Range("t_Projets[Statut]")(Counter).Value = "Terminé" Then
          Range("t_Terminés").ListObject.ListRows.Add
          Index = Range("t_Terminés").Rows.Count
          Range("t_Terminés[Projet]")(Index).Value = Cell.Value
          Range("t_Terminés[Statut]")(Index).Value = Range("t_Projets[Statut]").Cells(Counter).Value
        End If
      Next
    End Sub

    NB: Tu vois donc que tu peux transférer plus de données si tes tableaux contiennent plus de colonnes. Si les noms des colonnes sont synchros dans les deux tableaux, on pourrait boucler sur les noms des colonnes à copier pour éviter d'énumérer chaque ligne. On pourrait aussi créer un tableau de paires valeurs pour reprendre les données de certaines colonnes uniquement, même si les colonnes ne sont pas nommées à l'identique.

    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 TransferProjects2()
      Dim Cell As Range
      Dim Counter As Long
      Dim Index As Long
      Dim Columns
      Dim ColCounter As Long
     
      Columns = VBA.Array("Projet", "Nom", "Statut", "Situation")
      For Each Cell In Range("t_Projets[Projet]")
        Counter = Counter + 1
        If Cell.Value <> "" And Range("t_Projets[Statut]")(Counter).Value = "Terminé" Then
          Range("t_Terminés").ListObject.ListRows.Add
          Index = Range("t_Terminés").Rows.Count
          For ColCounter = 0 To UBound(Columns) Step 2
            Range("t_Terminés[" & Columns(ColCounter + 1) & "]")(Index).Value = _
              Range("t_Projets[" & Columns(ColCounter) & "]")(Counter).Value
          Next
        End If
      Next
    End Sub


    Si les deux tableaux sont pile poil identiques en termes de colonnes (même nombre et ordonnées de la même manière), on peut évidemment copier la plage en une fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TransferProjects1()
      Dim Cell As Range
      Dim Counter As Long
      Dim Index As Long
     
      For Each Cell In Range("t_Projets[Projet]")
        Counter = Counter + 1
        If Cell.Value <> "" And Range("t_Projets[Statut]")(Counter).Value = "Terminé" Then
          Range("t_Projets").ListObject.ListRows(Counter).Range.Copy Destination:=Range("t_Terminés").ListObject.ListRows.Add().Range
        End If
      Next
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    PS:Je n'ai pas oublié ton conseil au niveau de la déclaration de variable je m'en occupe
    C'est le fondement même de toute procédure.
    Et, partant, c'en doit être la toute première étape.

    Pense d'abord à effectuer les manipulations sur Excel, en utilisant l'enregistreur de macro dans un premier temps.

    Il n'est pas besoin de multiplier ici les procédures


    Pour définir une dernière cellule, exemple en colonne 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim derligne as Long
     
    With Worksheets("lawks")
      derligne = .Cells(.Rows.Count, 2).End(xlUp).Row
    End With
    Quant aux cellules spéciales, c'est une méthode qui s'affecte à un ensemble de cellules.
    Dans le lien que je t'ai indiqué, un autre lien retourne toutes les occurrences (de mémoire xlCellType)

    Une fois le filtre appliqué, il te faudra copier les cellules visibles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:T" & derligne).SpecialCells(xlCellTypeVisible).Copy Destination:= ....

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 24
    Par défaut
    Salut Pierre,
    Qu'entends-tu par table de donnée car je ne pense pas que s'en soit une (un détail le fichier ne vient pas de moi)...
    Donc je testais savoir si libelle_projet était vide ce qui voulait dire que c'était la fin du tableau le cas échéant.
    J'ai jeté un oeil sur ce que tu as proposé et ça ressemble à ce que je voulait faire (en terme d'idées bien évidemment ).
    Je regarde ça plus en détails je reviens si j'ai des questions (à conditions qu'on veuille bien me répondre évidemment haha ).

    Merci à tous pour votre aide.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    une table de données (tableau structuré) est une plage rectangulaire contenant des données structurées (plage rectangulaire avec une première ligne d'intitulés puis des lignes qui constituent les enregistrements) (voir mon tuto sur le sujet: https://fauconnier.developpez.com/tu...ux-structures/) Si ta plage n'est pas une table et pour autant qu'elle s'y prête, tu peux la transformer rapidement en table, c'est l'affaire de deux clics.

    Si tes critères deviennent plus complexes pour copier tes lignes de projet, l'idée d'ajouter une colonne formulée à droite permet d'exprimer en Excel la condition du filtre puis de tester simplement que pour chaque ligne, cette colonne renvoie VRAI (par exemple). Ainsi, tu délègues à Excel le soin d'exprimer la condition, ce qui est souvent plus simple que de le faire par code VBA dès que ça devient un peu complexe. De plus, la modification de la condition n'entraîne aucune modification de code, puisqu'il suffit de modifier la formule conditionnelle. (Voir ma signature: VBA pour Excel? ... )


    Nom : 2019-05-28_151316.png
Affichages : 1037
Taille : 17,9 Ko

    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 TransferProjects3()
      Dim Cell As Range
      Dim Counter As Long
      Dim Index As Long
      Dim Columns
      Dim ColCounter As Long
     
      Columns = VBA.Array("Projet", "Nom", "Statut", "Situation")
      For Each Cell In Range("t_Projets[Projet]")
        Counter = Counter + 1
        If Cell.Value <> "" And Range("t_Projets[Sélection]")(Counter).Value = True Then
          Range("t_Terminés").ListObject.ListRows.Add
          Index = Range("t_Terminés").Rows.Count
          For ColCounter = 0 To UBound(Columns) Step 2
            Range("t_Terminés[" & Columns(ColCounter + 1) & "]")(Index).Value = _
              Range("t_Projets[" & Columns(ColCounter) & "]")(Counter).Value
          Next
        End If
      Next
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Pierre,

    Sans flagornerie aucune, très beau code (je le place dans ma bibliothèque).

    De prime abord, pour un projet mien, j'aurais utilisé un filtre sur tableau en reprenant le code de Jacques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function FiltreArrayLignes(Tbl, col, cle)
     Dim i As Long, n As Long
       Dim tmp(): ReDim tmp(1 To UBound(Tbl))
       For i = LBound(Tbl) To UBound(Tbl)
         If Tbl(i, col) = cle Then n = n + 1: tmp(n) = i
       Next
       ReDim Preserve tmp(1 To n)
       FiltreArrayLignes = Application.Index(Tbl, Application.Transpose(tmp), _
         Application.Transpose(Evaluate("Row(1:" & UBound(Tbl, 2) & ")")))
     End Function
    Avec
    Tbl : tableau des données
    col: colonne où se trouve l'occurrence
    clé: valeur de l'occurrence à filtrer.

    Le report à la cellule de destination est alors immédiat.

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 24
    Par défaut
    Je continue de me pencher sur ce que vous m'avez envoyé (qui est parfois au-dessus de mon niveau, mais très bien pensé) merci beaucoup je garde juste le ticket ouvert pour d'éventuelles questions.
    Merci encore à vous

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Marcel

    Merci pour l'appréciation

    Le code de Jacques est probablement plus rapide sur de grandes tables. Je suppose que lorsque tu parles de Tbl, c'est une variable tableau (pas un tableau Excel). il faut donc le créer sur base de la plage à traiter, puis le tableau qui est restitué doit encore est collé sur une plage qui a été redimensionnée pour le recevoir. Il y a donc du travail en amont et en aval, je suppose. De plus, ça transfère toutes les colonnes, ce qui nécessite que les tables doivent être identiques en termes de colonnes et d'ordre de celles-ci...

    Perso, je trouve que l'utilisation des références structurées permet un code lisible et rapidement compréhensible, car il colle aux notions de l'excellien qui n'est pas forcément toujours un programmeur. Mon dernier code proposé amène la souplesse des filtres avancés (expression du critère, possibilité de ne reprendre que certaines colonnes dans l'ordre souhaité) en permettant en plus que les colonnes ne soient pas nommées à l'identique, en évitant la plage de critérisation nécessaire au filtre avancé, au prix de l'ajout de la colonne de sélection, mais cette colonne est très souvent présente dans les tableaux de mes clients.

    Après, chacun son style, évidemment, mais dans 6 mois, je préférerai me replonger dans mon code, qui peut, en plus, être rendu totalement générique, apportant à son utilisateur la possibilité de faire totale abstraction des listobjects, et pour le code de Jacques, des arrays et des transpose, du redimensionnement, etc
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    D'accord Pierre.
    Je comprends.

    Qui plus est, ce type de code permet de mieux gérer les tableaux structurés.
    C'est là une notion à laquelle, parfois, on ne fait pas référence naturellement, moi le premier.

    A bientôt.

  17. #17
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonjour

    Citation Envoyé par MarcelG Voir le message
    Qui plus est, ce type de code permet de mieux gérer les tableaux structurés.
    C'est là une notion à laquelle, parfois, on ne fait pas référence naturellement, moi le premier.
    et c'est bien dommage .

    Un autre exemple avec Tableaux (ListObjects) et Filtres
    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
    Option Explicit
    Private Sub Worksheet_SelectionChange(ByVal R As Range)‘ou autre pour le lancement
      If R.Address <> [màj].Address Then Exit Sub
      Dim L As Long, C As Byte
        Application.ScreenUpdating = 0
        If Application.CountA([Te]) > 1 Then [Te].Delete
        L = 1                              'ligne d'écriture réajustée plus bas
        For Each R In [Ts]
            C = R.Row - [Ts].Row + 1        'colonne d'écriture
            If [Te].Columns(C).Rows.Count < 1 Then L = [Te].Columns(C).Rows.Count + 1
            [Tp].AutoFilter 2, R              'filtre colonne 2, critère R
            [Tp[Nom]].Copy [Te].Item(L, C)  'copie dans le tableau
            [Tp].AutoFilter   'sans filtre
        Next
    End Sub
    Dans ce cadre
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.


    Citation Envoyé par OrDonc Voir le message
    [...]

    Un autre exemple avec Tableaux (ListObjects)[...]

    Attention! En utilisant [tp], tu n'utilises pas le listobject, mais sa plage de données, [tp] n'est jamais qu'une autre façon d'écrire Range("tp") et pointe donc vers une plage (objet Range) et pas vers la table de données (objet ListObject). Qui plus est, il faut noter que la notation [tp] prive le programmeur de la saisie semi-automatique (perso, je n'aime pas cette notation)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Macro Excel pour sélection de plage de données
    Par ginus489 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/09/2015, 11h40
  2. [XL-2002] copier une plage de données nommées
    Par jmtpat dans le forum Excel
    Réponses: 10
    Dernier message: 05/11/2014, 10h33
  3. [XL-2003] Macro pour sélection de plage de données
    Par 3vince-fr dans le forum Excel
    Réponses: 5
    Dernier message: 22/05/2014, 11h40
  4. [XL-2010] Compter le nombre de fois qu'apparait un texte dans une plage de donnée nommée
    Par saloupio dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 31/01/2014, 08h17
  5. Réponses: 1
    Dernier message: 09/03/2007, 07h52

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