Microsoft 365 obtenir le nom d'un tableau

rafi93

XLDnaute Occasionnel
bonjour à tous

je cherche à récupérer le nom d'un tableau sur le quel je pointe, et j'ai trouvé ce code de Job75

mais j'ai 2 problèmes + 1 question :
1/ quand j'appelle la fonction (cf. fichier test ci joint) elle plante quand je sélectionne une cellule hors du tableau, ce qui me semble normal car la fonction telle que écrite retourne soit "" soit un array, et donc il y a incompatibilité de type
mais comme je suppose qu'il n'y a pas d'erreur avec le code de Job75, comment l'utiliser ?
en plus, une déclaration de fonction ne doit t elle pas préciser le type qu'elle retourne ?

2/ pourquoi ce code scanne t il tous les listobjects de la feuille, si on veut juste récupérer le nom du tableau que l'on pointe ?

3/ une question : je n'arrive pas à comprendre comment comprendre "r.Parent.ListObjects" si "r" est la "cellule active"

merci...

1679676529868.png
 

Pièces jointes

  • test TCD MFC.xlsm
    17.6 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Bonsoir.
Cette Function pourrait s'écrire plus simplement vu qu'un objet Range possède une propriété ListObject représentant directement le tableau auquel appartient une cellule de la plage qu'il représente, et Nothing s'il ne peut en être trouvé un.
À mettre dans un module standard plutôt que dans un module d'objet Worksheet :
VB:
Option Explicit
Function NomTableau(ByVal R As Range) As String
   Application.Volatile
   Dim LOt As ListObject
   Set LOt = R.ListObject
   If Not LOt Is Nothing Then NomTableau = LOt.Name
   End Function
Sub test()
   Dim Nom As String
   Nom = NomTableau(ActiveCell)
   If Nom = "" Then
      MsgBox "pas tableau"
   Else
      MsgBox "tableau """ & Nom & """."
      End If
   End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non. Réservez les modules objets implantés par l'application hôte aux prises en charges d'évènements que ces objets déclenchent. À la rigueur vous pouvez y mettre aussi des procédure exclusivement invoquées par ces procédures de prises en charge.
 

patricktoulon

XLDnaute Barbatruc
Bonjour tous
juste en passant
2 fonction qui ont tres bien leur place dans un xlb
VB:
Sub test()
    MsgBox GetNameTableOfCell(ActiveCell)
End Sub

Function GetNameTableOfCell(ByVal cel As Range) As String
'renvoie "FAUX" si pas de table
    Dim LstO As lisobject
    GetNameTableOfCell = CStr(False)
    Set LstO = cel.ListObject
    If Not LstO Is Nothing Then GetNameTableOfCell = lo.Name
End Function

Sub test2()
    MsgBox GetNameRangeOfCell(ActiveCell)
End Sub

Function GetNameRangeOfCell(ByVal cel As Range) As String
'renvoie "FAUX" si pas de name
    Dim Nam As Name, Nom$
    GetNameRangeOfCell = CStr(False)
    For Each Nam In Names
        Nom = Replace(Nam.RefersTo, "=", "")
        If Not Intersect(Range(Nom), cel) Is Nothing Then GetNameRangeOfCell = Nam.Name
    Next
End Function
 

job75

XLDnaute Barbatruc
Bonjour rafi93, le fil,

Puisqu'il s'agit de mon code je me dois de répondre.
2/ pourquoi ce code scanne t il tous les listobjects de la feuille, si on veut juste récupérer le nom du tableau que l'on pointe ?
Dans ma fonction la variable r peut être une cellule ou une plage de cellules à cheval sur plusieurs tableaux.

Testez le fichier joint avec votre macro test que j'ai corrigée :
VB:
Sub test()
Dim cel As Range
Dim nom As Variant

Set cel = Selection
nom = NomTableau(cel)

If IsArray(nom) Then
    MsgBox Join(nom)
Else
    MsgBox "pas tableau"
End If
End Sub
A+
 

Pièces jointes

  • test TCD MFC.xlsm
    19.3 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
312 111
Messages
2 085 395
Membres
102 882
dernier inscrit
Sultan94