#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: Вы получили несколько ответов. Разве вы не нашли время, чтобы протестировать их? Если да, некоторые отзывы не должны никого убивать…