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 .