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 :

Nom ambigu et liste


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité de passage
    Homme Profil pro
    Autre
    Inscrit en
    Août 2025
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2025
    Messages : 1
    Par défaut Nom ambigu et liste
    Bonjour,

    Je débute dans le VBA, je ne souhaite malheureusement pas me spécialiser dedans mais j'en ai besoin pour m'aider dans mon travail.

    J'ai deux fonctions sur une page, la première me permet d'appeler une macro à chaque fois que je clique sur une cellule (Worksheet_SelectionChange) afin de placer un ensemble de trois flèche en bas à droite de la page pour me déplacer dans un tableau.
    La deuxième (Worksheet_Change) me permet de selectionner des items dans une liste et de les ajouter sous ce format :
    A
    +
    B
    +
    C
    etc...

    J'ai ainsi deux soucis.
    Le premier est le nom ambigu, en effet, si j'ai bien trouvé le moyen de fusionner les trois "CALL" dans la fonction Change, je n'arrive pas à garder les deux fonctions distinctes. J'appelle donc les macros lorsqu'une cellule est remplie, et pas quand je clique dessus comme je le voudrais.

    Le deuxième problème concerne l'ajout d'item dans la colonne choix. En effet, si je clique sur A, puis B, puis C dans la liste déroulante, le format est le bon.
    Si je sélectionne à nouveau A ou B dans la liste déroulante, A ou B disparaît de la cellule, comme je le souhaite.
    Cependant, si je sélectionne C, ou bien le dernier item selectionné, celui-ci ne disparaît pas comme le font les autres (tel A ou B dans mon exemple).
    Enfin, et c'est vraiment du plus, si je souhaite ajouter manuellement + Z à la suite de A + B, la cellule devient alors A + B + A + B + Z, et non pas A + B + Z.

    J'espère pouvoir tomber sur une âme charitable qui saura m'aider et me faciliter mon travail.
    Je vous remercie !
    Exemple.xlsm

  2. #2
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 510
    Par défaut
    Bonjour,
    Vos explications sont pour le moins confuses.
    Dites nous clairement les action et réactions. Par exemple si je sélectionne 'A' Dans la liste il doit se passer cela. et ceci pour chaque ligne.

    Vous devez bien comprendre le fonctionnement des conditions If - ElseIf -Else. Pour chaque tests si la condition If est bonne le code ne passera par les autres conditions ElseIf sera tester si If n'est pas bon, et Else sera traiter que si If et ElseIf ne sont pas bon.
    Méditez là dessus...

    Maintenant, où est le gain de temps pour l'utilisation de flèches sur la feuille le pavé fait bien son travail non ?
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en :resolu: Vous avez aimé la discussion alors un :plusser: fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  3. #3
    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 174
    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 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans avoir ouvert votre fichier et à la seule lecture de votre demande.
    Si vous avez un message d'erreur "Nom Ambigu", cela signifie qu'une procédure (Sub ou Function) porte le même nom qu'une autre et/ou que le nom d'un module porte le même nom qu'une procédure.
    A savoir également qu'il ne peut y avoir qu'une seule procédure événementielle telle que "Worksheet_Change" ou "Worksheet_SelectionChange" par module de la classe
    "Feuille"

    Enfin, et c'est vraiment du plus, si je souhaite ajouter manuellement + Z à la suite de A + B, la cellule devient alors A + B + A + B + Z, et non pas A + B + Z.
    Ce phénomène provient sans doute de la procédure évenementielle Worksheet_Change. Lorsque l'on écrit dans une plage de cellules depuis cette procédure, il faut momentanément empêcher l'interception de l'événement par l'instruction Application.EnableEvents = False sans oublier de remettre à True cette propriété juste après l'écriture

    Je débute dans le VBA, je ne souhaite malheureusement pas me spécialiser dedans mais j'en ai besoin pour m'aider dans mon travail.
    Je comprends mais tout de même, la lecture de ce tutoriel titré Les évènements dans la feuille de calcul Excel et tout particulièrement le Chapitre I-Introduction vous permettra de mieux comprendre le problème.
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Bonjour,
    Si j'ai bien compris, ceci devrait le faire:
    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
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim Oldvalue As String
        Dim Newvalue As String
        Dim Tmpvalue As String
        Dim k As Integer
        Dim Plus As String
     
        If Intersect(Target, Range("A2:A10")) Is Nothing Then Exit Sub
        If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub
        If Target.Value = "" Then GoTo Exitsub
     
        Application.EnableEvents = False
        Tmpvalue = Target
        Application.Undo
        Oldvalue = Target
     
        If Oldvalue = "" Then
            Target = Tmpvalue
        ElseIf Oldvalue = Tmpvalue Then
            Target = ""
        Else
            k = InStr(1, Oldvalue, Tmpvalue)
            Plus = vbLf & " + " & vbLf
            If k = 0 Then                                               '--- nouvelle valeur ---> ajouter
                Newvalue = Oldvalue & Plus & Tmpvalue
            ElseIf k = 1 Then                                           '--- existe déjà ---> à supprimer
                Newvalue = Replace(Oldvalue, Tmpvalue & Plus, "")       '--- supprime au début
            Else
                Newvalue = Replace(Oldvalue, Plus & Tmpvalue, "")       '--- supprime après le début
            End If
            Target = Newvalue
        End If
     
    Exitsub:
        Application.EnableEvents = True
        Call HautFixer
        Call BasFixer
        Call GaucheFixer
    End Sub
    En général il n'est pas nécessaire de mentionner la propriété .Value, cette propriété étant celle exploitée par défaut.
    Bonne continuation.

  5. #5
    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 174
    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 174
    Billets dans le blog
    53
    Par défaut
    Bonjour Eric,
    En général il n'est pas nécessaire de mentionner la propriété .Value, cette propriété étant celle exploitée par défaut.
    L'omission de la propriété Value dans une instruction VBA avec un objet Range peut conduire à des erreurs ou des comportements inattendus, surtout lorsqu'on manipule des données complexes ou lorsqu'on travaille avec des feuilles de calcul dynamiques.
    Pour moi, il est évident qu'il est important d'utiliser explicitement cette propriété.

    Il y a eu tout un débat sur cette problématique dans ce forum mais malheureusement, je ne la retrouve pas.
    J'ai tenté également de trouver un ou deux exemples concrets mais pour l'instant, je n'en ai trouvé qu'un

    Dans une cellule quelconque, par exemple D4, entrer la fonction =AUJOURDHUI()
    Code de la procédure d'exemple qui renvoie un résultat différent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub T()
     Debug.Print TypeName(Range("D4"))
     Debug.Print TypeName(Range("D4").Value)
    End Sub
    La première ligne renvoie Range et la seconde Date
    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

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Bonjour Philippe,

    Ok, j'admets qu'il faut recommander l'utilisation explicite de la propriété Value.

    Un extrait de cette discussion abordant ce sujet
    ... mais un point n'est pas en accord avec ma façon de voir l'apprentissage de la programmation VBA.

    Dans le chapitre II Prérequis, il est écrit:

    Un objet peut avoir une propriété par défaut. Par exemple la propriété Value pour l'objet Range. Dans ce cas il n'est pas nécessaire de saisir cette propriété. Et Range("A1") = 15 équivaut à Range("A1").Value = 15
    Cela me semble dangereux, sur un tutoriel dont la vocation principale est tournée vers les débutants, de leur donner cette pratique, à la fois "non conforme aux règles de l'art", mais surtout laissant à VBA la libre interprétation de la bonne propriété en fonction du contexte.

    En effet, débat déjà abordé dans plusieurs sujets de la section VBA Excel : dans certaines situation, c'est le propriété .Text qui sera prise par défaut. Et là clairement, on est plus sur le même type de variable (.Text = ce qui est affiché dans la cellule, .Value = ce qui est affiché dans la barre de formule pour simplifier grandement)
    De quoi rendre chauve un débutant qui ne va pas réussir à débogger.

    ...

    Je confirme : Range n'a pas de propriété par défaut !

    Souvent VBA sélectionne Value mais selon le contexte il arrive parfois à la propriété Text d'être choisie,
    j'en connais encore se les mordant (au choix !) en ayant buté plusieurs jours sans spécifier de propriété !
    A+

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 576
    Par défaut
    Bonjour,
    Personnellement j'oscille entre différents langages de programmation et il est préférable de toujours décliner les propriétés et méthodes.

    De toutes les façons il est préférable de ne pas laisser excel choisir pour toi ce qui est le mieux.
    Exemple Range("A1")=Range("A1")

Discussions similaires

  1. Aide [C++] Logiciel traitant le nom d'une liste de fichiers
    Par Sound4Lyon dans le forum Mon programme
    Réponses: 0
    Dernier message: 11/11/2008, 23h43
  2. [Excel] Supprimer le nom d'une liste
    Par lucarno dans le forum Excel
    Réponses: 4
    Dernier message: 12/03/2008, 10h05
  3. nom d'une liste à partir de valeurs de variables
    Par pedro99 dans le forum Général Python
    Réponses: 5
    Dernier message: 27/06/2007, 17h54
  4. ajouter un nom à une liste déroulante
    Par lolo_bob2 dans le forum IHM
    Réponses: 8
    Dernier message: 25/10/2006, 20h21
  5. Récupération nom champ dans liste et faire pointer dessus
    Par Michel Hubert dans le forum Contribuez
    Réponses: 10
    Dernier message: 14/04/2006, 10h22

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