VBA最后一行计算不起作用

时间:2013-03-12 18:47:24

标签: excel vba excel-vba autofilter

我有一个自动过滤范围的工作表,从单元格B3开始。列A包含一些宏按钮但实际上是空白的。前两行包含有关主范围内数据的信息。

在VBA中,我使用的是我认为是确定工作表中最后一行的标准方法(在这种情况下,我不能依赖单个列上的.End方法):

LastRow = Activesheet.Cells.Find("*",SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row

但是,有时这会返回值1,即使我有数千行数据。它似乎只在设置了过滤器时才会这样做(但是仍然有可见的行包含数据),但即使这样,它也不会总是发生,我看不到它的模式。

我知道还有其他解决方案 - 我已经改为使用UsedRange技术,但是这个特定的技术失败是非常令人沮丧的,因为在这种情况下它会是最有效的。

有谁知道为什么会发生这种情况?

8 个答案:

答案 0 :(得分:1)

试试这个......

Dim LastRow as long

With ActiveSheet
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

这将获得A列的最后一行。

答案 1 :(得分:1)

您是否考虑过使用Greg的答案,但循环查找所有列的最高行?类似的东西:

LastRow = 1
With ActiveSheet
   For i = 1 to .UsedRange.Columns.Count
      If .Cells(.Rows.Count, i).End(xlUp).Row > LastRow Then
         LastRow = .Cells(.Rows.Count, i).End(xlUp).Row
      EndIf
   Next i
End With

此解决方案允许在底行中随机填充空白值。 UsedRange很棘手,因为它将返回已编辑过的最远的行/列(即使它当前是空白的)。根据我的经验,Range.End(xlUp)的行为与您在工作表中按Ctrl-Up时的预期相同。这有点可预测。

如果您正在使用.Find,请尝试查看After:= [A1]参数。我没有探究过这个函数的特性,但那是我开始解决这个问题的地方。

答案 2 :(得分:1)

建议您尝试使用Find指定查看XlFormulasXlValues不同,将使用此参数检测隐藏的单元格(但未过滤的单元格)。

Sub Test()
Dim rng1 As Range
Set rng1 = ActiveSheet.Cells.Find("*", [a1], xlFormulas, , xlByRows, xlPrevious)
If Not rng1 Is Nothing Then MsgBox rng1.Row
End Sub

答案 3 :(得分:1)

今天早上我遇到了同样的问题。

起初,我确信“.find”功能不稳定。

但是,在摆弄了一段时间之后,我发现在我的工作表中行数太深的非空单元格,认为它是1,000或10,000或类似。我删除了它,“。find”再次起作用。可能某些内部VBA变量的限制不够大。

这样做:

1)按CTRL + END

2)识别非空单元格,假设这是无意中填写的,并将其删除。

答案 4 :(得分:0)

尝试以下代码:

Sub GetColA_LastRow()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    MsgBox "The last row which has data in Col A of Sheet1 is " & lRow
End Sub

OR

sub getLastRow()
 dim lastRow as long
 lastRow = Sheets("sheet1").Range("A65000").End(xlUp).Row

end sub

您也可以访问该链接了解更多详情 http://www.siddharthrout.com/2012/10/02/find-last-row-in-an-excel-sheetvbavb-net/

评论后更新代码:

Sub getLastRow()

    Dim rng As Range, lastRow As Long
    Set rng = Cells.Find("mango") ' here you enter whatever you want to find

    If Not rng Is Nothing Then
        lastRow = Sheets("sheet1").Cells(65000, rng.Column).End(xlUp).Row
    End If

End Sub

答案 5 :(得分:0)

怎么样:

with activesheet.usedrange
    LastRow = .rows.count
end with

HTH 菲利普

答案 6 :(得分:0)

我的类似问题是在使用或不使用过滤之前,无论空单元格如何,最后一行和col都使用了什么。我从可以找到的点点滴滴拼凑起来,它做了我认为你和我想要的,至少对于填充数据的单元。

Function FindLastUsedRowAndCol(ByVal ws As Worksheet) As Variant()

Dim LastColRange As Range
Dim LastCol As Integer
Dim LastRow As Long
Dim LastRowTmp As Long
Dim RowXCol(2) As Variant


Set LastColRange = ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
LastCol = LastColRange.Column

LastRow = 1

For i = 1 To LastCol Step 1
    If ws.FilterMode Then
        LastRow = ws.AutoFilter.Range.Rows.Count
        LastRowTmp = Cells(ws.Rows.Count, i).End(xlUp).row
        If LastRowTmp > LastRow Then LastRow = LastRowTmp
    Else
        LastRowTmp = Cells(ws.Rows.Count, i).End(xlUp).row
        If LastRowTmp > LastRow Then LastRow = LastRowTmp
    End If
Next i

RowXCol(1) = LastRow
RowXCol(2) = LastCol
FindLastUsedRowAndCol = RowXCol

End Function

并测试:

Sub testit()
Dim ws As Worksheet
Set ws = Application.Worksheets("Sheet1")
cr = FindLastUsedRowAndCol(ws)
MsgBox "row: " & cr(1) & " col: " & cr(2)
End Sub

答案 7 :(得分:0)

我知道这是一篇过时的文章,但是我已经确切地看到了这个问题,并且没有看到任何解决该问题的答案。有时似乎发生在数据集上,在该数据集的最后一行之后紧接着隐藏了行。设置为lookin xlformulas还是xlvalues都没有关系,并且我已经尝试了可以​​找到的find命令的每个排列,并且它始终返回值1。(如OP所述)上述解决方案不能解决此问题。在这种情况下,我必须创建一个函数来查找最后一行(以下代码的关键位-在我的情况下,我需要在各种数据表的前两列中找到lastrow):

On Error GoTo ExitLoop
StartRow = 1
LastRow = .Columns("A:B").Find(What:="*", SearchDirection:=xlNormal, LookIn:=xlValues, SearchOrder:=xlByRows).Row
StartRow = LastRow + 1
Do Until WorksheetFunction.CountA(.Range(.Cells(StartRow, 1), .Cells(1048576, 2))) = 0
    FindLastRow = .Range(.Cells(StartRow, 1), .Cells(1048576, 2)).Find(What:="*", SearchDirection:=xlNormal, LookIn:=xlValues, SearchOrder:=xlByRows).Row
    StartRow = LastRow + 1
Loop
ExitLoop: