web-dev-qa-db-fra.com

Comment référencer des 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 déjà vu des tables mentionner des objets de liste mais je ne suis pas sûr que ce soit la même chose ...

28
1212__Hello

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
6
Bgvv1983

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!

80
GlennFromIowa

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 .

26
AndrewD

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.

7
sancho.s

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.

5
Hugh Seagraves