返回带间隙的范围的最后一列的列号

时间:2016-05-26 17:35:57

标签: excel-vba vba excel

我打算做的是一个宏,它将根据用户选择的两列数据构建散点图。我需要以某种方式得到第二列选择的内容,以便我可以使用正确的标题。

到目前为止,我已尝试过以下内容:

myrng.Columns(myrng.Columns.Count).Column 

这只返回1,因为范围内存在间隙。

是否有另一种方法可以处理其中存在间隙的范围,或者是否有可能采用不同的方式绘制数据,然后查找第二个选定的列是什么?

1 个答案:

答案 0 :(得分:1)

如果 r 是某个已定义的范围,则其限制为:

<击>

<击>
nLastRow = r.Rows.Count + r.Row - 1
MsgBox ("last row " & nLastRow)

nLastColumn = r.Columns.Count + r.Column - 1
MsgBox ("last column " & nLastColumn)

nFirstRow = r.Row
MsgBox ("first row " & nFirstRow)

nFirstColumn = r.Column
MsgBox ("first column " & nFirstColumn)

numrow = r.Rows.Count
MsgBox ("number of rows " & numrow)

numcol = r.Columns.Count
MsgBox ("number of columns " & numcol)

<击>

修改#1:

这适用于任何范围,紧凑或不相交。如果范围完全是空的,它甚至可以工作。 但是,如果范围包含许多单元格,则sub将非常慢。

Sub SlowAgony()
    Dim myrange As Range, r As Range, nLastColumn As Long
    Set myrange = Union(Range("C1:C100"), Range("G1:G100"))

    nLastColumn = 0
    For Each r In myrange
        If r.Column > nLastColumn Then nLastColumn = r.Column
    Next r

    MsgBox nLastColumn
End Sub

修改#2:

这种方式更快:

Sub ytrewq()
    Dim r As Range, addy As String, ary
    Dim nLastColumn As Long, rr As Range
    Set r = Selection
    addy = r.Address(0, 0)

    If InStr(1, addy, ",") = 0 Then
        nLastColumn = r.Columns.Count + r.Column - 1
    Else
        ary = Split(addy, ",")
        nLastColumn = 0
        For Each a In ary
            Set rr = Range(a)
            If rr.Columns.Count + rr.Column - 1 > nLastColumn Then
                nLastColumn = rr.Columns.Count + rr.Column - 1
            End If
        Next a
    End If

    MsgBox nLastColumn
End Sub

最后一个例程检查了不相交范围的紧凑分量。