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 :

[VB-EXCEL2003] Noms de cellules locaux et globaux


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut [EXCEL 2003] Changer le nom d'une cellule nommée dans plusieurs formules
    J'ai à traduire en français l'ensemble d'une application excel écrite en Anglais.
    Il y a plusieurs feuilles, dans lesquelles se trouvent de nombreuses formules.
    Dans ces formules se trouvent des noms faisant référence à des cellules nommées (ou des champs nommés).

    Je souhaite changer le nom d'une cellule nommée et le remplacer par un autre nom dans toutes les formules où il se trouve.

    Je pensais :
    1) identifier les cellules avec formules
    2) chercher dans ces cellules lesquelles renferment le nom que je souhaite changer
    3) le remplacer par le nouveau nom

    Mais je ne vois pas comment faire cela en VB. Quelqu'un pourrait-il m'aider ?
    Merci.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour avoir tous les noms de ton classeur, tu peux faire une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Nom, Tablo(), i as integer
        i = 0
        For Each Nom In ActiveWorkbook.Names
            Redim Preserve Tablo(i)
            Tablo(i) = Nom.name
            i = i + 1   ' ajouté par zaza, sinon ton tableau n'aura qu'une donnée...
        Next
    Maintenant, pour remplacer ces noms dans les formules, tu fais un remplacement avec replace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For i = 0 to Ubound(Tablo)
            NewNom = Inputbox("Ancien nom : " & Tablo(i) & vbcr & "Saisir le nouveau nom : ")
            if not trim(NewNom) = "" then _
                Cells.Replace What:=Tablo(i), Replacement:=NewNom, LookAt:=xlPart
        Next
    Bonne soirée

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci, mais j'ai peut-être mal expliqué alors j'attache un exemple de fichier excel de ce que je veux faire.

    Merci.
    Fichiers attachés Fichiers attachés

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Regarde ma réponse précédente. J'ai effacé la première.

    (tu avais très bien expliqué... J'avais "simplement" mal lu )

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci ouskel'n'or
    Mais j'avais dû mal expliquer ce que je souhaitais faire.
    L'idée est de pouvoir changer les noms d'un fichier excel qui sont utilisés dans plusieurs feuilles de ce fichier, mais aussi de convertir les formules qui contenaient l'ancien nom avec le nouveau nom.
    Le code ci-dessous semble fonctionner
    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
     
    Sub ChangerNomCelluleNommeeDansWorkBookEtFormules(NomFeuille, AncienNom, NouveauNom As String)
     
        Dim Cell As Range
        Dim Cible As String
     
        MsgBox AncienNom
     
      ' Boucle sur les cellules utilisées dans la Feuil1 et applique
      ' une couleur de fond jaune si elle contient une formule.
        For Each Cell In Worksheets(NomFeuille).UsedRange.Cells
            If Cell.HasFormula Then
                                    Cell.Interior.ColorIndex = 24
                                    Cell.Formula = Replace(Cell.Formula, AncienNom, NouveauNom)
                                End If
        Next Cell
     
      ' Récupère l'adresse de la cellule ou la plage nommée.
        Cible = Range(AncienNom).Name
      ' Supprime le nom
        Range(AncienNom).Name.Delete
      ' Renomme la plage initiale
        Range(Cible).Name = NouveauNom
     
    End Sub
     
    Sub Test()
        Call ChangerNomCelluleNommeeDansWorkBookEtFormules("Feuil1", "Taille", "Size")
    End Sub

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Et en reprenant ton code (élégant ), j'ai ajouté les lignes qui manquaient pour supprimer les anciens noms et attribuer les nouveaux noms aux mêmes adresses et une toute petite ligne pour incrémenter le compteur i ...

    Merci beaucoup... ça m'a beaucoup aidé !!!

    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
    Sub PetiteModifDuCodeDeOuskelnor()
     
        Dim Nom, Tablo(), i As Integer
        Dim NewNom As String
     
      ' Stocke les noms du Workbook actif dans un tableau
        i = 0
        For Each Nom In ActiveWorkbook.Names
             ReDim Preserve Tablo(i)
             Tablo(i) = Nom.Name
             i = i + 1
        Next
     
      ' Pour chaque nom du tableau
     
        For i = 0 To UBound(Tablo)
     
                  Cible = Range(Tablo(i)).Name
     
                ' Permet à l'utilisateur de spécifier le nouveau nom
                  NewNom = InputBox("Ancien nom : " & Tablo(i) & vbCr & "Saisir le nouveau nom : ")
     
                  If Not Trim(NewNom) = "" Then _
                     ' Remplace l'ancien nom présent dans les cellules du workbook actif
                       Cells.Replace What:=Tablo(i), Replacement:=NewNom, LookAt:=xlPart
                     ' Supprime l'ancien nom
                       Range(Tablo(i)).Name.Delete
                     ' Renomme la plage initiale en lui affectant la même adresse
                       Range(Cible).Name = NewNom
                  End If
     
        Next
     
    End Sub

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai légèrement modifié le code initial pour automatiser le nettoyage depuis un fichier excel où tous les noms de cellules avec leur traduction sont stockés.

    Mais le code suivant refuse de passer. Il indique sans cesse :
    Erreur 1004 - La méthode Range de l'objet _Global a échoué
    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
    Sub RemplacerEtSupprimerNoms()
     
        Dim AncienNom, NouveauNom As String
        Dim i, j As Integer
        Dim Cible As String
     
        For i = 1 To UBound(TableauDesNoms)
     
          ' On met en correspondance l'ancien et le nouveau nom qui est destiné à le remplacer
            AncienNom = TableauDesNoms(i)
            NouveauNom = TableauDesNouveauxNoms(i)
          ' MsgBox "Start : " & AncienNom & " --> " & NouveauNom
            Cible = Range(AncienNom).Name
     
            If NouveauNom <> "X" Then
              ' Pour chacune des feuilles du workbook actif, remplace l'ancien nom par le nouveau
                For j = 2 To Sheets.Count
                    Sheets(j).Cells.Replace What:=AncienNom, Replacement:=NouveauNom, LookAt:=xlPart
                  ' MsgBox Sheets(j).Name
                Next j
              ' Supprime ensuite l'ancien nom
                Range(AncienNom).Name.Delete
              ' et renomme la plage initiale en lui affectant la même adresse
                Range(Cible).Name = NouveauNom
            Else
              ' Supprime la variable inutilisée du workbook
                Range(AncienNom).Name.Delete
            End If
     
        Next i
     
    End Sub
    Quelqu'un peut-il m'aider à trouver pk ?
    Merci.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bonjour Froggy,

    Edit
    J'ai fusionné les discussions sans quoi on ne comprenait rien
    Déjà, un nom de cellule est une propriété du classeur pas d'une cellule.
    Range(Nom).name ne veut rien dire
    Je regarde pour le reste, il faut se remettre dans le bain
    A+

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Allo OuskelNor

    Les tableaux sont déclarés dans la partie générale selon :
    Dim TableauDesNoms(), TableauDesNouveauxNoms() As Variant

    Ils sont lus dans la procédure suivante :
    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
    Sub ApresNettoyageEtTraductionRecupererLesNouveauxNoms()
     
      ' Cette procédure permet de stocker les nouveaux noms (traduction des anciens)
      ' dans un tableau en les lisant depuis la feuille "CellulesNommées" où ils sont écrits
     
        Dim i As Integer
     
        i = 5   ' pour la ligne où les noms commencent
        While Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Cells(i, 1).Value <> ""
            ReDim Preserve TableauDesNoms(i - 4)
            ReDim Preserve TableauDesNouveauxNoms(i - 4)
            TableauDesNoms(i - 4) = Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Cells(i, 1).Value
            TableauDesNouveauxNoms(i - 4) = Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Cells(i, 3).Value
          ' MsgBox i - 4 & " : " & TableauDesNoms(i - 4) & " --> " & TableauDesNouveauxNoms(i - 4)
            i = i + 1
        Wend
     
    End Sub
    Le programme global appelle la procédure où j'obtiens cette erreur 1004 et cette procédure juste avant, selon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub ProgrammePrincipal()
        Call ApresNettoyageEtTraductionRecupererLesNouveauxNoms
        Call RemplacerEtSupprimerNoms
    End Sub
    J'ai retrouvé ton code initial de l'époque... je l'avais adapté légèrement.
    Et il marchait même avec cette fameuse ligne "Cible = Range(TableauNoms(i)).Name" !


    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
    Sub ChangerNomCellule_CodeOEKN()
     
        Dim Nom, TableauNoms(), i As Integer
        Dim NewNom As String
     
      ' Stocke les noms du Workbook actif dans un tableau
        i = 0
        For Each Nom In ActiveWorkbook.Names
             ReDim Preserve TableauNoms(i)
             TableauNoms(i) = Nom.Name
             i = i + 1
        Next
     
        For i = 0 To UBound(TableauNoms)
     
                  Cible = Range(TableauNoms(i)).Name
     
                ' Permet à l'utilisateur de spécifier le nouveau nom
                  NewNom = InputBox("Ancien nom : " & TableauNoms(i) & vbCr & "Saisir le nouveau nom : ")
     
                  If Not Trim(NewNom) = "" Then _
                     ' Remplace l'ancien nom présent dans les cellules du workbook actif
                       Cells.Replace What:=TableauNoms(i), Replacement:=NewNom, LookAt:=xlPart
                     ' Supprime l'ancien nom
                       Range(TableauNoms(i)).Name.Delete
                     ' Renomme la plage initiale en lui affectant la même adresse
                       Range(Cible).Name = NewNom
                  End If
        Next
     
    End Sub

    Là j'essaye juste de faire que :
    1) certains noms de la colonne 1 (en anglais) sont à changer par les noms de la colonne 3 (en français) en associant à ces nouveaux noms (en français) la même adresse que celle qu'avait le nom en anglais, puis supprimer le nom de la colonne 1 (anglais),
    2) certains noms de la colonne 1 (en anglais) sont uniquement à supprimer lorsque la colonne 3 contient "X".

    Grrrrr....

  10. #10
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    Bonjour,

    si j'ai tout compris

    dans un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim anciennom() as variant, nouveaunom as variant
    ensuite ton code ou tu en as besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub ApresNettoyageEtTraductionRecupererLesNouveauxNoms()
          anciennom = Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Range("A5:A" & Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Range("A5").end(xldown).row).value
          nouveaunom = Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Range("C5:C" & Workbooks("ListeVariablesInutiles.xls").Worksheets("ListePourTraductionSpreadsheet").Range("A5").end(xldown).row).value
    end sub
    normalement tes 2 tables sont chargées
    pour le bornage des tables; utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim i as long
    for i = lbound(anciennom) to ubound(anciennom)
    oups: edit, bounjour à tous, il est lent le wil aujourd'hui
    Wilfried

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Teste ça, pour moi c'est plus clair
    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
    Sub RemplacerEtSupprimerNoms()
    Dim i, j As Integer
    Dim Cible As String
    Dim CL1 as workbook
        Set CL1 = Activeworkbook
     
        For i = 1 To UBound(TableauDesNoms)
            ' On met en correspondance l'ancien et le nouveau nom qui est destiné à le remplacer
            Cible = CL1 .Names(TableauDesNoms(i)).RefersTo
            If TableauDesNouveauxNoms(i) <> "X" Then
                ' Pour chacune des feuilles du workbook actif, remplace l'ancien nom par le nouveau
                For j = 2 To Sheets.Count
                    Sheets(j).Cells.Replace What:=TableauDesNoms(i), Replacement:=TableauDesNouveauxNoms(i), LookAt:=xlPart
                Next j
                ' Supprime ensuite l'ancien nom
                CL1.Names(TableauDesNoms(i)).Delete
                ' et renomme la plage initiale en lui affectant la même adresse
                CL1.Names.Add Name:=TableauDesNouveauxNoms(i), RefersTo:=Cible
              Else
                ' Supprime le nom inutilisé du workbook
                CL1.Names(TableauDesNoms(i)).Delete
            End If
     
        Next i
    End Sub
    Pas testé... Tu peux faire ça pour moi ?
    A+

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut Le code dans son ensemble...
    Allo wilfried_42

    C'est vrai qu'en relisant, je me dis que ça doit pas être simple à lire.

    Rappel du contexte : Traduction complète en français d'un spreadsheet de plusieurs feuilles écrit en anglais. Cela inclut donc également le nom des champs nommés, et là est mon problème...

    Appelons le spreadsheet à traduire : Anglais.xls et son correspondant français : Francais.xls.

    Alors voilà :

    1) À partir du fichier Anglais.xls, j'ai créé un fichier autre fichier excel "ListeVariables.xls" qui contient une feuille intitulée "ListePourTraductionSpreadsheet" (je n'ai pas inclu ce code, il marche très bien et ne servira pas ici).

    2) Dans la feuille "ListePourTraductionSpreadsheet" du classeur "ListeVariables.xls" :
    - la colonne 1 (à partir de la ligne 5) contient les noms de l'ensemble des cellules nommées d'un autre fichier excel (noms en anglais)
    - la colonne 2 contient (en correspondance) l'adresse des cellules nommées issues du fichier xl anglais
    - la colonne 3 contient (tjrs en correspondance bien sûr) le nom en français avec lequel je souhaite renommer ces champs (ou cellules nommées). Certaines des valeurs de la colonne 3 ne contiennent qu'un "X" car en fait ces cellules (ou champs) nommé(e)s sont inutilisés dans le spreadsheet, j'ai donc décidé de les supprimer dans le classeur traduit (francais.xls).

    Maintenant le code complet pour faire cela (et qui me renvoit cette foutue erreur)...

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Dim TableauDesNoms(), TableauDesNouveauxNoms() As Variant
    Sub ApresNettoyageEtTraductionRecupererLesNouveauxNoms()
     
      ' Cette procédure permet de stocker les nouveaux noms (traduction des anciens)
      ' dans un tableau en les lisant depuis la feuille "CellulesNommées" où ils sont écrits
     
        Dim i As Integer
     
        i = 5   ' pour la ligne où les noms commencent
        While Workbooks("ListeVariables.xls").Worksheets("ListePourTraductionSpreadsheet").Cells(i, 1).Value <> ""
            ReDim Preserve TableauDesNoms(i - 4)
            ReDim Preserve TableauDesNouveauxNoms(i - 4)
            TableauDesNoms(i - 4) = Workbooks("ListeVariables.xls").Worksheets("ListePourTraductionSpreadsheet").Cells(i, 1).Value
            TableauDesNouveauxNoms(i - 4) = Workbooks("ListeVariables.xls").Worksheets("ListePourTraductionSpreadsheet").Cells(i, 3).Value
          ' MsgBox i - 4 & " : " & TableauDesNoms(i - 4) & " --> " & TableauDesNouveauxNoms(i - 4)
            i = i + 1
        Wend
     
    End Sub
     
    Sub RemplacerEtSupprimerNoms()
     
        Dim AncienNom, NouveauNom As String
        Dim i, j As Integer
        Dim Cible As String
     
        For i = 1 To UBound(TableauDesNoms)
     
          ' On met en correspondance l'ancien et le nouveau nom qui est destiné à le remplacer
            AncienNom = TableauDesNoms(i)
            NouveauNom = TableauDesNouveauxNoms(i)
          ' MsgBox "Start : " & AncienNom & " --> " & NouveauNom
            Cible = Range(AncienNom).Name
     
     
            If NouveauNom <> "X" Then
              ' Pour chacune des feuilles du workbook actif, remplace l'ancien nom par le nouveau
                For j = 2 To Sheets.Count
                    Workbooks("Francais.xls").Sheets(j).Cells.Replace What:=AncienNom, Replacement:=NouveauNom, LookAt:=xlPart
                  ' MsgBox Sheets(j).Name
                Next j
              ' Supprime ensuite l'ancien nom
                Range(AncienNom).Name.Delete
              ' et renomme la plage initiale en lui affectant la même adresse
                Range(Cible).Name = NouveauNom
            Else
              ' Supprime la variable inutilisée du workbook
                Range(AncienNom).Name.Delete
            End If
     
        Next i
     
    End Sub
    Sub ProgrammePrincipal()
        Call ApresNettoyageEtTraductionRecupererLesNouveauxNoms
        Call RemplacerEtSupprimerNoms
    End Sub

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Re OUSKN

    Non, ça ne fonctionne pas.

    Le programme stop sur la 1ère occurence de cible, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cible = CL1 .Names(TableauDesNoms(i)).RefersTo
    en indiquant :
    erreur 1004 : erreur définie par l'application ou par l'objet

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par Froggy
    Le programme stop sur la 1ère occurence de cible, soit :
    Cible = CL1 .Names(TableauDesNoms(i)).RefersTo
    C'est que le nom n'existe pas dans le classeur.
    Avant cette ligne, place un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox TableauDesNoms(i)
    et vérifie son existence dans le classeur.
    Bonne soirée

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    C'est en plein ça...
    Ça fait partie de noms que j'ai déjà supprimé soit manuellement soit lors de tests.

    Comment je fais pour gérer cette situation et que ça ne plante pas ?

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour corriger le pb, soit tu recrées le tableau avec le code que je t'ai déjà donné corrigé : J'ai volontairement commencé le tableau à 1 car la boucle dans ton code commence à 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Nom, TableauDesNoms(), i as integer
        i = 1
        For Each Nom In ActiveWorkbook.Names
            Redim Preserve TableauDesNoms(i)
            TableauDesNoms(i) = Nom.name
            i = i + 1   ' ajouté par zaza, sinon ton tableau n'aura qu'une donnée...
        Next
    Soit tu mets une gestion d'erreur avant le If, que tu clos après end if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        On error resume next
            If NouveauNom <> "X" Then
              ' Pour chacune des feuilles du workbook actif, remplace l'ancien nom par le nouveau
              '...
              'inchangé
              '...
              ' Supprime la variable inutilisée du workbook
                Range(AncienNom).Name.Delete
            End If
        On error goto 0
    Bonne nuit

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut [VB-EXCEL2003] Noms de cellules locaux et globaux
    Je travaille sur un classeur où j'ai 2 types de nom de cellules :

    1) ceux que j'appelerai "Globaux" qui sont définis pour le classeur au complet et apparaissent dans toutes les feuilles de calculs (lorsque l'on clique sur la flèche de la liste déroulante située en A1); et

    2) ceux que j'appelerai "Locaux" qui sont définis sur une feuille uniquement (on les voit apparaître sur le menu déroulant A1 de la feuille en question, mais pas ailleurs dans le classeur).

    Lorsque l'on obtient la liste des cellules nommées par le code suivant, TOUS les noms sont listés et ceux spécifiques à une feuille sont précédés du nom de la feuille suivi d'un point d'exclamation (exemple : Feuil1!NomCrééIci) alors qu'un nom global s'écrira "NomGlobal".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub ListerToutesLesCellulesNomméesAvecLeurAdresse()
     
        Set NewSheet = Worksheets.Add
     
        i = 1
        For Each nm In ActiveWorkbook.Names
            NewSheet.Cells(i, 1).Value = nm.Name
            NewSheet.Cells(i, 2).Value = "'" & nm.RefersTo
            i = i + 1
        Next
     
        NewSheet.Columns("A:B").AutoFit
     
    End Sub
    Problème :
    Je cherche à renommer / supprimer des noms de façon automatisée.
    Pour les noms "globaux", pas de problème, mais pour les noms "locaux" même en essayant d'activer la feuille où ils sont, ça ne marche pas. Le code que j'utilise actuellement 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub RemplacerEtSupprimerNomsOEKN()
     
        Dim i, j As Integer
        Dim Cible, PathName, FileName, FileToWorkWith, FeuilleOuNomCellule As String
        Dim Classeur As Workbook
        Dim Feuille As Worksheet
     
    ' S'assurer que le nom à traiter est bien dans le workbook
    ' Voir pour les noms de cellules spécifiques à une feuille ???
     
      ' Chemin d'accès et Nom du fichier à traiter
        PathName = "C:\Data\"
        FileName = "DataTest.xls"
        FileToWorkWith = PathName & FileName
     
      ' S'assurer que le workbook à traiter est ouvert
      ' S'assurer que c'est lui qui est le workbook actif
     
        MsgBox IsFileOpen(FileToWorkWith)
        If IsFileOpen(FileToWorkWith) _
        Then
          ' Afficher un message indiquant que le fichier est ouvert et actif.
            MsgBox FileName & " : " & "déjà ouvert et actif !"
        Else
          ' Afficher un message indiquant que le fichier n'était pas ouvert
          ' qu'il va être ouvert et activé
            MsgBox FileName & " : " & "va être ouvert !"
            Workbooks.Open FileToWorkWith
        End If
     
      ' Comme le fichier est ouvert et en mémoire, plus besoin du pathway, donc
      ' on désigne le fichier sur lequel on va travailler, uniquement par son nom
      ' sans intégrer le pathway !!!
        Workbooks(FileName).Activate
        Set Classeur = ActiveWorkbook
     
        For i = 1 To UBound(TableauDesNoms)
     
          ' On met en correspondance l'ancien et le nouveau nom qui est destiné à le remplacer
            MsgBox TableauDesNoms(i)
     
          ' Vérifier si le nom comprend le nom d'une feuille du classeur
          ' en vérifiant la présence du caractère "!" dans la chaine de caractère
          ' du nom traité
     
            If InStr(1, TableauDesNoms(i), "!") > 0 Then
                FeuilleOuNomCellule = Left(TableauDesNoms(i), InStr(1, TableauDesNoms(i), "!") - 1)
                MsgBox FeuilleOuNomCellule
                Workbooks(FileName).Worksheets(FeuilleOuNomCellule).Activate
                Cible = Classeur.Names(TableauDesNoms(i)).RefersTo
            Else
                Cible = Classeur.Names(TableauDesNoms(i)).RefersTo
            End If
     
            If TableauDesNouveauxNoms(i) <> "X" Then
              ' Pour chacune des feuilles du workbook actif, remplace l'ancien nom par le nouveau
                For j = 2 To Sheets.Count
                    Sheets(j).Cells.Replace What:=TableauDesNoms(i), Replacement:=TableauDesNouveauxNoms(i), LookAt:=xlPart
                Next j
              ' Supprime ensuite l'ancien nom
                Classeur.Names(TableauDesNoms(i)).Delete
              ' et renomme la plage initiale en lui affectant la même adresse
                Classeur.Names.Add Name:=TableauDesNouveauxNoms(i), RefersTo:=Cible
              Else
              ' Supprime le nom inutilisé du workbook
                Classeur.Names(TableauDesNoms(i)).Delete
            End If
     
        Next i
     
    End Sub
    Ça plante à la ligne :
    Cible = Classeur.Names(TableauDesNoms(i)).RefersTo

    Pouvez-vous m'aider ?
    Merci

  18. #18
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Bonjour,

    Déjà, à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dim i, j As Integer
        Dim Cible, PathName, FileName, FileToWorkWith, FeuilleOuNomCellule As String
    Il serait préférable de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dim i As Integer, j As Integer
        Dim Cible As String, PathName As String, FileName As String, FileToWorkWith As String, FeuilleOuNomCellule As String
    Afin de t'éviter d'avoir du variant partout (i,Cible, PathName, FileName et FileToWorkWith sont en variant avec ta définition)

    Ensuite, nulle part je n'ai vu la définition de TableauDesNoms ()
    Ce qui n'aide pas !

    Enfin, as-tu tenté un débogage et un contrôle de ce que renvoient :
    TableauDesNoms(i)
    et
    Classeur.Names(TableauDesNoms(i)).RefersTo
    (dans la fenêtre des espions, par exemple)
    ???

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello Froggy,
    J'ai fusionné les deux discussions afin que tu n'aies pas à tout ré-expliquer

    Citation Envoyé par Maxence HUBICHE le 21/09/2008
    Ensuite, nulle part je n'ai vu la définition de TableauDesNoms
    Question que je t'avais déjà posée le 18/09 et à laquelle tu avais répondu le même jour
    Citation Envoyé par Froggy
    Les tableaux sont déclarés dans la partie générale selon :
    Dim TableauDesNoms(), TableauDesNouveauxNoms() As Variant
    Pour répondre à ta question, les noms de cellules ou de plages de cellules sont des propriétés de l'objet Workbook.
    Jète un oeil dans l'aide en ligne à "Names, propriété", tout ça est bien expliqué.
    Mais tu peux repérer ou utiliser les noms de la feuille :
    - Pour placer un nom dans une feuille précise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Names.Add Name:="UnNom", RefersTo:="feuil1!A1:B1"
    - Pour connaître le nom de la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adres = ActiveWorkbook.Names("UnNom").RefersTo
    qui te donne le range avec le nom de la feuille dans laquelle se trouve le nom => "feuil1!A1:B1"

    - Enfin, pour avoir le nom de la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LaFeuille = Split(Adres,"!")(0)
    Ceci dit, pour l'emploi que tu en fais, tu n'as en principe pas besoin de connaître le nom de la feuille si tu n'utilises pas de "Select" "Selection" ou "Activate", autant de propriétés dont tu n'as pas besoin.

    Bonne journée

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci des messages précédents.
    Mais bon, je chercher encore... grrrrrr

    En reprenant la logique des programmes précédents, est-ce que j'ai le droit d'écrire les instructions suivantes :

    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
    If InStr(1, TableauDesNoms(i), "!") > 0 Then
       FeuilleOuNomCellule = Left(TableauDesNoms(i), InStr(1, TableauDesNoms(i), "!") - 1)
       AncienNom = Left(InStr(1, TableauDesNoms(i), "!") + 1, Len(TableauDesNoms(i)))
       NouveauNom = Left(InStr(1, TableauDesNouveauxNoms(i), "!") + 1, Len(TableauDesNouveauxNoms(i)))
       MsgBox FeuilleOuNomCellule & " // " & AncienNom & " // " & NouveauNom
       Cible = Workbooks(FileName).Sheets(FeuilleOuNomCellule).Names(AncienNom).RefersTo
       Sheets(FeuilleOuNomCellule).Cells.Replace What:=AncienNom, Replacement:=NouveauNom, LookAt:=xlPart
       Sheets(FeuilleOuNomCellule).Names(AncienNom).Delete
       Sheets(FeuilleOuNomCellule).Names.Add Name:=NouveauNom, RefersTo:=Cible
    Else
       Cible = Classeur.Names(TableauDesNoms(i)).RefersTo
    ' Pour chacune des feuilles du workbook actif, remplace l'ancien nom par le nouveau
       For j = 1 To Sheets.Count
          Sheets(j).Cells.Replace What:=TableauDesNoms(i),   replacement:=TableauDesNouveauxNoms(i), LookAt:=xlPart
       Next j
    ' Supprime ensuite l'ancien nom
       Classeur.Names(TableauDesNoms(i)).Delete
    ' et renomme la plage initiale en lui affectant la même adresse
       Classeur.Names.Add Name:=TableauDesNouveauxNoms(i), RefersTo:=Cible
    End If
    Sachant que Classeur est défini au début du programme par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Classeur As Workbook
    Puis par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks(FileName).Activate
    Set Classeur = ActiveWorkbook
    Parce que dans l'aide sur Names, il est indiqué également que les propriétés valent au niveau worksheet aussi (extrait de l'aide) :
    Pour un objet Worksheet, cette propriété renvoie une collection Names qui représente tous les noms spécifiques aux feuilles de calcul (noms définis avec le préfixe "WorksheetName!").

    Ça devient vraiment critique ce souci.
    Alors un grand merci d'avance pour l'aide.

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

Discussions similaires

  1. [VBA] nom de cellule
    Par getea85 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/08/2006, 10h51
  2. [Excel] Chercher un nom de cellule dans des formules
    Par conconbrr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2006, 17h43
  3. Réponses: 4
    Dernier message: 30/05/2006, 17h21
  4. [Excel]Suite de noms de cellules
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/05/2006, 13h16
  5. [VBA-E]attribution d'un nom à une cellule
    Par capedam dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/02/2006, 05h22

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