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