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

Excel 返回带间隙范围的最后一列的列数,excel,vba,Excel,Vba,我打算制作一个宏,它将根据用户选择的两列数据构建散点图。我需要以某种方式获得所选的第二列内容,以便使用正确的标题 到目前为止,我已经尝试了以下方法: myrng.Columns(myrng.Columns.Count).Column 这只返回1,因为范围中存在间隙 是否有另一种方法可以处理有间隙的范围,或者是否有其他方法绘制数据,然后找到第二个选定列是什么?如果r是某个定义的范围,则其限制为: 编辑#1: 这将适用于任何范围,紧凑或不相交。如果范围完全为空,它甚至可以工作但是,如果该区域

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

到目前为止,我已经尝试了以下方法:

myrng.Columns(myrng.Columns.Count).Column 
这只返回1,因为范围中存在间隙


是否有另一种方法可以处理有间隙的范围,或者是否有其他方法绘制数据,然后找到第二个选定列是什么?

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

编辑#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

最后一个例程检查不相交区域的压缩组件。

在Visual Basic编辑器中,手动录制一个宏,当完成点击停止录制时,转到宏并编辑刚刚录制的宏。在那里你可以看到相关的代码来完成你刚才手动完成的工作,然后你可以根据自己的需要进行增强。我知道excel中的记录功能。但是,我无法看到如何使用此函数返回列号。
lastCol=ws.Cells(1,ws.Columns.count).End(xlToLeft).column
?在录制的宏中,它肯定会告诉您为第二个系列选择的范围,因此请从该范围中获取列号。这通常对我有用,但有数据在选择范围之外,并且该方法没有将其限制为“myrng”。这适用于没有间隙的范围,但不适用于我的范围,因为它有间隙。也就是说,我正在选择第3列和第7列,但它不会返回第7列。@Corus请看我的编辑#1:令人印象深刻!多谢各位@康力斯你的问题很有启发性。
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