从Range VBA查找最后一个单元格

问题描述 投票:2回答:7

如何从定义的范围中找到最后一个单元格的位置?单元格不必包含任何数据,但必须是最正确的,并且大多数位于特定范围内的单元格中。

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

我希望收到

Cells(i,j)
vba range cell
7个回答
1
投票

也许你是在这之后:

'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

0
投票

尝试以下方法

rngOrigin.End(xlDown).End(xlRight)

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


0
投票

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

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

0
投票

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

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

0
投票

其他人给出的答案大多有效,但如果该地区是非连续细胞的联合则不行。这是一个适用于单区域和多区域,连续和非连续的版本。

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

0
投票

也许这就是你想要的:

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

-1
投票

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

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' 

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.