variable una tabla seleccionar referencias referencia rango otro libro hacer estructuradas columna celda asignar anterior absoluta excel vba excel-vba listobject excel-tables

una - ¿Cómo puedo hacer referencia a tablas en Excel vba?



referencias estructuradas excel (5)

Además de lo anterior, puede hacer esto (donde "YourListObjectName" es el nombre de su tabla):

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

Pero creo que solo funciona si desea hacer referencia a un objeto de lista que está en la hoja activa.

Encontré su pregunta porque quería referirme a un objeto de lista (una tabla) en una hoja de cálculo al que se refiere una tabla dinámica en una hoja de cálculo diferente. Dado que los objetos de lista forman parte de la colección de Hojas de trabajo, debe conocer el nombre de la hoja de trabajo en la que se encuentra el objeto de lista para poder consultarla. Así que para obtener el nombre de la hoja de trabajo en la que se encuentra el objeto de la lista, obtuve el nombre del objeto de la lista de origen de la tabla dinámica (de nuevo, una tabla) y repasé las hojas de trabajo y sus objetos de la lista hasta que encontré la hoja de trabajo que contenía la lista objeto que estaba buscando.

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

Tal vez alguien sepa de una manera más directa.

¿Es posible en Excel VBA hacer referencia a una tabla nombrada?

Hipotéticamente esto podría ser ...

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

He visto alguna mención de que las tablas son un objeto de lista, pero no estoy seguro de que sea lo mismo ...


Además, es conveniente definir variables referidas a objetos. Por ejemplo,

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

Probablemente lo encuentre ventajoso a la vez.


El OP preguntó, ¿es posible hacer referencia a una tabla , no cómo agregar una tabla? Así que el equivalente de trabajo de

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

sería esta declaración:

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

o para seleccionar partes (como solo los datos en la tabla):

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

Para las partes, es posible que desee probar la existencia del encabezado y las filas de totales antes de seleccionarlas.

¿Y en serio, esta es la única pregunta sobre la referenciación de tablas en VBA en SO? Las tablas en Excel tienen mucho sentido, ¡pero son tan difíciles de trabajar en VBA!


Tal vez esto pueda ayudarle

Creando una mesa

La conversión de un rango a una tabla comienza con el mismo código que en Excel 2003 (como se describe en esta respuesta ):

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


Una "tabla" en Excel es conocida como un ListObject.

La forma "adecuada" de hacer referencia a una tabla es obteniendo su ListObject de su Hoja de trabajo, es decir, SheetObject.ListObjects(ListObjectName) .

Si desea hacer referencia a una tabla sin usar la hoja, puede usar un Application.Range(ListObjectName).ListObject .

NOTA: Este truco se basa en el hecho de que Excel siempre crea un rango con nombre para el DataBodyRange de la tabla con el mismo nombre que la tabla. Sin embargo, este nombre de rango se puede cambiar ... ¡aunque no es algo que quieras hacer ya que el nombre se restablecerá si editas el nombre de la tabla! También puede obtener un rango con nombre sin un objeto ListObject asociado.

Dado que el mensaje de error 1004 no es muy útil para Excel cuando recibe el nombre incorrecto, es posible que desee crear un envoltorio ...

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

También alguna buena información de ListObject here .