Excel 如何确定VBA中使用的最后一行,包括中间的空格

Excel 如何确定VBA中使用的最后一行,包括中间的空格,excel,vba,Excel,Vba,使用此功能: Function ultimaFilaBlanco(col As String) As Long Dim lastRow As Long With ActiveSheet lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row End With ultimaFilaBla

使用此功能:

Function ultimaFilaBlanco(col As String) As Long        
        Dim lastRow As Long
        With ActiveSheet
            lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row
        End With            
        ultimaFilaBlanco = lastRow          
End Function
这些数据:

Row 1 : Value
Row 2 : Value
Row 3 : Value
Row 4 : Value
Row 5 : Value
Row 6 : White
Row 7 : Value
Row 8 : Value
Row 9 : Value
Row 10  : White
Row 11  : White
Row 12  : White
Row 13  : Value
Row 14  : White

函数返回5,我需要13。知道怎么做吗

你真的很接近。尝试在
End(xlUp)

我使用以下方法:

lastrow = ActiveSheet.Columns("A").Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row
它将在特定列中找到最后一行。如果希望任何列使用最后一行,则:

lastrow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

获取最后使用的行数的最佳方法是:

ActiveSheet.UsedRange.Rows.Count
用于当前工作表

工作表(“工作表名称”).UsedRange.Rows.Count
用于特定工作表

要获取使用的最后一列的编号,请执行以下操作:

ActiveSheet.UsedRange.Columns.Count
用于当前工作表

工作表(“工作表名称”)。对于特定的工作表,使用drange.Columns.Count

我希望这有帮助

Abdo

问题在于函数中的“as字符串”。将其替换为“双倍”或“尽可能长”以使其工作。这样,即使最后一行大于公认答案中提出的“大数字”,它也能起作用

所以这应该行得通

Function ultimaFilaBlanco(col As double) As Long        
    Dim lastRow As Long
    With ActiveSheet
        lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row
    End With            
    ultimaFilaBlanco = lastRow          
End Function

短。安全的。快速的将返回最后一个非空行,即使工作表顶部或其他任何地方有空行。也适用于空工作表(Excel在空工作表上报告1行,因此表达式将为1)。在Excel2002和Excel2010上进行了测试和工作。

以下是我查找下一个空行的代码,例如在第一行“A”中。 要将其用于任何其他行,只需更改单元格(i、2、3或4等)


除了以上提到的方法外,还有其他几种方法可以找到工作表或指定范围中的最后一行或最后一列

Function FindingLastRow(col As String) As Long

  'PURPOSE: Various ways to find the last row in a column or a range
  'ASSUMPTION: col is passed as column header name in string data type i.e. "B", "AZ" etc.

   Dim wks As Worksheet
   Dim lstRow As Long

   Set wks = ThisWorkbook.Worksheets("Sheet1") 'Please change the sheet name
   'Set wks = ActiveSheet   'or for your problem uncomment this line

   'Method #1: By Finding Last used cell in the worksheet
   lstRow = wks.Range("A1").SpecialCells(xlCellTypeLastCell).Row

   'Method #2: Using Table Range
   lstRow = wks.ListObjects("Table1").Range.Rows.Count

   'Method #3 : Manual way of selecting last Row : Ctrl + Shift + End
   lstRow = wks.Cells(wks.Rows.Count, col).End(xlUp).Row

   'Method #4: By using UsedRange
   wks.UsedRange 'Refresh UsedRange
   lstRow = wks.UsedRange.Rows(wks.UsedRange.Rows.Count).Row

   'Method #5: Using Named Range
   lstRow = wks.Range("MyNamedRange").Rows.Count

   'Method #6: Ctrl + Shift + Down (Range should be the first cell in data set)
   lstRow = wks.Range("A1").CurrentRegion.Rows.Count

   'Method #7: Using Range.Find method
   lstRow = wks.Column(col).Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

   FindingLastRow = lstRow

End Function
注意:请仅使用上述方法中的一种,因为它可以证明您的问题陈述是正确的

请注意,Find方法只查看数据,而不查看单元格格式,因此,如果只有数据重要,而不查看格式,请查找xlCellTypeLastCell。此外,合并单元格(必须避免)可能会给您带来意外的结果,因为它将为您提供合并单元格中第一个单元格的行号,而不是最后一个单元格的行号。

更好:

if cells(i,1)="" then 
nextEmpty=i: 
exit for

活动工作表可以替换为
工作表(1)
工作表(“此处的名称”)

如果工作表顶部包含未使用的区域,
UsedRange.Rows.Count
不是最大行数

这是正确的最大行数

maxrow = Sheets("..name..").UsedRange.Rows(Sheets("..name..").UsedRange.Rows.Count).Row

嘿,谢谢我的测试,你知道为什么我必须返回一个变量而不是一个长的吗?检查@JHK answer以获得改进。该函数与我的函数完全相同。这是一个重复的函数,并且有相同的问题,即它返回UsedRange中的行数,而不是,它也没有提及。重复的小心,
UsedRange.Rows.Count
返回使用过的行数。如果您使用100行,然后
clearcontents
UsedRange.Row.Count
仍然返回100。请参阅我在上的帖子,我认为它可以解决您的请求。奇怪的是,我正在运行以下代码,它甚至可以处理中间的空白行:
ActiveSheet.Cells(ActiveSheet.rows.Count,3)。End(xlUp)。Row
(MacOS X上的Excel 2016)谢谢。据我所知,这工作得更快。我接受这一回答。这仅在第一个非空行是第1行的情况下有效。如果要获取所用范围内的最后一行,请正确操作--请参阅。阅读,如果需要包含数据的行(而不是一些剩余格式)和/或在特定列中,检查。这肯定是最准确的答案。计数答案假设您从第一行开始(即1)-有些情况下你不是。这会给出范围结束时的实际行索引。我接受这一点作为答案。@manuel你的声明在开始空白行时做得很好,你能详细说明一下吗?虽然这是获得
UsedRange
最后一行的正确方法,但重要的是要理解。更多信息able…即使在
ClearContents
或删除重复项的情况下也能正常工作,但迟到了…虽然我同意
Exit For
GoTo 20
更好-我想你是在回应@OdiljonJakhangirov给出的答案。但是
Ctrl+Up
的代码比
Find
方法更快。在我列出了这些方法中的大多数。。。
Sheets("Sheeet1").Select
   for i=1 to 5000
        if cells(i,1)="" then nextEmpty=i goto 20
   next i
20 'continue your code here 

enter code here
Function FindingLastRow(col As String) As Long

  'PURPOSE: Various ways to find the last row in a column or a range
  'ASSUMPTION: col is passed as column header name in string data type i.e. "B", "AZ" etc.

   Dim wks As Worksheet
   Dim lstRow As Long

   Set wks = ThisWorkbook.Worksheets("Sheet1") 'Please change the sheet name
   'Set wks = ActiveSheet   'or for your problem uncomment this line

   'Method #1: By Finding Last used cell in the worksheet
   lstRow = wks.Range("A1").SpecialCells(xlCellTypeLastCell).Row

   'Method #2: Using Table Range
   lstRow = wks.ListObjects("Table1").Range.Rows.Count

   'Method #3 : Manual way of selecting last Row : Ctrl + Shift + End
   lstRow = wks.Cells(wks.Rows.Count, col).End(xlUp).Row

   'Method #4: By using UsedRange
   wks.UsedRange 'Refresh UsedRange
   lstRow = wks.UsedRange.Rows(wks.UsedRange.Rows.Count).Row

   'Method #5: Using Named Range
   lstRow = wks.Range("MyNamedRange").Rows.Count

   'Method #6: Ctrl + Shift + Down (Range should be the first cell in data set)
   lstRow = wks.Range("A1").CurrentRegion.Rows.Count

   'Method #7: Using Range.Find method
   lstRow = wks.Column(col).Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

   FindingLastRow = lstRow

End Function
if cells(i,1)="" then 
nextEmpty=i: 
exit for
ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).row
maxrow = Sheets("..name..").UsedRange.Rows(Sheets("..name..").UsedRange.Rows.Count).Row