Home > Net >  Find the last cell column in table with Total Row
Find the last cell column in table with Total Row

Time:03-09

I have a table that contains header row, data body and totals row. I want to find the last row in the last column (in this case) of the data body and I want to have the value of the totals row.

My Table with header row, data body and totals row

I can get the last row and column value (135) by this VBA

Sub Target()

Dim ws1 As Worksheet
Set ws1 = Worksheets("Nordics")
Dim ams As Long
Dim Target As Variant
ans = ws1.ListObjects("TableNordics").DataBodyRange.Rows.Count

Target = ws1.ListObjects("TableNordics").DataBodyRange(ans, 8).Value

End Sub

But, I can not get something simmilar to work for the Totals row (note, message box is just to see if the value works

Sub Table_Lastrow()

Dim ams As Long
ans = ActiveSheet.ListObjects("TableNordics").TotalsRowRange.Value
MsgBox "Last row in Table is  " & ans
End Sub

When I get this to work, I would like to change the Worksheet and Table name to be variable, eg. I will have the names in Cell A1 And A2, I have tried a couple of things for the first formula, but I can not get it to work.

CodePudding user response:

You can access the Total row values using the ListObject.TotalsRowRange property. You need to ensure that the ListObject.ShowTotals = True to ensure to avoid a possible Object variable or With block variable not set error.

Personally I would use the WorksheetFunction.Subtotal (see TargetAverage()) to return the value. In this way, you would not have to upate your code if the TotalsRowRange formula is changed.

Public Function wsNordics() As Worksheet
    Set wsNordics = ThisWorkbook.Worksheets("Nordics")
End Function

Public Function TableNordics() As ListObject
    Set TableNordics = wsNordics.ListObjects("TableNordics")
End Function

Public Function TargetAverage() As Double
    With TableNordics.ListColumns("Target")
        TargetAverage = WorksheetFunction.Subtotal(101, .DataBodyRange)
    End With
End Function

Public Function TableNordicsTargetAverage() As Double
    With TableNordics
        .ShowTotals = True
        With .TotalsRowRange
            TableNordicsTargetAverage = .Cells(, .Columns.Count)
        End With
    End With
End Function

CodePudding user response:

You just need to refer to the cell in the last column, which can be done using .ListColumns.Count:

Dim tbl As ListObject
Set tbl = ws1.ListObjects("TableNordics")

With tbl
    ans = .TotalsRowRange.Cells(.ListColumns.Count).Value
End With
  • Related