Вот функция, которая может идентифицировать столбец по заголовку:
Function find_Col(header As String) As Range
Dim aCell As Range, rng As Range
Dim col As Long, lRow As Long
Dim colName As String
Dim y As Workbook
Dim ws1 As Worksheet
Set y = Workbooks("Template.xlsm")
Set ws1 = y.Sheets("Results")
With ws1
Set aCell = Cells.Find(what:=header, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
col = aCell.Column
colName = Split(.Cells(, col).Address, "$")(1)
lRow = Range(colName & .Rows.count).End(xlUp).Row + 1
Set myCol = Range(colName & "2")
'This is your range
Set find_Col = Range(myCol.Address & ":" & colName & lRow)
find_Col.Select
End With
End Function
Затем я вызываю функцию в подпрограмме:
Sub myCol_Find()
find_Col ("Product")
End Sub
Выше работает нормально, ноПроблема, с которой я сталкиваюсь, заключается в том, что если столбец, который я ищу, является почти пустым, исключая заголовок, то моя функция будет выбирать только первые 2 строки под заголовком.Кроме того, вторая проблема, она также выбирает строку сразу после последней строки.Поэтому, если первая строка под заголовком - B3
, а последняя строка - B10
, она выбирает B3:B11
.
. В результате я подумал, что, возможно, будет лучше работать, если сначала определитьстолбец с данными в нем (который, я знаю, всегда будет содержать данные), затем используйте этот столбец, чтобы найти последнюю строку данных, и, наконец, используйте фактический столбец, который мне нужен для выбора.
Итак, сначала я сделалтест, изменив эту строку:
lRow = Range(colName & .Rows.count).End(xlUp).Row + 1
На это:
lRow = Range("A" & .Rows.count).End(xlUp).Row + 1
И это выбрало все ячейки в моем поисковом столбце на основе общего количества строк, найденных в столбце А.
Тогда я подумал, что вместо того, чтобы специально называть столбец, я буду применять ту же логику «поиска» столбца, чтобы найти «столбец А».Итак, у меня есть это:
Function find_Col(header As String) As Range
Dim aCell As Range, rng As Range, def_Header As Range
Dim col As Long, lRow As Long, defCol As Long
Dim colName As String, defColName As String
Dim y As Workbook
Dim ws1 As Worksheet
Set y = Workbooks("Template.xlsm")
Set ws1 = y.Sheets("Results")
With ws1
Set def_Header = Cells.Find(what:="ID", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
defCol = def_Header.Column
defColName = Split(.Cells(, def_Col).Address, "$")(1)
Set aCell = Cells.Find(what:=header, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
col = aCell.Column
colName = Split(.Cells(, col).Address, "$")(1)
' lRow = Range(colName & .Rows.count).End(xlUp).Row + 1
lRow = Range(defColName & .Rows.count).End(xlUp).Row + 1
Set myCol = Range(colName & "2")
'This is your range
Set find_Col = Range(myCol.Address & ":" & colName & lRow)
find_Col.Select
End With
End Function
Добавлен дополнительный код:
Dim def_Header As Range
Dim defCol As Long
Dim defColName As String
Set def_Header = Cells.Find(what:="KW_ID", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
defCol = def_Header.Column
defColName = Split(.Cells(, defCol).Address, "$")(1)
И изменилось это:
lRow = Range("A" & .Rows.count).End(xlUp).Row + 1
На это:
lRow = Range(defColName & .Rows.count).End(xlUp).Row + 1
Теперь я получаю сообщение об ошибке:
defCol = def_Header.Column
Ошибка:
Переменная объекта с переменной блока не установлена
Я не совсем понимаю, в чем проблема, так как она не давала мне этой ошибки ранее, когда я определил aCell
.
Так что в настоящее время я сталкиваюсь с двумя проблемами:
- При выборе выбирается одна дополнительная ячейка, чем требуется
- Я не знаю, почему я получаю вышеуказанную ошибку