VBA 查找包含未知列的最后一行,以及包含未知行的最后一列
VBA to Find Last Row with unknown column, and Last Column with unknown row
要查找最后一行或最后一列,我通常会使用如下内容:
LR = Cells(Rows.Count, 1).End(xlUp).Row
LC = Cells(1, Columns.Count).End(xlToLeft).Column
但是,在没有列 headers 的情况下,我试图找到最右边的包含数据的列,而我希望找到的列可能是 B 列(即“B27 ") 或者它可以是 Z 列(即 "Z1000"),或任何随机单元格。
同样,我也在尝试在没有列 headers 的同一 sheet 上找到最后一行,其中最后一行可以在任何列中。
知道如何做到这一点可能会在几种情况下有所帮助,但为了详细说明我当前的情况,我正在尝试连接从其他来源复制的一些行并且有很多选项卡。有时制表符在行首,有时在中间。这当然会将每一行推入多个单元格,有时会非常靠右。
通常这些文档不超过 10k 行,所以我想写一个“brute-force”类型的代码,如:
Private Sub Concatenate_20k_Rows()
Dim ws As Worksheet
Dim cell As Range
Dim LC As Long, i As Long
Set ws = ActiveSheet
For Each cell In ws.Range("A1:A20000")
LC = Cells(cell.Row, Columns.Count).End(xlToLeft).Column
For i = 1 To LC
cell.Value = cell.Value & " " & cell.Offset(0, i).Value
Next i
cell.Value = Application.Trim(cell.Value)
Next cell
End Sub
我想找到最后一列未知的 headers 对我的场景来说并不重要,但找到最后一行可能很有用,所以我不必 brute-force 到 20k行,如果只有 2k 行,或者如果我有超过 20k 行,则不必冒险走得不够远。
您可以使用Range.Find
方法。
如所写,这将 return 一个 2 元素数组,其中
- 第一个元素=行号
- 第二个元素 = 列号。
Option Explicit
Function LastRC(Worksht As String) As Long()
'Uncomment if on worksheet
'Application.Volatile
Dim WS As Worksheet, R As Range
Dim LastRow As Long, LastCol As Long
Dim L(1) As Long
Dim searchRng As Range
Set WS = Worksheets(Worksht)
Set searchRng = WS.Cells
With searchRng
Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
searchdirection:=xlPrevious)
If Not R Is Nothing Then
LastRow = R.Row
LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
searchdirection:=xlPrevious).Column
Else
LastRow = 1
LastCol = 1
End If
End With
L(0) = LastRow
L(1) = LastCol
LastRC = L
End Function
要查找最后一行或最后一列,我通常会使用如下内容:
LR = Cells(Rows.Count, 1).End(xlUp).Row
LC = Cells(1, Columns.Count).End(xlToLeft).Column
但是,在没有列 headers 的情况下,我试图找到最右边的包含数据的列,而我希望找到的列可能是 B 列(即“B27 ") 或者它可以是 Z 列(即 "Z1000"),或任何随机单元格。
同样,我也在尝试在没有列 headers 的同一 sheet 上找到最后一行,其中最后一行可以在任何列中。
知道如何做到这一点可能会在几种情况下有所帮助,但为了详细说明我当前的情况,我正在尝试连接从其他来源复制的一些行并且有很多选项卡。有时制表符在行首,有时在中间。这当然会将每一行推入多个单元格,有时会非常靠右。
通常这些文档不超过 10k 行,所以我想写一个“brute-force”类型的代码,如:
Private Sub Concatenate_20k_Rows()
Dim ws As Worksheet
Dim cell As Range
Dim LC As Long, i As Long
Set ws = ActiveSheet
For Each cell In ws.Range("A1:A20000")
LC = Cells(cell.Row, Columns.Count).End(xlToLeft).Column
For i = 1 To LC
cell.Value = cell.Value & " " & cell.Offset(0, i).Value
Next i
cell.Value = Application.Trim(cell.Value)
Next cell
End Sub
我想找到最后一列未知的 headers 对我的场景来说并不重要,但找到最后一行可能很有用,所以我不必 brute-force 到 20k行,如果只有 2k 行,或者如果我有超过 20k 行,则不必冒险走得不够远。
您可以使用Range.Find
方法。
如所写,这将 return 一个 2 元素数组,其中
- 第一个元素=行号
- 第二个元素 = 列号。
Option Explicit
Function LastRC(Worksht As String) As Long()
'Uncomment if on worksheet
'Application.Volatile
Dim WS As Worksheet, R As Range
Dim LastRow As Long, LastCol As Long
Dim L(1) As Long
Dim searchRng As Range
Set WS = Worksheets(Worksht)
Set searchRng = WS.Cells
With searchRng
Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
searchdirection:=xlPrevious)
If Not R Is Nothing Then
LastRow = R.Row
LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
searchdirection:=xlPrevious).Column
Else
LastRow = 1
LastCol = 1
End If
End With
L(0) = LastRow
L(1) = LastCol
LastRC = L
End Function