我有一个列号,比如columnNumber = 4
。我需要这个专栏的使用范围。我知道如何找到最后使用的行,我可以将列号转换为列号,如此
ColumnLetter = Split(Cells(1, ColumnNumber).Address, "$")(1)
LastRow = sht.Cells(sht.Rows.Count, ColumnLetter).End(xlUp).Row
然后构建一个像这样的地址
rngaddy = ColumnLetter & "1:" & ColumnLetter & LastRow
最后做
Range(rngaddy)
但是有没有更容易的方法来找到列的完整使用范围给出它的数字?
答案 0 :(得分:3)
Dim rngaddy As Range
With Sheet1
Set rngaddy = .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp))
End With
如果出于某种原因,您希望以A1
表示法查看地址,只需:
debug.print rngaddy.address
请注意,这样做时,rngaddy
本身就是范围对象而不是字符串。所以不需要Range(rngaddy)
答案 1 :(得分:1)
您可以使用以下内容返回最后一个已填充的单元格#col
:
MsgBox Cells(sht.Rows.Count,col).End(xlUp).Address
如果您还想返回第一个填充的单元格,可以使用:
MsgBox IIf(IsEmpty(Cells(1,col)),Cells(1,col).End(xlDown),Cells(1,col)).Address
因此,这只会返回"使用过的"第#4(D)栏的范围:
Sub Example_GetUsedRangeOfColumn()
Const col = 4
Dim sht As Worksheet
Set sht = Sheets("Sheet1")
MsgBox Range(IIf(IsEmpty(Cells(1, col)), Cells(1, col).End(xlDown), _
Cells(1, col)), Cells(sht.Rows.Count, col).End(xlUp)).Address
End Sub
答案 2 :(得分:1)
我首选的方法是使用ListObjects aka Excel Tables随时保存任何输入数据。 ListObjects是Excel代表您自动维护的命名范围,并且因为它们在添加新数据时会自动增长,它们为您提供了一种非常强大的方法,可以在VBA中引用Excel中的范围,这样可以更好地避免用户执行可能会破坏的事情。代码依赖于.End(xlUp)方法。
? Range("MyTable").ListObject.ListColumns("Column 1").DataBodyRange.Address
$A$3:$A$7
如果用户(或开发人员)稍后想要更改Table列名,并在我的代码中使用该名称,我通常会给相关列提供自己的命名范围。
? Range("FirstColumn").Address
$A$3:$A$7
如果某人(可能是我)在感兴趣的范围上方/左侧添加行/列或者对表列的顺序进行洗牌,或者更改列的名称,代码仍然引用预期的范围而不需要要改变。
? Range("FirstColumn").Address
$C$4:$C$8
? Range(Range("FirstColumn").Address & ":" & Range("FirstColumn").EntireColumn.cells(1).address).Address
$C$1:$C$8
当然,从顶部单元格(可能在ListObject之上)到相关列的底部获取范围的方法有点长,但是一旦你开始在代码中使用ListObjects,你通常就不在乎了什么在他们之上或之下...你只是想把货物放在里面。
我没有使用.End(xlUp)多年,除了找到我的数据结束的地方,我应该在将它变成ListObject的过程中。但我是ListObject福音传道者......你的里程可能会有所不同: - )
答案 3 :(得分:1)
或
Option Explicit
Public Sub test()
Const columnNumber As Long = 4
Dim rngaddy As Range
Set rngaddy = Intersect(Columns(2), ActiveSheet.UsedRange): Debug.Print rngaddy.Address
End Sub
答案 4 :(得分:0)
获取您可以使用的真实 UsedRange
列:
With Columns(columnNumber).SpecialCells(xlCellTypeConstants)
Set rngaddy = .Parent.Range(.Areas(1), .Areas(.Areas.Count))
End With
其中rngaddy
是Range
对象
当然,如果列没有“常量”单元格,则上述内容会失败,那么您可能需要添加一些错误捕获或条目检查(例如If WorksheetFunction.CountA(Columns(columnNumber)) = 0 Then Exit Sub