Est-il possible dans Excel VBA de référencer une table nommée?
Hypothétiquement cela pourrait être ...
Sheets("Sheet1").Table("A_Table").Select
J'ai déjà vu des tables mentionner des objets de liste mais je ne suis pas sûr que ce soit la même chose ...
Peut-être que cela peut vous aider
Créer une table
La conversion d'une plage en table commence par le même code que dans Excel 2003 (comme décrit dans cette réponse ):
Sub CreateTable()
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes).Name = _
"Table1"
'No go in 2003
ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleLight2"
End Sub
Le PO demandé, est-il possible de référencer une table, pas comment ajouter une table. Donc, l'équivalent de travail de
Sheets("Sheet1").Table("A_Table").Select
serait cette déclaration:
Sheets("Sheet1").ListObjects("A_Table").Range.Select
ou pour sélectionner des pièces (comme uniquement les données du tableau):
Dim LO As ListObject
Set LO = Sheets("Sheet1").ListObjects("A_Table")
LO.HeaderRowRange.Select ' Select just header row
LO.DataBodyRange.Select ' Select just data cells
LO.TotalsRowRange.Select ' Select just totals row
Pour les pièces, vous pouvez vérifier l’existence de l’en-tête et du total des lignes avant de les sélectionner.
Et sérieusement, c'est la seule question sur la référence des tables dans VBA dans SO? Les tableaux dans Excel ont beaucoup de sens, mais ils sont si difficiles à utiliser dans VBA!
Une "table" dans Excel est en effet connue sous le nom de ListObject.
La manière "appropriée" de référencer une table consiste à extraire son ListObject de sa feuille de travail, à savoir SheetObject.ListObjects(ListObjectName)
.
Si vous souhaitez référencer une table sans utiliser la feuille, vous pouvez utiliser un hack Application.Range(ListObjectName).ListObject
.
REMARQUE: Ce hack repose sur le fait qu'Excel crée toujours une plage nommée pour la table DataBodyRange avec le même nom comme la table. Cependant, le nom de cette plage peut peut être modifié ... bien que ce ne soit pas quelque chose que vous souhaitiez faire, car le nom sera réinitialisé si vous modifiez le nom de la table! Vous pouvez également obtenir une plage nommée sans aucun ListObject associé.
Compte tenu du message d'erreur 1004 pas très utile d'Excel lorsque vous vous trompez de nom, vous souhaiterez peut-être créer un wrapper ...
Public Function GetListObject(ByVal ListObjectName As String, Optional ParentWorksheet As Worksheet = Nothing) As Excel.ListObject
On Error Resume Next
If (Not ParentWorksheet Is Nothing) Then
Set GetListObject = ParentWorksheet.ListObjects(ListObjectName)
Else
Set GetListObject = Application.Range(ListObjectName).ListObject
End If
On Error GoTo 0 'Or your error handler
If (Not GetListObject Is Nothing) Then
'Success
ElseIf (Not ParentWorksheet Is Nothing) Then
Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found on sheet '" & ParentWorksheet.Name & "'!")
Else
Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found!")
End If
End Function
Aussi quelques bonnes informations ListObject ici .
De plus, il est pratique de définir des variables faisant référence à des objets. Par exemple,
Sub CreateTable()
Dim lo as ListObject
Set lo = ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes)
lo.Name = "Table1"
lo.TableStyle = "TableStyleLight2"
...
End Sub
Vous trouverez probablement cela avantageux à la fois.
En plus de ce qui précède, vous pouvez le faire (où "YourListObjectName" est le nom de votre table):
Dim LO As ListObject
Set LO = ActiveSheet.ListObjects("YourListObjectName")
Mais je pense que cela ne fonctionne que si vous voulez référencer un objet de la liste qui se trouve sur la feuille active.
J'ai trouvé votre question parce que je voulais faire référence à un objet de liste (un tableau) sur une feuille de calcul à laquelle se réfère un tableau croisé dynamique. Étant donné que les objets de liste font partie de la collection de feuilles de calcul, vous devez connaître le nom de la feuille de calcul sur laquelle se trouve cet objet pour pouvoir y faire référence. Donc, pour obtenir le nom de la feuille de calcul contenant l'objet de liste, j'ai obtenu le nom de l'objet de liste source du tableau croisé dynamique (encore une table) et j'ai parcouru en boucle les feuilles de calcul et leurs objets de liste jusqu'à trouver la feuille de calcul contenant la liste. objet que je cherchais.
Public Sub GetListObjectWorksheet()
' Get the name of the worksheet that contains the data
' that is the pivot table's source data.
Dim WB As Workbook
Set WB = ActiveWorkbook
' Create a PivotTable object and set it to be
' the pivot table in the active cell:
Dim PT As PivotTable
Set PT = ActiveCell.PivotTable
Dim LO As ListObject
Dim LOWS As Worksheet
' Loop through the worksheets and each worksheet's list objects
' to find the name of the worksheet that contains the list object
' that the pivot table uses as its source data:
Dim WS As Worksheet
For Each WS In WB.Worksheets
' Loop through the ListObjects in each workshet:
For Each LO In WS.ListObjects
' If the ListObject's name is the name of the pivot table's soure data,
' set the LOWS to be the worksheet that contains the list object:
If LO.Name = PT.SourceData Then
Set LOWS = WB.Worksheets(LO.Parent.Name)
End If
Next LO
Next WS
Debug.Print LOWS.Name
End Sub
Peut-être que quelqu'un connaît un moyen plus direct.