Saltar al contenido

¿Cómo hago referencia a tablas en Excel usando VBA?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *