Определите две разные колонки с одной функцией - PullRequest
1 голос
/ 08 марта 2019

Вот функция, которая может идентифицировать столбец по заголовку:

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.

Так что в настоящее время я сталкиваюсь с двумя проблемами:

  1. При выборе выбирается одна дополнительная ячейка, чем требуется
  2. Я не знаю, почему я получаю вышеуказанную ошибку

1 Ответ

2 голосов
/ 08 марта 2019

Это должно работать:

РЕДАКТИРОВАТЬ: обновлено, чтобы иметь дело со случаями, когда заголовок найден, но нет данных

Function find_Col(header As String) As Range

    Dim aCell As Range, bCell As Range, rng As Range

    With Workbooks("Template.xlsm").Sheets("Results")

        Set aCell = .Cells.Find(what:=header, LookIn:=xlValues, lookat:=xlWhole, _
                                 MatchCase:=False, SearchFormat:=False)

        If Not aCell Is Nothing Then
            Set aCell = aCell.Offset(1, 0)
            Set bCell = .Cells(.Rows.Count, aCell.Column).End(xlUp)
            If bCell.Row > aCell.Row Then
                Set rng = .Range(aCell, bCell)  'column has some content
            Else
                Set rng = aCell 'or nothing?     'column has no content...
            End If
        End If      
    End With

    Set find_col = rng
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...