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 :

La méthode 'Add' de l'objet 'ListRows' a échoué [XL-2013]


Sujet :

Macros et VBA Excel

  1. #61
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function gettblContacts()
      SortContacts
      gettblContacts = Range("t_Contacts")
    End Function
     
    Function SortContacts()
      With Range("t_Contacts").ListObject.Sort.SortFields
        .Add Key:=Range("t_Contacts[Nom]"), SortOn:=XlSortOn.xlSortOnValues, Order:=XlSortOrder.xlAscending
        .Add Key:=Range("t_Contacts[Prénom]"), SortOn:=XlSortOn.xlSortOnValues, Order:=XlSortOrder.xlAscending
      End With
      Range("t_Contacts").ListObject.Sort.Apply
    End Function


    Pour suivre dans la logique mise en place, il vaut mieux créer une fonction qui trie, et appeler cette fonction dans la fonction getTblContacts. C'est plus propre et tu restes dans l'idée qu'une fonction n'a qu'une seule responsabilité. GetTblContacts a la responsabilité de créer un tableau VBA avec les contacts présents dans la table, pas de trier les données. Il faut donc un fonction SortContacts qui trie les données. Cette fonction sera appelée soit avant le GetTblContacts, soit par GetTblContacts. C'est l'option que j'ai choisie ici. Elle illustre que sortir la création du tableau du flux principal était une bonne idée, puisque maintenant, la fonction getTblContacts doit proposer un tableau trié. A partir de maintenant, tout code qui aura besoin d'un tableau VBA des contacts le recevra trié. On n'a plus besoin d'y penser à chaque fois. Sa responsabilité change puisque maintenant, elle consiste à fournir un tableau trié. Le code principal, quant à lui, n'a pas été modifié d'un iota.

    De plus, en procédant ainsi, tu as à ta disposition une fonction qui trie ton tableau et tu peux l'appeler d'où tu veux. Tu ne dois pas réécrire ce code spécifique, parfois plusieurs fois, au sein d'un code spaghetti chaque fois que tu en as besoin puisqu'il suffit d'appeler la fonction. Et si demain la règle de gestion est modifiée et que tu dois proposer les contacts triés par prénom puis par nom, il te suffit d'inverser les lignes d'ajout de niveau de tri dans la fonction SortContacts et tout client de la fonction bénéficie directement de la modification. Vu que tu n'as écrit le tri qu'une fois, tu ne dois le modifier qu'une fois. Et pour finir, tu peux trouver très rapidement la petite fonction qui a cette responsabilité, surtout si tu donnes des noms parlants à tes procédures et fonctions.

    Il n'y a que des avantages à procéder ainsi.

    Dans l'exemple proposé et pour faire simple, le tri se fait sur le nom et le prénom par ordre croissant et n'est donc pas souple. On pourrait imaginer plein de paramètres pour rendre cela plus simple, mais je ne pense pas que ce soit l'objectif.

    Pour ce qui est du tri en lui-même, les tables de données proposent une meilleure gestion du tri en VBA. Je pense que la fonction que je te propose ci-dessous est assez parlante sans commentaires. Pour me connecter à la table de données t_Contacts et bénéficier des outils de tri liés au ListObject, j'utilisee la propriété ListObject de la plage avec le code With Range("t_Contacts").ListObject.



    Pour ce qui est de la plage nommée, c'est un résidu d'anciens tests et elle peut être supprimée.

    PS: Il n'est pas utile de reprendre des réponses complètes en citation. Si tu souhaites appuyer ta réaction sur une partie de message, ne reprends que cette partie. La lecture de la discussion s'en trouvera allégée
    "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...
    ---------------

  2. #62
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut
    C'est en effet très clair. Merci pour la remarque en filigrane
    Eric

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

Discussions similaires

  1. Méthode add() de l'objet select
    Par webrider dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/01/2008, 15h01
  2. Méthode add de l'objet AllowEditRange fonctionne... maintenant
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2007, 13h58
  3. erreur La méthode 'Range' de l'objet '_Global' a échoué
    Par mahboub dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/11/2006, 21h46
  4. la méthode 'connection' de l'objet '_currentProject' a échoué
    Par floysand dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/09/2006, 13h14
  5. [VBA-E]La méthode 'Range' de l'objet '_Global' a échoué
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/02/2006, 17h00

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