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 :

nommer une colonne ou une rangée et non une plage [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut nommer une colonne ou une rangée et non une plage
    Bonjour a vous,

    J'ai un petit questionnement que je me suis posé. J'ai quelques fonctions et sub utilisant les offset ou le chiffre correspondant a une colonne. Je veux voir avec vous si quelqu'un sais si nous pouvons nommer une colonne par un nom car je voudrais parfois ajouter des colonne dans mes sheets et le tous risque de ne plus fonctionner. Je sais que nous pouvons nommer une plage mais Est-ce possible de nommer seulement une rangée ou une colonne. En utilisant la lettre correspond, cela ne fonctionne plus en ajoutant une nouvelle colonne

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("Travail").Select
                Cells(x + 1, 2).Select
                Selection.Copy
                Sheets("produits_items").Select
                Cells(x + 1, 3).Select
                ActiveSheet.Paste
    pourrais devenir quelquechose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("Travail").Select
                Cells(x + 1, nom).Select
                Selection.Copy
                Sheets("produits_items").Select
                Cells(x + 1, prenom).Select
                ActiveSheet.Paste
    merci de me dire la faisabilité et si oui comment

    merci pour votre aide !!!

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Je ne comprends pas ta question.
    1) Une colonne entière est également une plage (un objet range, donc)
    2) de surcroît, dans ton exemple, il suffit d'une variable prénom à laquelle tu affectes un N° de colonne, pour l'utiliser comme le montre ton exemple.

  3. #3
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    On peut nommer :
    • des constantes
    • des plages d'1 à n cellules, donc colonne(s) ou ligne(s) aussi
    • des formules


    Il suffit de tester pour voir que cela fonctionne.

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Effectivement, j'ai de la difficulté a expliqué ce que je veux par écrit, je suis très visuel et les mots sont un médias que j'aime plus ou moins utilisés.

    Si je pose ma question d'une façon différente peut etre je pourrais traduire mon besoin.


    Donc si j'affecte un nom a une plage égalant a la totalité d'une colonne par exemple la colonne A je la nomme no_item.


    Est-ce que je peux utiliser no_item comme partie de la réponse d'une méthode Cells étant donné que je boucle et une des donnés est une variables ???


    Par exemple Cells(x+1, no_item)


    en espérant le tout plus claire

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    sans nous indiquer ta version Excel, je me risque néanmoins à t'orienter vers les tableaux structurés Excel (Objet ListObject en VBA)
    http://silkyroad.developpez.com/excel/tableau/


    tu peux naviguer dans tes lignes, colonnes, titres, à envie, sans te soucier de leur position relative dans la feuille ou absolue au sein du tableau ... chaque colonne est un champs nommé.
    C'est à dire que si j'insère une colonne en plein milieu de mon tableau, ça ne change rien à mes procédures, aucune maintenance à faire sur les parties déjà codées.

    au pif, le premier fichier que j'ai sous la main

    ici, je calcule une SOMME.SI.ENS au sein d'un listobject, et à aucun moment je n'ai à me soucier d'un quelconque numéro de colonne, puisque je passe par le nom du champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With Workbooks.Open(CHEMIN_BDD, , True).Worksheets(1).ListObjects(1)
        CellDest.Value = Application.WorksheetFunction.SumIfs(.ListColumns("NOMBRE").DataBodyRange, _
                                                              .ListColumns("DATE").DataBodyRange, ">=" & CSng(CDate(LaDate)), _
                                                              .ListColumns("DATE").DataBodyRange, "<=" & CSng(Application.WorksheetFunction.EoMonth(CDate(LaDate), 0)), _
                                                              .ListColumns("ITEM").DataBodyRange, Domaine, _
                                                              .ListColumns("MEDIA").DataBodyRange, "MAIL", _
                                                              .ListColumns("POLE").DataBodyRange, ListeCategorie(x), _
                                                              .ListColumns("FLUX").DataBodyRange, "ENTRANT")
    End With
    Ca peut paraître déroutant au début, puisqu'on manipule des sous-objets différents des Range, mais la logique est parfaitement identique

    J'ai plusieurs billets de blog où j'utilise des ListObject, ça pourrait te donner des exemples supplémentaires.

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    J'ai fait un test et ça ne fonctionne pas.


    Si j'indique le numéro de colonne, le tout deviens erroné, si on ajoute une colonne ... donc avez-vous une methode a me suggéré ???

  7. #7
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    RE

    Non, cells attend une valeur numérique donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(x+1, no_item.column)

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    OK, Joe effectivement, c'est ca que je veux.

    J'ai la version 2013. Le lien semble erroné encore une fois chez nous ... bref je vais donc essayé de découvrir comment faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(x+1, no_item.column)
    ne fonctionne pas ...

    hmmm

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Effectivement, j'ai de la difficulté a expliqué ce que je veux par écrit, je suis très visuel et les mots sont un médias que j'aime plus ou moins utilisés.
    Il se trouve que le développement, lui, n'est pas "visuel" et demande encore plus de rigueur que le langage naturel !
    Il va falloir que tu t'y mettes, non ? Cela évitera des questions simples, des "hmmm", etc ...

    Je vais te répondre ainsi :
    A toi de "capter"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton1_Click()
      Range("D:D").Name = "coucou"
      Range("coucou").Select
    End Sub
    Private Sub CommandButton2_Click()
      Range("coucou").Select
      MsgBox Range("coucou").Column
      Cells(3, Range("coucou").Column).Select
    End Sub
    Ajoute autant de colonnes que tu voudras. Commandbutton2 saura d e laquelle tu parles.

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Recherche dans le moteur de recherche tout en haut de cette page : Les tableaux dans Excel 2007

    C'est le nom du tutoriel.
    Attention, il est surtout axé "Excel" et n'expose que très très peu la manipulation sous VBA

  11. #11
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Unparia, j'ai "capter" ce qu'il me manquais afin que le tout fonctionne.

    Étant donné que tu es un "fan" des énigmes et des devinnettes. Je te dis donc la dernière chose a la quelle on dit habituellement a quelqu'un qui nous a rendu un grand service.

    amiacalement

    JP

    nota bene : Le hmm est plutôt une marque de réflexion et non de mécontentement

    Le pourquoi j'hais l'écriture comme média de communication: l'absence du ton et de l'émotion. Effectivement, j'ai beaucoup plus de facilité a m'exprimer de façon verbale.

  12. #12
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Re

    J'ai omis les [ (ou Range comme proposé par unparia)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(x + 1, [no_item].Column)
    mais je partage à 200% la proposition Tableau de joe.levrai

  13. #13
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Merci Chris


    Je vais te le dire de façon explicite a toi Merci !!!


    Oui je taquine u peu Unparia mais bref on dois s'amuser dans la vie. Également j'ai déduis d'autre choses avec Column(2) grace aux énigmes de Unparia

    Bref, retour au choses sérieuses.


    Il est-il plus avantageux de nommer les plages en les nommant dans VBA ou directement dans excel (avec le gestionnaire de nom ou en tapant le nom dans la boite de sélection) ???

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Il est-il plus avantageux de nommer les plages en les nommant dans VBA ou directement dans exce
    C'est pareil (ni plus, ni moins avantageux).

  15. #15
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    re
    Citation Envoyé par jpvba Voir le message
    ...Il est-il plus avantageux de nommer les plages en les nommant dans VBA ou directement dans excel
    Je ne comprends peut-être pas question mais si le risque est que, si le classeur évolue le nom doit permettre de retrouver la plage, il faut que le nom soit créé avant d'être exploité par VBA.

    Donc si on le fait une seule fois autant le faire à la main.

    L'intérêt des noms c'est aussi la possibilité de créer du code générique. Par exemple on peut autoriser un utilisateur à nommer de nouvelles plages à traiter sous réserve de préfixer le nom de telle ou telle manière.
    Ainsi le code s'appliquera à ce nouvelles plages...

  16. #16
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Chris, tu as effectivement compris ma question.


    J'ai effectué le changement des numéro de colonne par lenomdelaplage.column et tous fonctionne sauve pour un point que je n'ai pas vu venir avant d'exécuter la procédure.


    Dans ma sub, on boucle les produits du premier item utilisé d'une colonne au derniere utiliser mais j'arrive avec des erreurs lorsque j'insere une colonne vide a l'endroit en question

    Pour commencer, voici ma fonction pour trouver le dernier item utiliser dans une colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function LastLignUsedInColumn(NomColumn As String)
     
        LastLignUsedInColumn = Range(NomColumn & Rows.Count).End(xlUp).Row
     
    End Function


    Ce que j'ai actuellement est


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each sourceCell In Worksheets("Travail").Range("B2:B" & LastLignUsedInColumn("B"))

    J'ai tenter de remplacer le dernier B et j'ai toujours des erreurs.


    Pouvez-vous m'aider afin de pouvoir inclure le nom de plage a ma fonction ou une autre facon de faire me permettant d'utiliser une boucle a l'intérieur des cellule utilisés dans une plage ???


    merci encore une fois

  17. #17
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    NomColumn doit désigner une plage nommée : pour que ton code fonctionne en l'état il faut avoir nommé B ta colonne B.

  18. #18
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    OK Chris comment faire pour nommer la lettre d'une plage ???

    Par exemple, je voudrais utiliser ma plage qui s'appelle prov_long_travail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each sourceCell In Worksheets("Travail").Range("B2:B" & LastLignUsedInColumn("prov_long_travail"))


  19. #19
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si c'est vraiment la ligne de code que tu utilises dans ton projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each sourceCell In Worksheets("Travail").Range("B2:B" & LastLignUsedInColumn("B"))
    autant passer par UsedRange

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each sourceCell In Worksheets("Travail").UsedRange.Columns(2).Cells
    ici, on embarque aussi la ligne B1.

    Mais on peut la supprimer en se décalant d'une ligne, et en réduisant simultanément la taille d'une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Worksheets("Travail").UsedRange.Columns(2)
        For Each Cell In .Offset(1, 0).Resize(.Rows.Count - 1, 1).Cells
    End With
    ***

    Si tu souhaites rester sur des plages nommées, je reviens donc sur ton exposé initial et plus particulièrement ton illustration
    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("Travail").Select
    Cells(x + 1, 2).Select
    Selection.Copy
    Sheets("produits_items").Select
    Cells(x + 1, 3).Select
    ActiveSheet.Paste
    pourrais devenir quelquechose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("Travail").Select
    Cells(x + 1, nom).Select
    Selection.Copy
    Sheets("produits_items").Select
    Cells(x + 1, prenom).Select
    ActiveSheet.Paste
    Si on souhaite résoudre ça, on va déjà simplifier la première procédure, en allant à l'essentiel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Travail").Cells(x + 1, 2).Copy Sheets("produits_items").Cells(x + 1, 3)
    Ensuite, tu veux passer par des plages nommées
    Ce sont des Range par définition, des plages en elles-mêmes, une sous-partie d'une feuille de calcul
    Or, une feuille de calcul, ça possède des cellules ? Ben une plage nommée c'est pareil, ça parait bête de le dire.

    Donc, à fortiori si tu es sur des plages nommées monocolonnes, tu peux boucler dessus facilement ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Travail").Range(NOM).Cells(x + 1, 1).Copy Sheets("produits_items").Range(PRENOM).Cells(x + 1, 1)

    Et voilà ! On ne gère même plus la colonne, c'est toujours la première

  20. #20
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    MErci Joe pour l'aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Worksheets("Travail").UsedRange.Columns(2)
        For Each Cell In .Offset(1, 0).Resize(.Rows.Count - 1, 1).Cells
    End With
    Me cause un problème car on me dit qu'il y a un erreur de compilation End with sans with

    Si j'enleve le end with on m'en demande un .. c'Est vraiment étrange !!!!

    J'ai finalement eu acces au document concernant les tableaux. Petite passe-passe sur mon PC a cause de mon jeton

    JE fais quelques autres test et je vous tiens au courant

    mille fois merci

    C'Est l'intuition que j'avais concernant le tableau ...

    Étant donné que j'ai des collones ayant une formule calculant le nombre de caractère qui a été copier a la ligne 300 étant donné que je veux éviter de toujours ajouter la formule a chaque ajout de ligne, cela cause problématiques.

    Donc il faut rejeter cette méthode pour cette situation.

    Il rest donc a trouver le pourquoi du end with n'Est pas "accepter"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2015, 11h46
  2. Réponses: 2
    Dernier message: 17/03/2011, 21h45
  3. copier une colonne pb avec range cells
    Par clairev dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/07/2009, 14h40
  4. Calcul de la somme d'une colonne apres la derniere ligne non vide
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/06/2009, 11h14
  5. Réponses: 10
    Dernier message: 05/06/2008, 13h53

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