excel 另一种提取列中包含数据的最后一行的方法[重复]

c9qzyr3d  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(161)

此问题在此处已有答案

Find last used cell in Excel VBA(14个答案)
3天前关闭。
我目前使用此代码确定Sheet1的A列中包含数据的最后一行

lrow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

问题是,当我在一个用Excel从数据库中提取的表中使用它时,它总是将表中的最后一行作为“lrow”,即使该行中没有数据。
我记得很久以前有过这个问题,我发现还有另一种方法可以编写查找lrow的代码,该代码实际上适用于来自数据库并链接到数据连接的表。但今天我一直在寻找它,但找不到它。
有人能帮我一下吗?谢谢

ep6jt1vc

ep6jt1vc1#

最后一排

  • 要获取列中的最后一行,即最后一个非空单元格的行,您需要确保工作表没有被过滤。然后您可以自由地使用Find方法,如以下代码所示。
  • 如果你想找到最后一个非空行,例如你想排除数据底部包含计算结果为""的公式的单元格,你将使用xlValues而不是xlFormulas
  • xlFormulas将工作,即使行是隐藏的(不过滤),而xlValues不会。
    快速修复(不推荐)
lrow = Worksheets("Sheet1").Columns("A").Find("*", , xlFormulas, , , xlPrevious).Row

末行

Sub CalculateLastRow()

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    If ws.FilterMode Then ws.ShowAllData
    
    Dim lRow As Long
    
    With ws.Range("A2")
        Dim lCell As Range: Set lCell = .Resize(ws.Rows.Count - .Row + 1) _
            .Find("*", , xlFormulas, , , xlPrevious)
        If Not lCell Is Nothing Then lRow = lCell.Row
    End With
    
    If lRow = 0 Then
        Debug.Print "No data found."
    Else
        Debug.Print "The last row is row " & lRow & "."
    End If

End Sub

范围(更有用)

Sub ReferenceRange()

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    If ws.FilterMode Then ws.ShowAllData
       
    Dim rg As Range
    
    With ws.Range("A2")
        Dim lCell As Range: Set lCell = .Resize(ws.Rows.Count - .Row + 1) _
            .Find("*", , xlFormulas, , , xlPrevious)
        If Not lCell Is Nothing Then Set rg = .Resize(lCell.Row - .Row + 1)
    End With

    If rg Is Nothing Then
        Debug.Print "No data found."
    Else
        Debug.Print rg.Address(0, 0)
    End If

End Sub

Q&A

  • Q:以下是什么意思?
With ws.Range("A2")
    Set ... = .Resize(ws.Rows.Count - .Row + 1)   
End With
  • 答:这是一种引用范围A2:A1048576(旧版本中为A2:A65536)的方法,即要搜索的范围。
  • 问:以下是什么意思?
.Find("*", , xlFormulas, , , xlPrevious)
  • 答:这意味着这个操作只需要3个参数:第一个-What,第三个-LookIn,第六个-SearchDirection。第二个参数的默认参数After是范围的第一个单元格(在本例中为A2),第4个参数LookAt不相关,因为我们使用了通配符,而第5个参数,当在单列或单行中执行此操作时,SearchOrder无关紧要。最后3个参数(总共9个)不值得一提。
2o7dmzc5

2o7dmzc52#

这可能是“使用范围”不正确。使用范围包括任何曾经使用过的单元格,即有数据但随后数据被删除。
尝试在代码重新计算使用范围之前运行类似这样的代码。

Worksheets("Sheet1").UsedRange.Calculate

有时候这并不总是有效的。在这种情况下你可能想试试

With Worksheets("Sheet1")
    Debug.Print .UsedRange.Address
    .UsedRange.Clear
    Debug.Print .UsedRange.Address
End With

相关问题