Эта функция возвращает массив, в котором первый элемент является номером последней строки, а второй элемент - номером последней колонки.
Function LastRowCol(Worksht) As Long()
'Uncomment if on worksheet
'Application.Volatile
Dim WS As Worksheet, R As Range
Dim LastRow As Long, LastCol As Long
Dim L(1) As Long
Select Case TypeName(Worksht)
Case "String"
Set WS = Worksheets(Worksht)
Case "Worksheet"
Set WS = Worksht
End Select
With WS
Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
searchdirection:=xlPrevious)
If Not R Is Nothing Then
LastRow = R.Row
LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
searchdirection:=xlPrevious).Column
Else
LastRow = 1
LastCol = 1
End If
End With
L(0) = LastRow
L(1) = LastCol
LastRowCol = L
End Function
Sub change_code_name()
'Requires Trust Access to VBA Object Model
Dim wbk As Object, sheet As Object
ActiveWorkbook.VBProject.name = "VBAProject"
Set wbk = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.CodeName)
wbk.name = "wbk_code_name"
Set sheet = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.Sheets(1).CodeName)
sheet.name = "sheet_code_name"
End Sub
В случае вашей строки кода предполагается, что кодовое имя вашей таблицы равно Sheet3
, это будет что-то вроде:
colnum = LastRowCol(Sheet3)(1) + 1
и будет применяться к активной книге.
См. Также Ошибка при поиске последней использованной ячейки в Excel с VBA для широкого обсуждения различных методов поиска последней строки / столбца и подводных камней каждого из них.
Редактировать:
Изучая свой скриншот, кажется, что вы могли бы хочу исключить строку 1 из тестирования. Если это так, попробуйте этот слегка измененный код:
Option Explicit
Function LastRowCol(Worksht, Optional excludeRows As Long = 0) As Long()
'Uncomment if on worksheet
'Application.Volatile
Dim WS As Worksheet, R As Range
Dim LastRow As Long, LastCol As Long
Dim L(1) As Long
Dim searchRng As Range
Select Case TypeName(Worksht)
Case "String"
Set WS = Worksheets(Worksht)
Case "Worksheet"
Set WS = Worksht
End Select
If excludeRows > 0 Then
With WS
Set searchRng = Range(.Cells(excludeRows + 1, 1), .Cells(.Rows.Count, .Columns.Count))
End With
Else
Set searchRng = WS.Cells
End If
With searchRng
Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
searchdirection:=xlPrevious)
If Not R Is Nothing Then
LastRow = R.Row
LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
searchdirection:=xlPrevious).Column
Else
LastRow = 1
LastCol = 1
End If
End With
L(0) = excludeRows + 1
L(1) = LastCol
LastRowCol = L
End Function
и в своем макросе:
colnum = LastRowCol(Sheet3,1)(1) + 1