Первая ячейка в функции столбца
Предполагается, что вы ищете функцию VBA для использования в Excel для вычисления первой непустой строки столбца (указанной в диапазоне).
Функции
- Метод
Volatile
помечает пользовательскую функцию как энергозависимую.Энергозависимая функция должна пересчитываться всякий раз, когда вычисление происходит в любых ячейках на рабочем листе.Энергонезависимая функция пересчитывается только при изменении входных переменных (Справка VBA). - По крайней мере, для корректности, вы должны использовать
IsEmpty
вместо "" по причине, например, если ячейка врезультирующая строка содержит формулу, которая оценивается как "", она будет игнорироваться. - Версия метода поиска использует метод Find для вычисления первой строки, которая безопаснее, чем конечная версия, например, если вы вводите значение впервая ячейка столбца, т. е. результат равен 1, а первая строка скрыта; результат конечной версии не будет равен 1.
- Формула может быть вставлена в тот же столбец, что и
SelectRange
Столбец.В некоторых случаях версия End не будет показывать правильный результат или создавать циклическую ссылку.Поэтому ThisCell
используется в версии End , и возвращается 0, если в столбце SelectRange
не найдено значение.
Версия метода поиска
Function FirstRowFind(SelectRange As Range) As Long
Application.Volatile
Dim FirstCell As Range
With Columns(SelectRange.Column)
Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
End With
If Not FirstCell Is Nothing Then
FirstRowFind = FirstCell.Row
End If
End Function
Метод поиска
Вместо
Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
вы можете использовать
Set FirstCell = .Find("*", .Cells(.Cells.Count), _
xlFormulas, xlWhole, xlByColumns, xlNext)
или
Set FirstCell = .Find(What:="*", After:=.Cells(.Cells.Count), _
LookIn:=xlFormulas, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext)
параметры для аргументов LookAt
(в данном случае неважно) и SearchDirection
(по умолчанию Next
) могут быть опущены, но, поскольку я не смог найти никакой разницы в эффективности, я не смог.
Использование в Excel
Для столбца AB
:
=FirstRowFind(AB1)
=FirstRowFind(AB20)
=FirstRowFind(AB17:AH234)
Конечная версия (не рекомендуется)
Function FirstRowEnd(SelectRange As Range) As Long
Application.Volatile
Dim FirstCell As Range
If Application.ThisCell.Column = SelectRange.Column Then Exit Function
If Not IsEmpty(SelectRange.Cells(1)) Then
FirstRowEnd = 1
Else
Set FirstCell = Cells(1, SelectRange.Column).End(xlDown)
FirstRowEnd = FirstCell.Row
If FirstRowEnd = Rows.Count And IsEmpty(FirstCell) Then
FirstRowEnd = 0
End If
End If
End Function
Использованиев Excel
для столбца AB
:
=FirstRowEnd(AB1)
=FirstRowEnd(AB20)
=FirstRowEnd(AB17:AH234)