【问题标题】:Excel VBA: Finding last rowExcel VBA:查找最后一行
【发布时间】:2022-01-28 16:46:51
【问题描述】:

我正在尝试为每一列查找一组数字的最后一行,但似乎我的代码使用的最后一行与前一列的最后一行相同。

这是第一列的代码:

Dim WorkRng As Range
xTitleId = "Select Total Sales cell"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
WorkRng.Select
Selection.Copy
Range("A65") = "Total Sales"
Range("A66").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Set WorkRng = Range("A66")

这是相邻列的代码:

Dim WorkRng2 As Range
xTitleId2 = "Select Collected Range"
Set WorkRng2 = Application.Selection
Set WorkRng2 = Application.InputBox("Range", xTitleId2, WorkRng2.Address, Type:=8)
WorkRng2.Select
Selection.Copy
Range("B65") = "Collected Range"
Range("B66").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("B66:B100").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.Delete Shift:=xlUp
Range("B66").Select
Dim LastRow2 As Long
LastRow2 = Cells(Rows.Count, 1).End(xlUp).Row
Range("B" & LastRow2).Offset(1, 0).Formula = "=SUM(B66:B" & LastRow2 & ")"
Range("B" & LastRow2).Offset(1, 0).Select
Set WorkRng2 = Range("B" & LastRow2).Offset(1, 0)

它一直说 LastRow2 是 66,但是我希望它是动态的并且独立于第一列的最后一行。

非常感谢任何帮助

【问题讨论】:

  • LastRow2 = Cells(Rows.Count, 2).End(xlUp).Row。您有 1 个(A 列)而不是 2 个。
  • 太棒了,谢谢!

标签: vba excel


【解决方案1】:

您可以添加如下所示的 VBA 函数:

    Function GetLastRow(wsTarget As Worksheet, iCol)
    'Gets the last non-blank cell
    Dim lrow As Long, Max_Row

    Max_Row = 1048576
        On Error GoTo SmallFile

    TryAgain:
        With wsTarget
            lrow = .Cells(Max_Row, iCol).End(xlUp).Row
        End With

        GetLastRow = lrow

        Exit Function
    SmallFile:
        Max_Row = 65536
        On Error GoTo 0
        GoTo TryAgain

    End Function

然后,您指定要查找的工作表和列号。即 GetLastRow(worksheets("Sheet1"),1) 将返回 Sheet1 选项卡中 A 列的最后一行。

【讨论】:

    【解决方案2】:

    请注意,xlUp 获取最后一个 可见 行,如果存在过滤器,这可能会导致问题。因此,如果过滤器可能处于活动状态,请改用:

    Function getLastRow(col As String, ws As Worksheet) As Long
        Call removeFilters(ws)
        getLastRow = ws.Range(col & Rows.Count).End(xlUp).Row
    
    End Function
    
    Sub removeFilters(ws As Worksheet)
        On Error Resume Next
        ws.ShowAllData
    
    End Sub
    

    使用示例:

    dim rng as Range
    Set rng = Range("B1:B" & getLastRow("B", ActiveWorksheet))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 2022-10-24
      • 2013-07-20
      相关资源
      最近更新 更多