列号

时间:2018-04-10 00:15:15

标签: excel vba

我有一个列号,比如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)

但是有没有更容易的方法来找到列的完整使用范围给出它的数字?

5 个答案:

答案 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
  • 所以这个例子:

    img ...上述程序将返回:

答案 2 :(得分:1)

我首选的方法是使用ListObjects aka Excel Tables随时保存任何输入数据。 ListObjects是Excel代表您自动维护的命名范围,并且因为它们在添加新数据时会自动增长,它们为您提供了一种非常强大的方法,可以在VBA中引用Excel中的范围,这样可以更好地避免用户执行可能会破坏的事情。代码依赖于.End(xlUp)方法。

enter image description here

? Range("MyTable").ListObject.ListColumns("Column 1").DataBodyRange.Address
$A$3:$A$7

如果用户(或开发人员)稍后想要更改Table列名,并在我的代码中使用该名称,我通常会给相关列提供自己的命名范围。

enter image description here

? Range("FirstColumn").Address
$A$3:$A$7

如果某人(可能是我)在感兴趣的范围上方/左侧添加行/列或者对表列的顺序进行洗牌,或者更改列的名称,代码仍然引用预期的范围而不需要要改变。

enter image description here

? 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

其中rngaddyRange对象

当然,如果列没有“常量”单元格,则上述内容会失败,那么您可能需要添加一些错误捕获或条目检查(例如If WorksheetFunction.CountA(Columns(columnNumber)) = 0 Then Exit Sub