Функция Excel VBA для определения номера строки - PullRequest
0 голосов
/ 28 января 2019

Я построил функцию для определения первой строки, в которой существуют данные.Когда я вызываю данные, я получаю сообщение об ошибке с указанием требуемого объекта.Как мне обойти эту ошибку и это лучший способ для достижения моей цели?TYIA!

Sub rename()

Dim strOldType As String
Dim correctrow As Long
Dim a As Range

Set a = startrow(correctrow)

Range("s" & a).Select
strOldType = Selection.Value
End Sub

Function startrow(firstroww)
Dim strRow As String
Dim firstrow As Range

Range("ab1").Select
strRow = Selection.Value

If strRow <> "" Then
firstroww = 1
Else
Range("ab1").Activate
Selection.End(xlDown).Select
firstroww = ActiveCell.Row()
End If
End Function

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Вы можете использовать это:

ActiveSheet.UsedRange.Row
ActiveSheet.UsedRange.Column

Объект UsedRange - это самый большой прямоугольник, охватывающий все непустые ячейки.

0 голосов
/ 28 января 2019
  • Не пытайтесь использовать Select внутри функции.
  • Используйте Set для назначения объекта диапазона. Не используйте Set для присвоения номера переменной.
  • Решите, хотите ли вы номер строки или объект диапазона.Вы подпрыгиваете назад и вперед между двумя без учета результата.

Исправленный код:

Sub rename()

    Dim strOldType As String
    Dim correctrow As Long
    Dim a As LONG     '<~~ correction

    correctrow = 1     '<~~ correction
    a = startrow(correctrow)     '<~~ correction

    strOldType = Range("s" & a).Value

End Sub

Function startrow(firstroww)

    if Range("ab" & firstrow) <> "" then     '<~~ correction
        startrow = firstrow
    else
        startrow = Range("ab" & firstrow).end(xldown).row
    end if

End Function
0 голосов
/ 28 января 2019

Первая ячейка в функции столбца

Предполагается, что вы ищете функцию 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)
0 голосов
/ 28 января 2019

Вы можете попробовать такую ​​функцию.Вам нужно будет передать диапазон в функцию, как показано ниже в Sub Test().

Пользовательская функция может найти первую использованную ячейку ниже из любой начальной точки.

Option Explicit

Function FR(Start As Range) As Long

Select Case Start
    Case <> ""
        FR = Start.Row
    Case Else
        FR = Start.End(xlDown).Row
End Select

End Function

Sub Test()

MsgBox FR(Range("A1"))

End Sub

enter image description here

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