Trouver le nom d'une plage nommée
Bonjour,
je cherche à connaître le nom de la plage nommée dans laquelle je me situe. Pour faire ça, j'utilise le code :
Dim nomListe As String, ListeR As Range
Set ListeR = Range(Cells(2, Target.Column), Cells(Target.Cells.End(xlDown).Row, Target.Column))
nomListe = ListeR.Name.NameSi ma liste Excel est définie de façon fixe, mon code fonctionne, par exemple :
[MaListeExcel]=Listes!$A$2:$A$6 (=nomListe)
Par contre si ma liste Excel est définie en utilisant la fonction DECALER(), je génère une erreur d'éxécution 1004 (erreur d'éxécution 1004 définie par l'application ou par l'objet):
[MaListeExcel]=DECALER(Listes!$A$2;0;0;NBVAL(Listes!$A:$A)-1)
Vous auriez une idée,
Merci beaucoup
Bonjour,
voilà un code à mettre en remplacement du début de ton code actuel.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nomListe As String, avant As String, apres As String, plage As Range, Liste As Name
Dim pl As Range, c As Range, nb As Long
Dim cel As Range
If Target.Row = 1 Then Exit Sub
On Error Resume Next
For Each Liste In ThisWorkbook.Names
Set plage = Liste.RefersToRange
For Each cel In plage
If cel.Address = Selection.Address Then
nomListe = Liste.Name
End If
Next cel
Next Liste
MsgBox nomListeA plus !
Et bien écoutes, ça marche génialement bien même si je ne comprends pas trop ton code.
D'habitude, je préfère faire des choses "moins belles" mais que je comprends
Merci encore!
Bonjour,
Un test pour détecter la plage nommée dans laquelle se trouve Target.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nomListe As Name
If Target.Row = 1 Then Exit Sub
For Each nomListe In ThisWorkbook.Names
If Not Intersect(Target, Range(nomListe.Name)) Is Nothing Then
MsgBox nomListe.Name
Exit For
End If
Next nomListe
End SubJ'y crois pas. J'ai essayé dans tous les sens de faire un truc du genre mais impossible de faire un truc qui marche...
Merci Mferrand
(re)
Je suis désolé mais j'ai un petit problème d'adaptation dans mon fichier global où il y a des listes dans tous les sens. Le code s'arrête à une liste filterdatabase! qui vient a priori des filtres (mais je n'en suis pas sûr) mais ce n'est pas ça que je cherche...
Il faudrait donc que je limite ma recherche des .Names aux seules plages que j'ai "vraiment" créées ou alors que je limite ma recherche aux listes existantes dans ma sheet active et pas à celles existantes dans tout le workbook
J'ai essayé de remplacer ce code
For Each nomListe In ThisWorkbook.Namesqui me référence bien toutes mes plages mais aussi ces filterdatabase qui (a priori) me bloquent
par
For Each nomListe In Me.Namesqui ne me référence rien du tout...
Quelle est mon erreur?
Les noms sont dans le classeur.
Il faut mettre la recherche sous gestion d'erreurs si tu as des noms qui ne sont pas des plages.
D'accord. Comment peut on faire ça?
Par exemple :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nomListe As Name
If Target.Row = 1 Then Exit Sub
On Error Resume Next
For Each nomListe In ThisWorkbook.Names
If Not Intersect(Target, Range(nomListe.Name)) Is Nothing Then
If Err.Number <> 0 Then
Err.Clear: GoTo Suite
End If
MsgBox nomListe.Name
Exit For
End If
Suite:
Next nomListe
On Error GoTo 0
End SubMerci MFerrand et Braters,
mais quand je sors de mon petit fichier exemple, je n'arrive pas à faire quelque chose qui marche. Vous trouverez éventuellement mon fichier réel en pièces jointes avec dans l'onglet "parametres" le code suivant :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'Code pour modifier dans toutes les feuilles les libelles de listes qui ont ete modifies
Dim nomListe As String, avant As String, apres As String, plage As Range, Liste As Name
Dim pl As Range, c As Range, nb As Long
Dim cel As Range
If Target.Row = 1 Then Exit Sub
On Error Resume Next
'Trouver la plage nommee dans laquelle on se situe
For Each Liste In ThisWorkbook.Names
If InStr(1, Liste.Name, "_FilterDataBase", vbTextCompare) = 0 And InStr(1, Liste.Name, "_xlfn", vbTextCompare) = 0 Then
If Not Intersect(Target, Range(Liste.Name)) Is Nothing Then
nomListe = Liste.Name
MsgBox nomListe
Exit For
End If
End If
Next Liste
'MsgBox nomListe
'Trouver la valeur precedente et la nouvelle valeur
apres = Target.Value
If apres = "" Then Exit Sub
Application.EnableEvents = False
Application.Undo
avant = Target.Value
Target = apres
Application.EnableEvents = True
'Remplacer dans chaque feuille les cellules controlees par une liste de validation l ancienne valeur par la nouvelle valeur
Dim Ws As Worksheet
For Each Ws In Sheets
MsgBox Ws.Name
Set pl = Ws.Cells.SpecialCells(xlCellTypeAllValidation)
If Not pl Is Nothing Then
For Each c In pl
If c.Validation.Formula1 = "=" & nomListe Then
If c.Value = avant Then c = apres
End If
Next c
End If
Next Ws
End SubDans l'onglet parametres, si vous modifiez un libellé, celui-ci devrait donc être modifié dans les feuilles du classeur où il est utilisé.
Par exemple, si vous modifiez "ATOL LES OPTICIENS" en Parametres.F4 par "ATOL OPTICIENS", on devrait voir le changement dans l'onglet Direct notamment en B18, B19, B20.
La liste dans laquelle on se situe lorsqu'on modifie ce libellé est la liste [Param_Regroupement] mais ce n'est pas celle-ci qui est identifiée mais [Adbook_Liste_structures], je ne sais pas pourquoi... il s'agit par contre dans l'ordre alphabétique de la première des plages nommées dans le classeur...
Merci d'avance pour votre aide éventuelle
Après des tests pour identifier le problème, c'est le "Intersect" qui donne un résultat erroné. Dés le premier nom existant de plages, la macro continue même si ce n'est pas la bonne plage...
Après examen (il a fallu trouver !!
Tu mets bien la boucle sous gestion d'erreur, mais tu ne la gères pas, et tu ne l'annules pas en sortie de boucle... Or si tu ne gères pas, tu exécutes en cas d'erreur les instructions prévues lorsque la condition est satisfaite et tu sors de la boucle, alors que la gestion d'erreur est là justement pour sauter ces instructions et poursuivre la boucle.
En la rétablissant, je note qu'il se produit nombre d'erreurs (27 je crois) avant d'arriver à un Vrai sur la condition et le message de contrôle ne s'affiche qu'une fois.
J'ai limité mon examen exclusivement à la boucle...
Ensuite si tu n'annules pas la gestion d'erreur, tu ne verras pas les erreurs éventuelles dans la suite du code, et tu risques d'avoir des effets inattendus...
Cordialement.
Merci, je comprends ce problème de gestion d'erreur qui entraîne des conséquences inattendues.
Mais je ne sais pas comment faire. Le Range(Liste) entraîne une erreur de type "La méthode Range de l'objet Worksheet a échoué" alors que Liste est bien identifée par sa plage de cellules dans Excel (plage de cellules toutes de type DECALER())
Dim nomListe As String, avant As String, apres As String, plage As Range, Liste As Name
Dim pl As Range, c As Range
Dim cel As Range
If Target.Row = 1 Then Exit Sub
'Trouver la plage nommee dans laquelle on se situe
For Each Liste In ThisWorkbook.Names
'Eliminer les noms de liste correspondant à des filterdatabase
'MsgBox "les coordonnees sont " & Target.Cells.Row & "-" & Target.Cells.Column
If InStr(1, Liste.Name, "_FilterDataBase", vbTextCompare) = 0 And InStr(1, Liste.Name, "_xlfn", vbTextCompare) = 0 And Liste.Name = "Param_Regroupement" Then
If Not Intersect(Target, Range(Liste)) Is Nothing Then
nomListe = Liste.Name
MsgBox "La liste selectionnee est " & nomListe
Exit For
End If
End If
Next ListeBonsoir,
Reprenons calmement :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nomListe As String, avant As String, apres As String, plage As Range, Liste As Name
Dim pl As Range, c As Range, cel As Range
If Target.Row = 1 Then Exit Sub
'Trouver la plage nommee dans laquelle on se situe
On Error Resume Next
For Each Liste In ThisWorkbook.Names
If Not Intersect(Target, Range(Liste.Name)) Is Nothing Then
If Err.Number <> 0 Then
Err.Clear: GoTo Suivant
End If
nomListe = Liste.Name
Exit For
End If
End If
Suivant:
Next Liste
'Vérification
MsgBox "La liste selectionnee est " & nomListe
Exit Sub 'provisoire
'suite proc.
End SubCordialement
Merci beaucoup MFerrand. Avec Vba, en se posant des questions qu'on imagine simples, on se retrouve dans des problématiques compliquées
Malheureusement, ton code me sort toujours la première liste dans l'ordre alphabétique, soit exactement ce que j'avais déjà comme problème. J'ai juste apporté une micro correction dans ton code, il y a apparemment un end if en trop.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nomListe As String, avant As String, apres As String, plage As Range, Liste As Name
Dim pl As Range, c As Range, cel As Range
If Target.Row = 1 Then Exit Sub
'Trouver la plage nommee dans laquelle on se situe
On Error Resume Next
For Each Liste In ThisWorkbook.Names
If Not Intersect(Target, Range(Liste.Name)) Is Nothing Then
If Err.Number <> 0 Then
Err.Clear: GoTo Suivant
End If
nomListe = Liste.Name
Exit For
End If
'End If
Suivant:
Next Liste
'Vérification
MsgBox "La liste selectionnee est " & nomListe
Exit Sub 'provisoire
'suite proc.
End SubUn oubli en effet... désolé !
Ceci étant quelques essais sur ton fichier de cette procédure me montre que à chaque édition-revalidation d'une cellule de ta feuille paramètres, le message me renvoie bien le nom de la plage dans laquelle j'ai édité la valeur !
Et si j'opère en dehors d'une plage, je n'ai évidemment pas de nom dans le message.
Cordialement.
Merci beaucoup M. Ferrand pour ton aide.