我有一个自动过滤范围的工作表,从单元格B3
开始。列A
包含一些宏按钮但实际上是空白的。前两行包含有关主范围内数据的信息。
在VBA中,我使用的是我认为是确定工作表中最后一行的标准方法(在这种情况下,我不能依赖单个列上的.End
方法):
LastRow = Activesheet.Cells.Find("*",SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row
但是,有时这会返回值1,即使我有数千行数据。它似乎只在设置了过滤器时才会这样做(但是仍然有可见的行包含数据),但即使这样,它也不会总是发生,我看不到它的模式。
我知道还有其他解决方案 - 我已经改为使用UsedRange
技术,但是这个特定的技术失败是非常令人沮丧的,因为在这种情况下它会是最有效的。
有谁知道为什么会发生这种情况?
答案 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
指定查看XlFormulas
与XlValues
不同,将使用此参数检测隐藏的单元格(但未过滤的单元格)。
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: