Modification d'un nom

Le
Patrick
Bonjour,

J'aimerais créer une macro qui permettrait de modifier un nom de plage de
cellules et, surtout, qui permette d'appliquer ce changement dans toutes les
cellules qui font référence à ce nom.

Pour la 1e partie, je vois très comment faire mais pour la suite je ne vois
pas trop comment faire ? Avez-vous une idée ?

Merci pour votre aide.

--
Patrick
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #20529171
Bonjour Patrick,

Suppose que dans ton classeur que tu as un nom (plage nommée) "Toto" et
que tu veuilles remplacer ce nom "toto" par "titi"

Voici un petit exemple de code :
'-------------------------------------
Sub test()
Dim Rg As Range, X As String
Dim Sh As Worksheet
On Error Resume Next
Range("Toto").Name = "Titi"
ThisWorkbook.Names("Toto").Delete
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find("toto", LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
adr = Rg.Address
Do
X = UCase(Rg.Formula)
X = Application.Substitute(X, UCase("toto"), "titi")
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address <> adr
End If
End With
Next
End Sub
'-------------------------------------



"Patrick" discussion :
Bonjour,

J'aimerais créer une macro qui permettrait de modifier un nom de plage de
cellules et, surtout, qui permette d'appliquer ce changement dans toutes les
cellules qui font référence à ce nom.

Pour la 1e partie, je vois très comment faire mais pour la suite je ne vois
pas trop comment faire ? Avez-vous une idée ?

Merci pour votre aide.

--
Patrick
Patrick
Le #20529811
Bonjour,

Merci pour ce code. Mais qu'arrive-t-il si le classeur contient d'autres
noms contenant "toto" ("toto1", "toto2", ...). Est-ce que le code qui
remplace "toto" par "titi" dans les formules ne risque pas de modifier celles
où il y a "toto1" en mettant "titi1", alors que "titi1" n'existe pas ?

Merci.

--
Patrick


"michdenis" wrote:

Bonjour Patrick,

Suppose que dans ton classeur que tu as un nom (plage nommée) "Toto" et
que tu veuilles remplacer ce nom "toto" par "titi"

Voici un petit exemple de code :
'-------------------------------------
Sub test()
Dim Rg As Range, X As String
Dim Sh As Worksheet
On Error Resume Next
Range("Toto").Name = "Titi"
ThisWorkbook.Names("Toto").Delete
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find("toto", LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
adr = Rg.Address
Do
X = UCase(Rg.Formula)
X = Application.Substitute(X, UCase("toto"), "titi")
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address <> adr
End If
End With
Next
End Sub
'-------------------------------------



"Patrick" discussion :
Bonjour,

J'aimerais créer une macro qui permettrait de modifier un nom de plage de
cellules et, surtout, qui permette d'appliquer ce changement dans toutes les
cellules qui font référence à ce nom.

Pour la 1e partie, je vois très comment faire mais pour la suite je ne vois
pas trop comment faire ? Avez-vous une idée ?

Merci pour votre aide.

--
Patrick



michdenis
Le #20530371
Si tu veux remplacer le "NOM" toto1 par le nom "denis"
il y a ce qui suit :

Si tu as une collection de nom "toto", "toto1", "toto2"....
pour remplacer le premier nom "toto", il va falloir modifier
la procédure afin de s'assurer d'isoler correctement le bon
nom.

'---------------------------------------
Sub test()
Dim Rg As Range, X As String, Adr As String
Dim Sh As Worksheet, Plage As String
On Error Resume Next

'Récupération de l'adresse de la plage
'représentée par "toto1"

X = ThisWorkbook.Names("toto1").RefersTo
Plage = Right(X, Len(X) - 1)

'Attribution du nouveau nom à la plage
Range(Adr).Name = "denis"

'Suppression du NOM "Toto"
ThisWorkbook.Names("Toto1").Delete

'Boucle dans toutes les feuilles du classeur pour
'faire la substitution du nom "toto" par l'adresse
'de la plage que représentait "toto"
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find("toto1", LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
Adr = Rg.Address
Do
X = UCase(Rg.Formula)
y = Rg.NumberFormat
X = Application.Substitute(X, UCase("toto1"), Plage)
Rg.NumberFormat = y
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address <> Adr
End If
' Appliquer le nouveau nom à l'ensemble de la feuille
Sh.Cells.ApplyNames Names:="denis", IgnoreRelativeAbsolute:=True, _
UseRowColumnNames:=True, OmitColumn:=True, OmitRow:=True, Order:=1, _
AppendLast:úlse

End With
Next

End Sub
'---------------------------------------



"Patrick" discussion :
Bonjour,

Merci pour ce code. Mais qu'arrive-t-il si le classeur contient d'autres
noms contenant "toto" ("toto1", "toto2", ...). Est-ce que le code qui
remplace "toto" par "titi" dans les formules ne risque pas de modifier celles
où il y a "toto1" en mettant "titi1", alors que "titi1" n'existe pas ?

Merci.

--
Patrick


"michdenis" wrote:

Bonjour Patrick,

Suppose que dans ton classeur que tu as un nom (plage nommée) "Toto" et
que tu veuilles remplacer ce nom "toto" par "titi"

Voici un petit exemple de code :
'-------------------------------------
Sub test()
Dim Rg As Range, X As String
Dim Sh As Worksheet
On Error Resume Next
Range("Toto").Name = "Titi"
ThisWorkbook.Names("Toto").Delete
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find("toto", LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
adr = Rg.Address
Do
X = UCase(Rg.Formula)
X = Application.Substitute(X, UCase("toto"), "titi")
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address <> adr
End If
End With
Next
End Sub
'-------------------------------------



"Patrick" discussion :
Bonjour,

J'aimerais créer une macro qui permettrait de modifier un nom de plage de
cellules et, surtout, qui permette d'appliquer ce changement dans toutes les
cellules qui font référence à ce nom.

Pour la 1e partie, je vois très comment faire mais pour la suite je ne vois
pas trop comment faire ? Avez-vous une idée ?

Merci pour votre aide.

--
Patrick



Patrick
Le #20532331
Cela fonctionne bien mais il y a un problème si le classeur contient les noms
"toto", "toto1" et "toto2" qu'on renomme seulement le nom "toto" (pas "toto1"
et "toto2"). Je sais que c'est un peu tiré par les cheveux mais pour mon
besoin les noms sont plus compliqués mais il pourrait y avoir de telles
similitudes dans leurs noms.

Merci.

--
Patrick


"michdenis" wrote:

Si tu veux remplacer le "NOM" toto1 par le nom "denis"
il y a ce qui suit :

Si tu as une collection de nom "toto", "toto1", "toto2"....
pour remplacer le premier nom "toto", il va falloir modifier
la procédure afin de s'assurer d'isoler correctement le bon
nom.

'---------------------------------------
Sub test()
Dim Rg As Range, X As String, Adr As String
Dim Sh As Worksheet, Plage As String
On Error Resume Next

'Récupération de l'adresse de la plage
'représentée par "toto1"

X = ThisWorkbook.Names("toto1").RefersTo
Plage = Right(X, Len(X) - 1)

'Attribution du nouveau nom à la plage
Range(Adr).Name = "denis"

'Suppression du NOM "Toto"
ThisWorkbook.Names("Toto1").Delete

'Boucle dans toutes les feuilles du classeur pour
'faire la substitution du nom "toto" par l'adresse
'de la plage que représentait "toto"
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find("toto1", LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
Adr = Rg.Address
Do
X = UCase(Rg.Formula)
y = Rg.NumberFormat
X = Application.Substitute(X, UCase("toto1"), Plage)
Rg.NumberFormat = y
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address <> Adr
End If
' Appliquer le nouveau nom à l'ensemble de la feuille
Sh.Cells.ApplyNames Names:="denis", IgnoreRelativeAbsolute:=True, _
UseRowColumnNames:=True, OmitColumn:=True, OmitRow:=True, Order:=1, _
AppendLast:úlse

End With
Next

End Sub
'---------------------------------------



"Patrick" discussion :
Bonjour,

Merci pour ce code. Mais qu'arrive-t-il si le classeur contient d'autres
noms contenant "toto" ("toto1", "toto2", ...). Est-ce que le code qui
remplace "toto" par "titi" dans les formules ne risque pas de modifier celles
où il y a "toto1" en mettant "titi1", alors que "titi1" n'existe pas ?

Merci.

--
Patrick


"michdenis" wrote:

> Bonjour Patrick,
>
> Suppose que dans ton classeur que tu as un nom (plage nommée) "Toto" et
> que tu veuilles remplacer ce nom "toto" par "titi"
>
> Voici un petit exemple de code :
> '-------------------------------------
> Sub test()
> Dim Rg As Range, X As String
> Dim Sh As Worksheet
> On Error Resume Next
> Range("Toto").Name = "Titi"
> ThisWorkbook.Names("Toto").Delete
> For Each Sh In ThisWorkbook.Worksheets
> With Sh.Cells
> Set Rg = .Find("toto", LookIn:=xlFormulas, lookat:=xlPart)
> If Not Rg Is Nothing Then
> adr = Rg.Address
> Do
> X = UCase(Rg.Formula)
> X = Application.Substitute(X, UCase("toto"), "titi")
> Rg.Formula = X
> Set Rg = .FindNext(Rg)
> Loop Until Rg Is Nothing Or Rg.Address <> adr
> End If
> End With
> Next
> End Sub
> '-------------------------------------
>
>
>
> "Patrick" > discussion :
> Bonjour,
>
> J'aimerais créer une macro qui permettrait de modifier un nom de plage de
> cellules et, surtout, qui permette d'appliquer ce changement dans toutes les
> cellules qui font référence à ce nom.
>
> Pour la 1e partie, je vois très comment faire mais pour la suite je ne vois
> pas trop comment faire ? Avez-vous une idée ?
>
> Merci pour votre aide.
>
> --
> Patrick
>


michdenis
Le #20534901
Tu colles ce qui suit dans un module standard et
tu prends soin de définir les variables.

Je n'ai fait que des tests sommaires...

'---------------------------------------
Sub test()
Dim Rg As Range, X As String, Adr As String
Dim Sh As Worksheet, Plage As String
Dim LeNom As String, NouveauNom As String

'******** Variables à définir ***********
'Définir le nom de la plage à modifier
LeNom = "toto"

'Définir le nouveau nom
NouveauNom = "Denis"
'****************************************

'Récupération de refersto
X = ThisWorkbook.Names(LeNom).RefersTo
'Création du nouveau nom
'Si l'étendue de la plage est différente,
'il faut modifier la valeur de X
ThisWorkbook.Names.Add NouveauNom, X

'Suppression du NOM "Toto"
ThisWorkbook.Names(LeNom).Delete

'Boucle dans toutes les feuilles du classeur pour
'faire la substitution du nom "toto" par l'adresse
'de la plage que représentait "toto"
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find(LeNom, LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
Adr = Rg.Address
Do
X = UCase(Rg.Formula)
y = Rg.NumberFormat
X = CheckNom(X, LeNom, NouveauNom)
Rg.NumberFormat = y
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address = Adr
End If
End With
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

'---------------------------------------
Function CheckNom(Laformule As String, _
LeNom As String, Plage As String)

Dim CarBefore As String, CarAfter As String
Dim P As Integer, K As Integer
Dim A As Integer, Nb As Integer

Nb = Len(Laformule)
A = 1
Do While A <= Nb - 1

P = InStr(A, Laformule, LeNom, vbTextCompare)
If P <> 0 Then
CarBefore = Mid(Laformule, P - 1, 1)
CarAfter = Mid(Laformule, P + Len(LeNom), 1)
'Les 2 Select Case s'assure qu'il n'y a pas
'd'autres lettres de l'alphabet immédiatement
'avant la chaîne du nom ainsi qu'un chiffre
'après la chaîne du nom. De même, on exclut
'le caractère " avec le 34
Select Case Asc(CarBefore)
Case 34, 97 To 122, 65 To 90
Case Else
Select Case Asc(CarAfter)
Case 34, 48 To 57, 65 To 90, 97 To 122
Case Else
Laformule = Left(Laformule, P - 1) & _
Plage & Right(Laformule, _
Nb - P - Len(LeNom) + 1)
A = P + Len(Plage) + 1
K = 1
End Select
End Select
If K = 1 Then
K = 0
Else
A = P + Len(LeNom) + 1
End If
Nb = Len(Laformule)
Else
CheckNom = Laformule
Exit Do
End If
Loop
CheckNom = Laformule
End Function
'---------------------------------------




"Patrick" discussion :
Cela fonctionne bien mais il y a un problème si le classeur contient les noms
"toto", "toto1" et "toto2" qu'on renomme seulement le nom "toto" (pas "toto1"
et "toto2"). Je sais que c'est un peu tiré par les cheveux mais pour mon
besoin les noms sont plus compliqués mais il pourrait y avoir de telles
similitudes dans leurs noms.

Merci.

--
Patrick


"michdenis" wrote:

Si tu veux remplacer le "NOM" toto1 par le nom "denis"
il y a ce qui suit :

Si tu as une collection de nom "toto", "toto1", "toto2"....
pour remplacer le premier nom "toto", il va falloir modifier
la procédure afin de s'assurer d'isoler correctement le bon
nom.

'---------------------------------------
Sub test()
Dim Rg As Range, X As String, Adr As String
Dim Sh As Worksheet, Plage As String
On Error Resume Next

'Récupération de l'adresse de la plage
'représentée par "toto1"

X = ThisWorkbook.Names("toto1").RefersTo
Plage = Right(X, Len(X) - 1)

'Attribution du nouveau nom à la plage
Range(Adr).Name = "denis"

'Suppression du NOM "Toto"
ThisWorkbook.Names("Toto1").Delete

'Boucle dans toutes les feuilles du classeur pour
'faire la substitution du nom "toto" par l'adresse
'de la plage que représentait "toto"
For Each Sh In ThisWorkbook.Worksheets
With Sh.Cells
Set Rg = .Find("toto1", LookIn:=xlFormulas, lookat:=xlPart)
If Not Rg Is Nothing Then
Adr = Rg.Address
Do
X = UCase(Rg.Formula)
y = Rg.NumberFormat
X = Application.Substitute(X, UCase("toto1"), Plage)
Rg.NumberFormat = y
Rg.Formula = X
Set Rg = .FindNext(Rg)
Loop Until Rg Is Nothing Or Rg.Address <> Adr
End If
' Appliquer le nouveau nom à l'ensemble de la feuille
Sh.Cells.ApplyNames Names:="denis", IgnoreRelativeAbsolute:=True, _
UseRowColumnNames:=True, OmitColumn:=True, OmitRow:=True, Order:=1, _
AppendLast:úlse

End With
Next

End Sub
'---------------------------------------



"Patrick" discussion :
Bonjour,

Merci pour ce code. Mais qu'arrive-t-il si le classeur contient d'autres
noms contenant "toto" ("toto1", "toto2", ...). Est-ce que le code qui
remplace "toto" par "titi" dans les formules ne risque pas de modifier celles
où il y a "toto1" en mettant "titi1", alors que "titi1" n'existe pas ?

Merci.

--
Patrick


"michdenis" wrote:

> Bonjour Patrick,
>
> Suppose que dans ton classeur que tu as un nom (plage nommée) "Toto" et
> que tu veuilles remplacer ce nom "toto" par "titi"
>
> Voici un petit exemple de code :
> '-------------------------------------
> Sub test()
> Dim Rg As Range, X As String
> Dim Sh As Worksheet
> On Error Resume Next
> Range("Toto").Name = "Titi"
> ThisWorkbook.Names("Toto").Delete
> For Each Sh In ThisWorkbook.Worksheets
> With Sh.Cells
> Set Rg = .Find("toto", LookIn:=xlFormulas, lookat:=xlPart)
> If Not Rg Is Nothing Then
> adr = Rg.Address
> Do
> X = UCase(Rg.Formula)
> X = Application.Substitute(X, UCase("toto"), "titi")
> Rg.Formula = X
> Set Rg = .FindNext(Rg)
> Loop Until Rg Is Nothing Or Rg.Address <> adr
> End If
> End With
> Next
> End Sub
> '-------------------------------------
>
>
>
> "Patrick" > discussion :
> Bonjour,
>
> J'aimerais créer une macro qui permettrait de modifier un nom de plage de
> cellules et, surtout, qui permette d'appliquer ce changement dans toutes les
> cellules qui font référence à ce nom.
>
> Pour la 1e partie, je vois très comment faire mais pour la suite je ne vois
> pas trop comment faire ? Avez-vous une idée ?
>
> Merci pour votre aide.
>
> --
> Patrick
>


Publicité
Poster une réponse
Anonyme