Comment référencer les tables dans Excel vba?

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 vu une mention de tables étant un objet de liste mais je ne suis pas sûr si c'est la même chose...

21
demandé sur ZygD 2013-08-03 11:55:11

5 réponses

Peut-être que cela peut vous aider

Création d'une table

La conversion d'une plage en table commence avec 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
5
répondu Bgvv1983 2017-05-23 10:31:32

Le PO a 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 parties (comme seulement les données dans le 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 parties, vous pouvez tester l'existence des lignes d'en-tête et de totaux avant de les sélectionner.

Et sérieusement, c'est la seule question sur le référencement des tables dans VBA dans SO? Les tableaux dans Excel ont tellement de sens, mais ils sont si difficile de travailler avec VBA!

63
répondu GlennFromIowa 2014-06-20 22:38:57

Une" table " dans Excel est en effet connue sous le nom de ListObject.

La manière "correcte" de référencer une table est d'obtenir son ListObject à partir de sa feuille de calcul, c'est-à-dire SheetObject.ListObjects(ListObjectName).

Si vous voulez référencer une table sans utiliser la feuille, vous pouvez utiliser un hack Application.Range(ListObjectName).ListObject.

NOTE: ce hack repose sur le fait Qu'Excel crée toujours une plage nommée pour DataBodyRange de la table avec le même nom que la table. Cependant, ce nom de plage peut être changé...bien ce n'est pas quelque chose que vous voudriez faire puisque le nom sera réinitialisé si vous modifiez le nom de la table! Vous pouvez également obtenir une plage nommée sans ListObject associé.

Étant donné que le message D'erreur 1004 d'Excel n'est pas très utile lorsque vous vous trompez de nom, vous pouvez 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 .

21
répondu AndrewD 2018-08-30 03:50:41

En outre, il est pratique de définir des variables se référant à 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 avantageux à la fois.

6
répondu sancho.s 2013-11-20 20:20:57

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 list qui se trouve sur la feuille active.

J'ai trouvé votre question parce que je voulais faire référence à un objet de liste (une table) sur une feuille de calcul à laquelle un tableau croisé dynamique sur une feuille de calcul différente fait référence. Étant donné que les objets list font partie de la collection Worksheets, vous devez connaître le nom de la feuille de calcul de cet objet list afin de vous y référer. Donc, pour obtenir le nom de la feuille de calcul sur laquelle se trouve l'objet list, j'ai obtenu le nom de l'objet list source du tableau croisé dynamique (encore une fois, une table) et parcouru les feuilles de calcul et leurs objets list jusqu'à ce que je trouve la feuille de calcul contenant l'objet list 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.

4
répondu Hugh Seagraves 2014-01-23 23:43:02