Come posso fare riferimento a tabelle in Excel vba?

È ansible in Excel VBA fare riferimento a una tabella denominata?

Ipoteticamente questo potrebbe essere …

Sheets("Sheet1").Table("A_Table").Select 

Ho visto qualche menzione di tabelle come object di list, ma non sono sicuro se questa è la stessa cosa …

Chiunque possa aiutarmi?

Forse questo può aiutarti

Creazione di una tabella

La conversione di un intervallo in una tabella inizia con lo stesso codice di Excel 2003 (come descritto in questa risposta ):

 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 

L'OP ha chiesto, è ansible fare riferimento a una tabella , non come aggiungere una tabella. Quindi l'equivalente lavorativo di

 Sheets("Sheet1").Table("A_Table").Select 

sarebbe questa affermazione:

 Sheets("Sheet1").ListObjects("A_Table").Range.Select 

o per select parti (come solo i dati nella tabella):

 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 

Per le parti, si consiglia di verificare l'esistenza dell'intestazione e raggruppa le righe prima di selezionarle.

E seriamente, questa è l'unica domanda sul riferimento dei tavoli in VBA in SO? Le tabelle in Excel hanno molto senso, ma sono così difficili da lavorare con VBA!

Il modo "appropriato" di fare riferimento a una tabella è get il suo ListObject dal foglio di lavoro, vale a dire SheetObject.ListObjects(ListObjectName) .

Se si desidera fare riferimento a una tabella senza utilizzare il foglio, è ansible utilizzare un hack Application.Range(ListObjectName).ListObject .

NOTA: Questo hack si basa sul fatto che Excel crea sempre un intervallo di nome per il DataBodyRange della tabella con lo stesso nome della tabella. Tuttavia questo nome di intervallo può essere modificato … anche se non è qualcosa che si desidera fare dal momento che il nome verrà reimpostato se si modifica il nome della tabella! Inoltre si potrebbe get una gamma chiamata senza ListObject associato.

Dato il messaggio di errore 1004 non molto utile di Excel quando si riceve il nome errato, è ansible creare 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 

Anche alcune informazioni GoodOctObject qui .

Inoltre, è conveniente definire le variables che si riferiscono agli oggetti. Per esempio,

 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 

Probabilmente lo trovenetworking vantaggiosi in una volta.

Oltre a quanto sopra, puoi farlo (where "YourListObjectName" è il nome della tua tabella):

 Dim LO As ListObject Set LO = ActiveSheet.ListObjects("YourListObjectName") 

Ma penso che funzioni solo se si desidera fare riferimento a un object di elenco che si trova sul foglio attivo.

Ho trovato la tua domanda perché volevo fare riferimento a un object di elenco (una tabella) in un foglio di lavoro che una tabella pivot su un foglio di lavoro diverso si riferisce. Poiché gli oggetti di elenco sono parte della raccolta Foglio di lavoro, è necessario conoscere il nome del foglio di lavoro che l'object di elenco è attivo per riferirsi a esso. Quindi, per get il nome del foglio di lavoro che l'object di elenco è attivo, ho trovato il nome dell'object di elenco di origine della tabella pivot (ancora una tabella) e looped attraverso i fogli di lavoro ei loro oggetti di elenco fino a trovare il foglio che conteneva l'elenco object che stavo cercando.

 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 

Forse qualcuno conosce un modo più diretto.