Excel VBA для определения последней строки в столбце (IE может иметь формулу, но не значение) - PullRequest
2 голосов
/ 18 декабря 2011

У меня есть столбец с формулой в каждом поле строки. Формула распространяет данные из другой таблицы Excel. Если в поле строки ничего нет, строка остается пустой.

Я нашел много примеров в Google, чтобы получить последнюю строку в столбце. Однако они терпят неудачу, потому что они определяют формулу как строку, в которой есть что-то. В этом есть смысл. Однако как я могу получить последнюю строку в столбце, которая игнорирует формулу и пытается только обнаружить значения в полях столбца?

В настоящее время я использую два метода для поиска последней строки в столбце, оба из которых терпят неудачу:

Function lastRowA(rngInput As Range) As Variant
    Dim WorkRange As Range
    Dim i As Integer, CellCount As Integer
    Application.Volatile
    Set WorkRange = rngInput.Rows(1).EntireRow
    Set WorkRange = Intersect(WorkRange.Parent.UsedRange, WorkRange)
    CellCount = WorkRange.Count
    For i = CellCount To 1 Step -1
        If Not IsEmpty(WorkRange(i)) Then
            lastRowA = WorkRange(i).Value
            Exit Function
        End If
    Next i
End Function

и

function lastRow(column as string, optional plusOne as boolean)
    If (plusOne = False) then
        plusOne=False
    End If

    if (plusOne = False) Then
        lastRow = Replace(Range(column & "65536").End(xlUp).Address, "$", "")
    Else
        lastRow = Range(column & "65536").End(xlUp).Address
        lastRow = Cells(lastRow)
        ' Replace(, "$", "")
    End If
End Function

Ответы [ 3 ]

3 голосов
/ 18 декабря 2011

Вот простой способ найти последнюю ячейку в столбце, который не содержит формулу. Будет 0, если нет ячейки без формулы.

Sub Test()

Dim i As Long, tempLast As Long, lastRow As Long
tempLast = Range("A" & Rows.Count).End(xlUp).Row

For i = tempLast To 1 Step -1
    If Len(Cells(i, 1)) <> 0 Then
        If Not Cells(i, 1).HasFormula Then
            lastRow = i
            Exit For
        End If
    End If
Next

MsgBox lastRow
End Sub

Обратите внимание, что вы должны использовать "rows.count", а не 65536, так как это больше не последняя строка в новых версиях Excel. Rows.count работает независимо от версии или пользовательских настроек. Также следует избегать использованияrangerange, поскольку существует странная ошибка, из-за которой вам нужно обновить использованный диапазон, иначе вы получите ошибочные результаты.

3 голосов
/ 18 декабря 2011

Если вы хотите найти последнюю строку, которая содержит непустое значение (либо полученное по формуле, либо введя константу), попробуйте это

Sub FindLastValue()
Dim jLastRow As Long
jLastRow = ActiveSheet.Cells.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Sub
3 голосов
/ 18 декабря 2011

Я никогда не делал ничего подобного, но, похоже, он работает правильно и быстро для довольно больших площадей. Несмотря на то, что вы сказали, что столбец - это все формулы, здесь учитывается сочетание значений и формул, поэтому внешний цикл переходит назад через Области:

Function GetLastFormulaBlank(rngInput As Excel.Range) As Excel.Range

Dim rngFormulas As Excel.Range
Dim rngArea As Excel.Range
Dim CellCounter As Long
Dim AreaCounter As Long
Dim varAreaCells As Variant
Dim rngLastFormulaBlank As Excel.Range

Set rngFormulas = rngInput.SpecialCells(xlCellTypeFormulas)
For AreaCounter = rngFormulas.Areas.Count To 1 Step -1
    Set rngArea = rngFormulas.Areas(AreaCounter)
    varAreaCells = rngArea.Value2
    If IsArray(varAreaCells) Then
        For CellCounter = UBound(varAreaCells) To LBound(varAreaCells) Step -1
            If varAreaCells(CellCounter, 1) = "" Then
                Set rngLastFormulaBlank = rngArea.Cells(CellCounter)
                Exit For
            End If
        Next CellCounter
    Else
        If varAreaCells = "" Then
            Set rngLastFormulaBlank = rngArea.Cells(1)
        End If
    End If
    If Not rngLastFormulaBlank Is Nothing Then
        Exit For
    End If
Next AreaCounter

Set GetLastFormulaBlank = rngLastFormulaBlank
End Function

Вы бы назвали это так:

Sub test()
Dim rngLastFormulaBlank As Excel.Range

Set rngLastFormulaBlank = GetLastFormulaBlank(ActiveSheet.Range("A:A"))
If Not rngLastFormulaBlank Is Nothing Then
    MsgBox rngLastFormulaBlank.Address
Else
    MsgBox "no formulas with blanks in range"
End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...