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 :

Comment modifier la portée d’une plage nommée en vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 840
    Par défaut Comment modifier la portée d’une plage nommée en vba
    Bonjour,

    Quand on créer une plage nommée par le Gestionnaire de noms il offre la possibilité de spécifier la portée pour le Classeur ou [worksheet name]. Mais si ensuite je désire modifier l'étendue, la liste déroulante est grisée. Et dans ce cas il faut supprimée le nom avec étendue classeur et créer un nouveau avec l’étendue [worksheet name] et la même référence.

    Bien sûr si il faut modifier qu'une seule portée aucun intérêt de faire un macro, par contre dans le cas de plusieurs, voici ma petite macro qui permet de modifier l’étendue [worksheet name] en étendue classeur de tous les noms de la feuille active :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ModifÉtenduNomsFeuille()
        Dim Nom, Feuille, RangeRefersTo
        For Each N In ActiveSheet.Names 'tous les noms de la feuilles actives
            Nom = Mid(N.Name, InStr(N.Name, "!") + 1)
                Feuille = Left(N.RefersTo, InStr(N.RefersTo, "!") - 1)
                RangeRefersTo = "" & N.RefersTo & ""
                ActiveWorkbook.Names(N.Name).Delete
                ThisWorkbook.Names.Add Name:=Nom, RefersTo:=RangeRefersTo
        Next N
    End Sub
    Mais comment vérifier que le nom existe et faire l’inverse c’est-à-dire modifier l’étendue classeur en étendue [worksheet name].

    J’ai passé beaucoup temps et malgré mes recherches je n’ai pas pour trouver solution.

    Merci d’avance pour vos aides er réponses.

  2. #2
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mais comment vérifier que le nom existe
    Il y a deux possibilités, soit on parcoure l'ensemble des noms dans la collection Names soit on passe par une instruction qui provoque une erreur si l'objet dans la collection n'existe pas.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function IsNameExist(Name As String) As Boolean
      Dim n As Name
      Dim f As Integer
      On Error Resume Next
      f = Len(Names(Name).Name)
      On Error GoTo 0
      IsNameExist = (f > 0)
    End Function
    Exemple de son invocation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub TestIsNameExist()
      Debug.Print IsNameExist("MonNom")        ' Portée classeur
      Debug.Print IsNameExist("Feuil1!myName") ' Portée feuille
    End Sub
    Pour l'étendue feuille, il faut évidemment savoir dans laquelle se trouve le nom.

    et faire l’inverse c’est-à-dire modifier l’étendue classeur en étendue [worksheet name].
    Oui mais dans quelle feuille ?
    Sachant que rien n'empêche d'avoir le même nom sur plusieurs feuilles et également en portée classeur.
    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

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 840
    Par défaut
    Bonjour Philippe Tulliez,

    Merci beaucoup pour votre réponse, passer par une instruction qui provoque une erreur si l'objet dans la collection n'existe pas convient parfaitement.

    Pour l'étendue feuille, il s'agit de la feuille active dans laquelle il me semble le nom doit être unique.

    @+

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 840
    Par défaut
    Bonjour,

    Sans autres réponses à cette discussion je me suis dis que la solution c’était peut-être de créer tous les noms étendue feuille avec ce bout de code et ensuite de supprimer les noms avec étendu classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub ModifÉtenduNomsClasseurFeuille2()
        Dim N, Nom, NomFeuille 
        For Each N In ThisWorkbook.Names 'tous les noms du classeur actif
            Nom = Mid(N.Name, InStr(N.Name, "!") + 1)
            NomFeuille = Split(Replace(N.RefersTo, "=", "!"), "!")(1) 'Extraire une chaine entre 2 caractères spéciaux
            ActiveWorkbook.Worksheets("" & NomFeuille & "").Names.Add Name:="" & Nom & "", RefersTo:="" & N.RefersTo & "" 'ajoute les noms étendue feuille
        Next N
    End Sub
    J’ai essayé avec cette ligne qui en principe doit supprime les noms étendue classeur mais en fait ça supprime les noms étendue feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Names("" & Nom & "").Delete
    Pour le moment je patauge !

    En espérant obtenir une réponse @+.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 840
    Par défaut
    Bonsoir,

    Finalement j'ai trouvé une solution pour modifier les noms étendue classeur en noms étendue feuille pour la feuille active :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ModifÉtenduNomsClasseurFeuille()
        Dim N, Nom, NomFeuille, Ref
        For Each N In Application.Names
            'ici on verifie que la plage nommée appartient bien a la feuille active
            If ActiveSheet.Name = N.RefersToRange.Parent.Name Then
                Nom = Mid(N.Name, InStr(N.Name, "!") + 1)
                NomFeuille = Split(Replace(N.RefersTo, "=", "!"), "!")(1) 'Extraire une chaine entre 2 caractères spéciaux
                Ref = N.RefersTo
                ActiveWorkbook.Names("" & Nom & "").Delete
                ActiveWorkbook.Worksheets("" & NomFeuille & "").Names.Add Name:="" & Nom & "", RefersTo:=Ref 'ajoute les noms étendue feuille"
            End If
        Next N
    End Sub
    Serte ce n'est pas la meilleure si il en existe d'autre je suis preneur.

    Merci & @+

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    840
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 840
    Par défaut
    Bonjour à tous,

    Et voici la solution pour modifier les noms étendue Feuille en noms étendue Classeur pour la feuille active :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ModifÉtenduNomsFeuilleClasseur()
        Dim N, Nom, NomFeuille, Ref
        For Each N In Application.Names
            'ici on verifie que la plage nommée appartient bien a la feuille active
            If ActiveSheet.Name = N.RefersToRange.Parent.Name Then
                Nom = Mid(N.Name, InStr(N.Name, "!") + 1)
                NomFeuille = Split(Replace(N.RefersTo, "=", "!"), "!")(1) 'Extraire une chaine entre 2 caractères spéciaux
                Ref = N.RefersTo
                ActiveWorkbook.Names("" & Nom & "").Delete
                ActiveWorkbook.Names.Add Name:="" & Nom & "", RefersTo:=Ref 'ajout les noms étendue Classeur"
            End If
        Next N
    End Sub
    Si certain d'entre vous ont une autre solution, ce sera un plaisir de lire une réponse.

Discussions similaires

  1. [Toutes versions] Comment Récuperer et modifier la zone d'une plage nommée ?
    Par bartez63 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/10/2020, 13h20
  2. Réponses: 5
    Dernier message: 19/09/2017, 08h34
  3. DBDesigner Comment modifier le port Mysql
    Par jef Orome dans le forum DBDesigner
    Réponses: 1
    Dernier message: 15/09/2009, 11h40
  4. Réponses: 0
    Dernier message: 24/04/2008, 13h17
  5. comment modifier le nom d'une colonne via VBA?
    Par Invité dans le forum Access
    Réponses: 6
    Dernier message: 24/11/2005, 15h36

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