Nommer et renommer une plage de cellules
bonjours a tous,
voilà, je voudrais savoir si y a possibilité de nommer ou renommer un plage de cellule par une cellule.
je m'explique, j'ai un tableau avec des listes en cascade, si ces listes change ( comme c'est le cas ) je dois modifier le nom de la plage concerner pour que ces listes en cascade fonctionne.
alors je souhaiterai par exemple : que feuil1 cellule A2 = toto, A2 = blabla, etc jusqu'a A6, si cellule A2 contient le mot Plombier la plage concerné porterai le même nom , en faite je souhaite pouvoir changer le nom ma plage de cellule à volonté sans passez par le gestionnaire de nom, rien que par le contenue de la cellule A2.
j'ai cherché sur plusieurs sites et forums et je n'ai rien trouvé à ce sujet, à croire que c'est impossible à réalisé.
et si possible une explication pour chaque ligne de commande du code, pour ma compréhension et pouvoir l'adapter pour de future projets
je vous remercie d'avance de l'aide que vous pourrez m'apporter.
cordialement
Bonjour,
Sub test()
ActiveWorkbook.Names("ancien_nom").Delete
ActiveWorkbook.Names.Add Name:="nouveau_nom", RefersToR1C1:="=Feuil1!R5C3:R8C3"
End SubFaut-il commenter ?
- la première ligne efface le nom
- la seconde crée un nom et affecte une plage
j'avais pensé à un truc de ce genre.
mais ce ne fonctionne pas et je n'ai pas trouvé mon erreur.
pouvez vous m'aidé merci d'avance.
cordialement
Option Explicit
Dim Tbl(1 To 5) As String
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Nom As Name
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Intersect(Target, Range("A2:A6")) Is Nothing Then Exit Sub
Set Nom = ThisWorkbook.Names(Tbl(Target.Row))
Nom.Name = Target.Value
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Tbl(1) = Range("A2")
Tbl(2) = Range("A3")
Tbl(3) = Range("A4")
Tbl(4) = Range("A5")
Tbl(5) = Range("A6")
Bonjour,
à tester,
édit: pour modifier l'adresse de la plage de cellule d'un nom existant
ActiveWorkbook.Names("LeNom").RefersTo = Range($ adresse de la nouvelle plage de cellule)par exemple le nom "zaza" faisant référence à "=Feuil1!A1:A5"
pour changer la référence de ce nom:
ActiveWorkbook.Names("zaza").RefersTo = Range("Feuil2!B3:B10")Bonjour,
Comme je te l'ai donné sur l'autre forum, le code ci-dessous...
Dim Tbl(1 To 5) As String
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Nom As Name
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Intersect(Target, Range("A1:A5")) Is Nothing Then Exit Sub
Set Nom = ThisWorkbook.Names(Tbl(Target.Row))
Nom.Name = Target.Value
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Tbl(1) = Range("A1")
Tbl(2) = Range("A2")
Tbl(3) = Range("A3")
Tbl(4) = Range("A4")
Tbl(5) = Range("A5")
End Sub...demande à ce que les cellules A1 à A5 contiennent les noms des plages, afin d'être à jour, le tableau doit être chargé donc, j'ai utilisé "SelectionChange()" afin que cela se fasse le plus souvent possible. On peut aussi utiliser "Activate()" de la feuille pour qu'il soit alimenté dès que la feuille est affichée (ce que j'ai fait dans le fichier joint) !
Dans le classeur que je t'ai posté, les zone colorées sont les zones des différentes plages nommées, une fois que tu as changé un nom dans une des cellules A1:A5, tu sélectionnes la plage en question et tu vois bien dans la zone de nom en haut à gauche qu'elle porte bien le nouveau nom donc, je ne sais pas ce que tu attends de plus ?
Je re-poste ici le classeur où j'ai rajouté un sixième zone donc, un sixième nom :
Oups, je n'avais pas regardé ta demande sur l'autre forum
voici le code prenant en compte le décalage des noms en A2:A6 :
Dim Tbl(1 To 5) As String
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Nom As Name
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Intersect(Target, Range("A2:A6")) Is Nothing Then Exit Sub
Set Nom = ThisWorkbook.Names(Tbl(Target.Row - 1))
Nom.Name = Target.Value
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Tbl(1) = Range("A2")
Tbl(2) = Range("A3")
Tbl(3) = Range("A4")
Tbl(4) = Range("A5")
Tbl(5) = Range("A6")
End Sub
Private Sub Worksheet_Activate()
Tbl(1) = Range("A2")
Tbl(2) = Range("A3")
Tbl(3) = Range("A4")
Tbl(4) = Range("A5")
Tbl(5) = Range("A6")
End Subah tu me sauve la vie.
merci theze.
bonne journée
et dans la foulée Mister Theze, peux-tu m,expliquer son fonctionnement ligne par ligne.
pour l'adapter dans de futur projet.
merci d'avance
Voici le code commenté :
'le tableau à 5 éléments est déclaré en tête de module afin
'que sa portée (durée des valeurs en mémoire) soit de niveau classeur
'(tant qu'il est ouvert, les valeurs restent dans le tableau)
Dim Tbl(1 To 5) As String
Private Sub Worksheet_Change(ByVal Target As Range)
'déclare une variable de type objet "Name"
Dim Nom As Name
'si la cellule qui déclanche la procédure événementielle n'est pas
'seule (cas où on effectue une suppression sur plusieurs cellules) on sort
'et si la cellule est vide, on sort aussi et enfin, si la cellule
'ne se trouve pas être une des cellules de A2 à A6, sortie aussi !
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Intersect(Target, Range("A2:A6")) Is Nothing Then Exit Sub
'arrivé ici, on doit se trouver avec une cellule seule ayant une valeur
'et située dans la plage A2:A6 (l'une d'elles)
'on affecte à la variable l'ancien nom...
Set Nom = ThisWorkbook.Names(Tbl(Target.Row - 1))
'...et on le renomme
Nom.Name = Target.Value
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'idem que plus haut et ces lignes peuvent malgré tout être supprimées
'car on cherche juste à remplir le tableau avec les noms les plus récents
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
'inscrit les valeurs dans le tableau
Tbl(1) = Range("A2")
Tbl(2) = Range("A3")
Tbl(3) = Range("A4")
Tbl(4) = Range("A5")
Tbl(5) = Range("A6")
End Sub
Private Sub Worksheet_Activate()
Tbl(1) = Range("A2")
Tbl(2) = Range("A3")
Tbl(3) = Range("A4")
Tbl(4) = Range("A5")
Tbl(5) = Range("A6")
End Sub