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 :

affectation de nom à des cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut affectation de nom à des cellules
    Bonjour à tous,

    Mon problème :

    Je récupère, à partir d'une boîte de dialogue inputbox, une variable que j'inscris sur la première cellule disponible d'une ligne.

    Je souhaiterais affecter à toute la colonne qui reçoit la valeur de la variable, le nom de cette variable.

    Exemple : si reponse = inputbox (''''''''''''''''''''')
    si reponse = Jean, et que la cellule qui reçoit "Jean" est la cellule (L1C6), je souhaiterais que toutes les cellules de la colonne C6 se voient attribuer le nom "Jean".

    Mais vous aurez bien compris que, lorsque j'écris le code, je ne connais ni "Jean" ni la colonne d'affectation.

    Pour écrire correctement ce code, j'ai besoin d'un sérieux coup de main car je n'arrive pas compléter, notamment, la partie "refersto.......".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'insertion du nom du client
        reponse = InputBox("Entrez le nom du client", "Insertion nom du client", vbOKOnly)
        Label2.Caption = reponse
        Label2.Visible = True
    'recherche de la première cellule libre de la ligne L1
        ThisWorkbook.Sheets("Feuil1").Select
        Range("C1").Select
        While ActiveCell <> ""
        ActiveCell.Offset(0, 1).Select
        Wend
        ActiveCell.FormulaR1C1 = reponse
        ActiveCell.Activate
        ActiveCell.EntireColumn.Select
        ActiveWorkbook.Names.Add Name:=reponse,     RefersToR1C1:=ActiveCell.EntireColumn.Select

    Je vous remercie pour votre aide.
    Cordialement,
    Maurice

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 75
    Par défaut
    Bonjour,

    Je pense que cette fonction répond à ce que vous attendez...
    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
    Public Sub RangeNaming()
     
        Dim str_Response As String
        Dim rg_RefersTo As Range
     
        'Insertion du nom du client
        str_Response = InputBox("Entrez le nom du client", "Insertion nom du client", vbOKOnly)
     
        'Si l'utilisateur n'a pas cliqué sur "Annuler"
        If str_Response <> "" Then
     
        With Label2
            .Caption = str_Response
            .Visible = True
        End With
     
        'Recherche de la première cellule libre de la ligne L1
        With ThisWorkbook.Sheets("Feuil1")
     
            'rg_RefersTo = première cellule de la rangée 1 vide
            Set rg_RefersTo = .Cells(1, 1).End(xlToRight).Offset(, 1)
     
            rg_RefersTo.Value = str_Response
     
        End With
     
        'Défini le nom de la colonne
        ActiveWorkbook.Names.Add Name:=str_Response, RefersToR1C1:=rg_RefersTo.EntireColumn
     
        End If
     
    End Sub

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut
    Bonjour "Larryj"

    Je vous remercie pour votre aide à mon problème.

    Je me suis donc permis de remplacer mon ancienne procédure userform_initialize() par votre contenu, en y laissant le code générant la listbox1

    Je ne sais pas ce que je n'effectue pas correctement. En effet, le lancement de l'userform me demande bien d'entrer le nom du client mais, après le clic sur OK, je me retrouve avec une (erreur d'exécution '1004' : erreur définie par l’application ou par l'objet). Je précise que lorsque je lance le seul code que vous me proposez, c'est-à-dire sans le travail sur la listbox1, je tombe sur le même résultat.

    Le code que j'ai donc recopié est le suivant :

    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
    Private Sub UserForm_Initialize()
        Dim str_Response As String
        Dim rg_RefersTo As Range
        Dim DerCell As String
    'détermination de la longueur de la listbox1
        DerCell = Range("A2").End(xlDown).Address
        ListBox1.RowSource = "A2:" & DerCell
        ListBox1.Height = ListBox1.Font.Size * (ListBox1.ListCount) * 1.25
        'Insertion du nom du client
        str_Response = InputBox("Entrez le nom du client", "Insertion nom du client", vbOKOnly)
     
        'Si l'utilisateur n'a pas cliqué sur "Annuler"
        If str_Response <> "" Then
     
           With Label2
               .Caption = str_Response
               .Visible = True
           End With
     
           'Recherche de la première cellule libre de la ligne L1
           With ThisWorkbook.Sheets("Feuil1")
     
               'rg_RefersTo = première cellule de la rangée 1 vide
               Set rg_RefersTo = .Cells(1, 1).End(xlToRight).Offset(, 1)
     
               rg_RefersTo.Value = str_Response
     
           End With
     
        'Défini le nom de la colonne
        ActiveWorkbook.Names.Add Name:=str_Response, RefersToR1C1:=rg_RefersTo.EntireColumn
     
        End If
    End Sub
    Pourriez-vous, encore une fois, examiner ma difficulté ? Je vous en remercie par avance.

    Cordialement,
    Maurice

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Par défaut
    Bonjour,

    Dans les cas comme le tien, il est plus sympa de cliquer sur débugger quand le message d'erreur t'est présenter et de nous indiquer la ligne de code qui provoque l'erreur en question.

    A+
    PPz

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut
    Bonjour,

    dans ce cas très précis, je ne vois pas, comme dans certains cas où le pop-up "OK, déboguez, annuler" est présenté, où je dois cliquer comme vous me le demandez.

    La seule manœuvre qui m'est autorisée par la boîte de dialogue est : "OK" ou "aide". Lorsque je clique sur "OK", Feuil1 est affichée sans aucun changement.

    Je comprends bien qu'il est souhaitable de mieux renseigner mais je ne vois pas, en l'état de la situation, ce que peux/dois faire.

    Merci encore et d'avance pour le coup de pouce.

    Cordialement,
    Maurice

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Par défaut
    Bonjour,

    Je viens de tester ton code.
    Comme je n'ai pas la définition précise de ton menu interactif, j'ai progressivement enlevé les éléments associés (listbox1 et label2) dans ce cas le logiciel fonctionne.

    Donc si tu as un Pb 1004 après la saisie, c'est sûrement lié à ton Label2 qui est juste après.

    A+
    PPz

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    salut mercatog

    le contexte est- ici celui-ci :
    Citation Envoyé par mauriceguillier Voir le message

    Je récupère, à partir d'une boîte de dialogue inputbox, une variable que j'inscris sur la première cellule disponible d'une ligne.
    Quant aux précautions à prendre, il suffit d'utliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Usedrange.columns.count
    et de le comparer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.Columns.Count
    et de prendre la décision adéquate
    C'est ainsi que je travaille, personnellement.

    EDIT :
    et tu parlais des "cas extrêmes" ...
    Alors regarde : il est en plein dedans :
    Citation Envoyé par mauriceguillier Voir le message
    [*]en mettant une valeur dans la cellule "A1", je rechute sur le même mauvais résultat
    car il obtenait également, dans ce cas, la dernière colonne possible et non la première vide

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Salut babaothe
    En généralisant puis ensuite en parlant du cas spécifique, c'est pourquoi j'avais préféré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(1, .Columns.Count).End(xlToLeft).Column
    qui donne la première cellule remplie en allant de la droite vers la gauche ou A1 au cas où toute la ligne est soit remplie, soit vide.
    Bon, ça dépend des contexte et chaque méthode est utile si elle est bien utilisée.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut
    Bonjour Mercatog, bonjour Babaothe,

    Je viens de prendre connaissance de la réponse de Mercatog (son bout de code dont je le remercie) puis de la riche discussion entre vous deux.

    Tout d'abord, je veux préciser que ce que propose Mercatog fonctionne déjà comme je le souhaite sur un fichier neuf.

    Mais comme le précise Babaothe, il est important que je remplisse la première cellule vide rencontrée par le balayage de la ligne considérée, en partant de la cellule colonne A.

    En effet, mes variables sont des noms de clients qui, malheureusement, doivent être parfois supprimés. Je souhaite donc que la cellule devenue vide puisse être occupée par le nom du premier nouveau client que j'ajouterais. Cela me permet de ne pas avoir de "trou" dans ma liste.

    En fin de compte, je vais tenter d'analyser vos propositions et - le pourrai-je ? - construire le code "parfait" cosigné Mercatog-Babaothe.

    Bonne fin de dimanche à vous deux et, bien sûr, je reste à votre écoute.

    Cordialement,
    Maurice

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 79
    Par défaut
    Bonjour Mercatog, Babaothe, et à tous ceux qui m'ont aidé à résoudre mon problème,

    Youpie, ça marche !

    Mais j'ai dû me rabattre, me semble-t-il, sur un code que j'ai retotoché par de l'amateurisme :

    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
    Dim Rep As String, Ref As String
        Dim NewCol As Integer
        'Insertion du nom du client
        Rep = InputBox("Entrez le nom du client", "Insertion nom du client", vbOKOnly)
            If Rep <> "" Then
                With ThisWorkbook
                    With .Sheets("Feuil1")
                       Range("C1").Activate
                       NewCol = 3
                        While ActiveCell <> ""
                            ActiveCell.Offset(0, 1).Select
                            NewCol = NewCol + 1
                        Wend
                        .Cells(1, NewCol).Value = Rep
                        Ref = .Columns(NewCol).Address
                    End With
                    .Names.Add Name:=Rep, RefersTo:="=Feuil1!" & Ref
                End With       
            End If
    Ainsi, le premier nom s'installe à la première cellule vide de la ligne 1 à partir de la cellule (Ligne1, colonne3). Si des trous existent dans la ligne 1, ils sont bien remplis, à leur ordre, par le code. Bien sûr, les noms sont bien affectés au colonnes correspondantes... grâce à vous.

    Sans doute, vous pourriez professionnaliser le bout de code que j'ai introduit sur la partie qui a fait débat entre Mercatog et Babaothe... et que, comme je le laissais supposer dans mon message précédent, je n'ai pas su complètement appréhender.

    En tout cas, merci encore.

    Très cordialement,
    Maurice

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    ben !

    Je vois que finalement tu ne coimmences pas à la 1ère colonne mais à la colonne C de la ligne 1 !
    Alors voilà, en adaptant à ce départ là, comment appliquer mon code à la partie concernée pour faire la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '.......
    With ThisWorkbook
       With .Sheets("Feuil1")
          NewCol = .Range(Cells(1, 3), Cells(1, Cells.Columns.Count)).SpecialCells(xlCellTypeBlanks).Column
          .Cells(1, NewCol).Value = Rep
          ref = .Columns(NewCol).Address
        End With
        .Names.Add Name:=Rep, RefersTo:="=Feuil1!" & ref
     End With
    '......

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

Discussions similaires

  1. Nom des cellules en surimpression
    Par dudesque dans le forum Excel
    Réponses: 4
    Dernier message: 20/05/2014, 11h30
  2. [XL-2010] Utiliser les noms des cellules avec VBA
    Par laguernette dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/08/2013, 23h02
  3. [XL-2003] Remplir un tableau avec les noms des cellules
    Par tioch dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/08/2011, 18h24
  4. [PEAR] Spreadsheet Excel - Nom des cellules
    Par yanchasp dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/09/2008, 15h26
  5. Réponses: 4
    Dernier message: 30/05/2006, 17h21

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