Si hallas algún problema con tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al trabajo final.
Solución:
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 afirmació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 de las filas de encabezado y totales antes de seleccionarlas.
Y en serio, ¿esta es la única pregunta sobre tablas de referencia en VBA en SO? Las tablas en Excel tienen mucho sentido, ¡pero es muy difícil trabajar con ellas en VBA!
De hecho, una “tabla” en Excel se conoce como ListObject.
La forma “adecuada” de hacer referencia a una tabla es obtener 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 truco Application.Range(ListObjectName).ListObject
.
NOTA: Este truco se basa en el hecho de que Excel siempre crea un rango con nombre para la tabla Rango de cuerpo de datos con el mismo nombre que la tabla. Sin embargo, este nombre de rango lata cambiarse… ¡aunque no es algo que desee hacer ya que el nombre se restablecerá si edita el nombre de la tabla! También puede obtener un rango con nombre sin asociado ListObject.
Dado el mensaje de error 1004 no muy útil de Excel cuando obtiene el nombre incorrecto, es posible que desee crear un contenedor…
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 aquí.
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 encontrará ventajoso de inmediato.
Calificaciones y comentarios
Si piensas que ha sido útil nuestro artículo, nos gustaría que lo compartas con el resto entusiastas de la programación así contrubuyes a extender nuestro contenido.