【问题标题】:Find Last cell from Range VBA从范围 VBA 中查找最后一个单元格
【发布时间】:2017-05-12 19:48:58
【问题描述】:

如何从定义的范围中找到最后一个单元格的位置?单元格不必包含任何数据,但必须位于某个 Range 中最右侧和最下方的单元格。

Set rngOrigin = wksOrigin.Cells(IntFirstRow, IntFirstColumn).CurrentRegion

我希望收到

Cells(i,j)

【问题讨论】:

  • 这可能适用于一个简单的情况 cpearson.com/excel/cells.htm 与 set myrange=Range("A1:A10") 的情况,并在该链接使用东西重新索引 range ,并使用 myrange.Rows.Count

标签: vba range cell


【解决方案1】:

您可以尝试以下方法,但它依赖于始终填充单元格

rngOrigin.End(xlDown).End(xlRight)

或者您可以使用CurrentRegion 并计算行数和列数并使用Offset

或者,您可以使用这种结构,它甚至适用于基于整行或整列的范围。

Sub Test()
    Dim rngOrigin As Excel.Range
    Set rngOrigin = Range("$A$1:$D$6")

    Dim rngLast As Excel.Range
    Set rngLast = rngOrigin.Cells(rngOrigin.Cells.Count)
    Debug.Print rngLast.Address
End Sub

最后,对于具有多个区域的范围,您必须针对范围的 Areas 集合编写脚本...

Sub Test()
    Dim rngOrigin As Excel.Range
    Set rngOrigin = Range("$A$1:$D$6,$F$1:$G$6")
    
    Debug.Print rngOrigin.Areas(1).Cells(rngOrigin.Areas(1).Cells.Count).Address
    Debug.Print rngOrigin.Areas(2).Cells(rngOrigin.Areas(2).Cells.Count).Address

End Sub

【讨论】:

  • 这是错误的,因为 range end 属性只是移动到当前区域内的最后一个单元格。 End(xlDown) 或 End(XlToRight) 与 CTRL+arrowDown 或 CTRL+arrowRight 的作用相同,从给定范围的左上角单元格开始
  • @6diegodiego9 感谢您的反馈。我已经修改了答案。
【解决方案2】:

使用此代码查找给定范围内的最后一个单元格

Sub GetLastCellFromRange()
    Dim rng As Range

    Set rng = Range("$C$10:$E$20")

    'Set rng = Range(Selection.Address) ' Use this line to select the range in worksheet

    MsgBox "Last Cell of given range is : " & rng.Cells(rng.Rows.Count, rng.Columns.Count).Address
End Sub

希望对你有帮助

【讨论】:

  • 它没有为像 Worksheets(1).Range("a1:b4, d5:e6") 这样的非连续范围提供正确的最后一个单元格
【解决方案3】:

如果你想要定义范围的绝对最后一个单元格,不管它是否有任何内容,这里有一个简单的解决方案

Dim InputRng As Range    'define a range for the test'
Set InputRng = Range("$F$3:$F$15") 
MsgBox InputRng(1).Address & ":" & InputRng(InputRng.Cells.Count).Address    'This would output the absolute address of defined range' 

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @Dez:谢谢你的提示,有时间我会做的。
  • @就像我对 Dez 的回复一样,我会在有时间的时候这样做。我正在处理执行类似功能的 excel 中的 UDF,我首先检查了堆栈,但找不到任何有用的答案。最终,我从我在答案中链接的另一个网站获得了解决方案。我已经对其进行了测试,它工作正常。
  • 它没有为像 Worksheets(1).Range("a1:b4, d5:e6") 这样的非连续范围提供正确的最后一个单元格
【解决方案4】:

也许这就是你想要的:

Dim rngLastCell As Range
Set rngLastCell = rngOrigin(rngOrigin.Count)

【讨论】:

  • 不是最优雅的,但肯定是最短的。为我工作!
  • 对我来说似乎很优雅!
  • 如果范围是行或列,它将不起作用,因为例如 worksheets(1).rows("1:3").count 返回 3(行数)而不是总数这些行的单元格
  • 适用于任何范围的正确安全解决方案是 anyRange.Cells(anyRange.Cells.Count)
  • 没有。不幸的是,这些简短的解决方案不适用于 Worksheets(1).Range("a1:b3, d5:e6") 之类的非连续范围:-(
【解决方案5】:

其他人给出的答案大多有效,但如果该区域是非连续单元的联合体,则无效。这是一个适用于单区域和多区域(连续和非连续区域)的版本。

Function LastCellOfRange(rng As Excel.Range) As Excel.Range
  Dim area As Excel.Range
  Dim rowNum As Long
  Dim maxRow As Long
  Dim colNum As Long
  Dim maxCol As Long
  Dim areaIdx As Integer

  Set LastCellOfRange = Nothing

  maxRow = 0
  maxCol = 0
  For areaIdx = 1 To rng.Areas.Count
    Set area = rng.Areas(areaIdx)
    rowNum = area.Cells(area.Cells.Count).row
    If (rowNum > maxRow) Then
      maxRow = rowNum
    End If
    colNum = area.Cells(area.Cells.Count).Column
    If (colNum > maxCol) Then
      maxCol = colNum
    End If
  Next areaIdx

  Set LastCellOfRange = rng.Worksheet.Cells(maxRow, maxCol)
  Set area = Nothing
End Function

【讨论】:

    【解决方案6】:

    我在下面的代码中处理了它,但你的评论很有帮助。谢谢。

    intLastRow = rngOrigin.Cells(1, 1).Row + rngOrigin.Rows.Count - 1
    intLastCol = rngOrigin.Cells(1, 1).Column + rngOrigin.Columns.Count - 1
    

    【讨论】:

    • 那么你应该采用我的“绝对”代码,避免重复 rngOrigin 并使用(对我而言)更合适的范围规范
    • 您的解决方案没有为 Worksheets(1).Range("a1:b4, d5:e6") 等非连续范围提供正确的最后一个单元格
    【解决方案7】:

    也许你在追求这个:

    'absolute indexes from cell A1
    With rngOrigin
        i = .Rows(.Rows.count).row
        j = .Columns(.Columns.count).Column
    End With
    
    'relative indexes from rngOrigin upleftmost cell
    With rngOrigin
        i = .Rows(.Rows.count).row - .Rows(1).row + 1
        j = .Columns(.Columns.count).Column - .Columns(1).Column + 1
    End With
    

    【讨论】:

    • 它没有为像 Worksheets(1).Range("a1:b4, d5:e6") 这样的非连续范围提供正确的单元格
    【解决方案8】:

    在您的情况下,由于您想在wksOrigin(定义为工作表)中找到最右侧和最下方的单元格,您可以使用SpecialCells(xlCellTypeLastCell) 来获取最后一个单元格的行和列。

    i = wksOrigin.Cells.SpecialCells(xlCellTypeLastCell).Row ' <-- get last row number
    j = wksOrigin.Cells.SpecialCells(xlCellTypeLastCell).Column ' <-- get last column number
    

    如果你想调试你的结果,你可以添加:

    MsgBox "Last row at " & i & ", last column at " & j
    

    【讨论】:

    • 我想找到 Range 的最后一个单元格,它是当前区域,而不是整个工作表。如果工作表包含当前区域之外的数据,我不想包含它们。
    • 你定义的范围是多少?
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多