Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Modification d'un nom

5 réponses
Avatar
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

5 réponses

Avatar
michdenis
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" a écrit dans le message de groupe de
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
Avatar
Patrick
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" a écrit dans le message de groupe de
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



Avatar
michdenis
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
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



Avatar
Patrick
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
> 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
>


Avatar
michdenis
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
> 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
>