Как я могу найти последний использованный столбец в форматированной таблице?

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь получить последний использованный столбец в моей отформатированной таблице и вставить значение. Но он всегда возвращает самый последний (= пустой) столбец внутри таблицы. Смотрите рисунок ниже для понимания: введите описание изображения здесь

По какой-то причине текст «- seit -» помещается в столбец «10.Besitzer» в столбце 16, тогда как он должен был быть помещен в «1.Besitzer» в столбце 7.

Мой код выглядит следующим образом:

 LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row   1 ' 1 to go to next empty row 

'here it adds values in empty row, starting from column 1(ID) until column 6(IT). 
'I left out this part of code.
 
LastCol = ws.Cells(LastRow, Columns.Count).End(xlToLeft).Column 'Search for last column
        
ws.Cells(LastRow, LastCol).Value = "- seit -" 'place text into last column
 

Если у вас есть ощущение, что это вызывает проблемы, потому что это форматированная таблица, но я не уверен в этом. Я очень благодарен за любую помощь.

Ответ №1:

Да, это останавливается, потому что это таблица. Проверьте, существует ли значение, и если нет, снова проверьте последний столбец таким же образом, только не столбцы.Считайте, но начиная с последнего столбца.

Ответ №2:

Прочитайте комментарии и настройте его в соответствии с вашими потребностями

 Public Sub InsertColumnValue()
    
    ' Set a reference to the table
    Dim targetTable As ListObject
    Set targetTable = Range("TableName").ListObject
    
    ' Find last row in column A
    Dim lastRow As Long
    lastRow = targetTable.DataBodyRange.Cells(targetTable.DataBodyRange.Rows.Count, "A").End(xlUp).Row - targetTable.HeaderRowRange.Row

    ' Add data to next empty row
    ' Do something
    
    ' Check if last column in last row is empty
    Dim lastColumn As Long
    If targetTable.DataBodyRange.Cells(lastRow, targetTable.DataBodyRange.Columns.Count).Value = vbNullString Then
        lastColumn = targetTable.DataBodyRange.Cells(lastRow, targetTable.DataBodyRange.Columns.Count).End(xlToLeft).Column
    Else
        lastColumn = targetTable.DataBodyRange.Columns.Count
    End If
    
    ' Add value to next empty column in next empty row
    targetTable.DataBodyRange.Cells(lastRow   1, lastColumn   1).Value = "- seit -"

End Sub
 

Ответ №3:

Пожалуйста, используйте следующую функцию:

 Function LastUsedColInTable(tbl As ListObject, iRow As Long) As Long
 Dim C As Range

 With tbl.Range.rows(iRow)
    Set C = .Find(what:="*", After:=.cells(1), LookIn:=xlValues, _
             searchorder:=xlByColumns, SearchDirection:=xlPrevious)
    If Not C Is Nothing Then
        LastUsedColInTable = C.Column
    Else
        LastUsedColInTable = 1
    End If
 End With
End Function
 

Это можно проверить таким образом:

 Sub testLastColInTable()
 Dim tbl As ListObject
 Set tbl = ActiveSheet.ListObjects(1)
  Debug.Print LastUsedColInTable(tbl, 2)
End Sub
 

Комментарии:

1. @DXR: Вы получили несколько ответов. Разве вы не нашли время, чтобы протестировать их? Если да, некоторые отзывы не должны никого убивать…