50

我找到了这种方法来查找工作表中包含行的最后一个数据:

ws.Range("A65536").End(xlUp).row

是否有类似的方法来查找工作表中包含最后一个数据的列?

4

7 回答 7

93

很多方法可以做到这一点。最可靠的是找到。

Dim rLastCell As Range

Set rLastCell = ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)

MsgBox ("The last used column is: " & rLastCell.Column)

如果要查找特定行中使用的最后一列,可以使用:

Dim lColumn As Long

lColumn = ws.Cells(1, Columns.Count).End(xlToLeft).Column

使用已用范围(不太可靠):

Dim lColumn As Long

lColumn = ws.UsedRange.Columns.Count

如果 A 列中没有数据,则使用已用范围将不起作用。有关已用范围的另一个问题,请参见此处:

有关重置使用范围的信息,请参见此处。

于 2012-08-13T02:00:54.597 回答
18

我知道这是旧的,但我已经在很多方面进行了测试,它还没有让我失望,除非有人可以告诉我。

行号

Row = ws.Cells.Find(What:="*", After:=[A1] , SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

专栏信

ColumnLetter = Split(ws.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Cells.Address(1, 0), "$")(0)

列号

ColumnNumber = ws.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
于 2016-04-19T11:52:00.023 回答
2

激活工作表后尝试使用代码:

Dim J as integer
J = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

如果您Cells.SpecialCells(xlCellTypeLastCell).Row只使用,问题将是xlCellTypeLastCell信息不会被更新,除非您执行“保存文件”操作。但是使用UsedRange总是会实时更新信息。

于 2013-05-22T06:55:31.443 回答
2

我认为我们可以修改上面@ReadifyUsedRange答案中的代码以获取最后使用的列,即使起始列是否为空白也是如此。

所以这lColumn = ws.UsedRange.Columns.Count修改为

lColumn = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1将始终给出可靠的结果

在此处输入图像描述

?Sheet1.UsedRange.Column + Sheet1.UsedRange.Columns.Count - 1

9即时窗口中的收益率线上方。

于 2016-03-11T16:36:35.857 回答
0

这里有一些可能有用的东西。根据包含数据的行选择整个列,在这种情况下,我使用的是第 5 行:

Dim lColumn As Long

lColumn = ActiveSheet.Cells(5, Columns.Count).End(xlToLeft).Column
MsgBox ("The last used column is: " & lColumn)
于 2018-06-27T09:09:47.500 回答
0

我一直在使用@Reafidy 方法/答案很长一段时间,但今天我遇到了一个问题,第一行从 A1->N1 合并单元格,我的函数将“最后一列”返回为 1 而不是 14。

这是我修改后的函数,现在考虑可能合并的单元格:

Public Function Get_lRow(WS As Worksheet) As Integer
 On Error Resume Next
 If Not IsWorksheetEmpty(WS) Then
  Get_lRow = WS.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
  Dim Cell As Range
  For Each Cell In WS.UsedRange
   If Cell.MergeCells Then
    With Cell.MergeArea
     If .Cells(.Cells.Count).Row > Get_lRow Then Get_lRow = .Cells(.Cells.Count).Row
    End With
   End If
  Next Cell
 Else
  Get_lRow = 1
 End If
End Function

Public Function Get_lCol(WS As Worksheet) As Integer
 On Error Resume Next
 If Not IsWorksheetEmpty(WS) Then
  Get_lCol = WS.Cells.Find(What:="*", after:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
  Dim Cell As Range
  For Each Cell In WS.UsedRange
   If Cell.MergeCells Then
    With Cell.MergeArea
     If .Cells(.Cells.Count).Column > Get_lCol Then Get_lCol = .Cells(.Cells.Count).Column
    End With
   End If
  Next Cell
 Else
  Get_lCol = 1
 End If
End Function
于 2021-11-08T19:41:22.760 回答
0

如果您的数据从第一行开始,这是一个简单的选项。

MsgBox "Last Row: " + CStr(Application.WorksheetFunction.CountA(ActiveSheet.Cells(1).EntireRow))

它仅用于CountA计算整行中包含数据的列数。

这在各种情况下不起作用,例如,如果您有多个表共享顶行,但对于一些快速简单的事情,它可以完美运行。

于 2021-12-03T19:32:18.280 回答