Excel 基于vba中的最后一列动态调整范围

Excel 基于vba中的最后一列动态调整范围,excel,vba,vba7,Excel,Vba,Vba7,我在excel中有一个表,我在其中插入了一些列,因为最后一列正在更改,我必须检测最后一列并将其设置为vba中的一个范围 我已经编写了查找最后一列并将其转换为字母表的代码,但是我无法将其设置为范围 Public Function ColumnLetter(ColumnNumber As Long) As String ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False), "$")(0) End Fun

我在excel中有一个表,我在其中插入了一些列,因为最后一列正在更改,我必须检测最后一列并将其设置为vba中的一个范围

我已经编写了查找最后一列并将其转换为字母表的代码,但是我无法将其设置为范围

Public Function ColumnLetter(ColumnNumber As Long) As String
ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False), "$")(0)
End Function

Dim Rng As Range
Dim LastColumn, LastRow As Long
Dim Str As String

LastRow = Cells(Rows.Count, 2).End(xlUp).Row
LastColumn = Cells(2, Columns.Count).End(xlToLeft).Column
Str = ColumnLetter(LastColumn)
'Set Rng = Range("M7:M" & LastRow)
我想把注释行写为

Set Rng = Range( & Str & "7" & LastRow)
让它充满活力
我该怎么做?

首先,将
Str
更改为其他内容;你在跟踪函数

Dim colLetter As String
colLetter = ColumnLetter(LastColumn)
然后根据需要连接:

Set Rng = Range(colLetter & "7:" & colLetter & LastRow)
请注意,您可以跳过使用列字母,只需将
单元格
与列索引一起使用即可

Set Rng = Range(Cells(7, LastColumn), Cells(LastRow, LastColumn))

首先,将
Str
更改为其他内容;你在跟踪函数

Dim colLetter As String
colLetter = ColumnLetter(LastColumn)
然后根据需要连接:

Set Rng = Range(colLetter & "7:" & colLetter & LastRow)
请注意,您可以跳过使用列字母,只需将
单元格
与列索引一起使用即可

Set Rng = Range(Cells(7, LastColumn), Cells(LastRow, LastColumn))

正如其他人指出的,Str不是最好的变量名。假设您将其更改为“ColLtr”。。。那么您的具体答案是
Range(ColLtr&“7:&ColLtr&LastRow)

然而,我可以建议另一种方法吗

如果试图将范围设置为所用范围的右下角,请使用:

With {sheet}.UsedRange
Set Rng = .Cells(.Rows.Count,.Columns.Count)
End With
(将{sheet}替换为
工作表(“MySheet”)
ActiveSheet
或以您喜欢的方式指定工作表。)

如果需要整个列,请将其调整为:

With {sheet}.UsedRange
Set Rng = .Columns(.Columns.Count)
End With

但是。。。如果“将范围格式化为表”(创建ListObject),则可以完全绕过VBA,在VBA或工作表公式中使用
[TableName[ColumnHeader]]
。当然,“TableName”和“ColumnHeader”将特定于表名和列标题中的实际文本。

正如其他人所指出的,Str不是最好的变量名。假设您将其更改为“ColLtr”。。。那么您的具体答案是
Range(ColLtr&“7:&ColLtr&LastRow)

然而,我可以建议另一种方法吗

如果试图将范围设置为所用范围的右下角,请使用:

With {sheet}.UsedRange
Set Rng = .Cells(.Rows.Count,.Columns.Count)
End With
(将{sheet}替换为
工作表(“MySheet”)
ActiveSheet
或以您喜欢的方式指定工作表。)

如果需要整个列,请将其调整为:

With {sheet}.UsedRange
Set Rng = .Columns(.Columns.Count)
End With

但是。。。如果“将范围格式化为表”(创建ListObject),则可以完全绕过VBA,在VBA或工作表公式中使用
[TableName[ColumnHeader]]
。当然,“TableName”和“ColumnHeader”将特定于您的表名和列标题中的实际文本。

旁注:
UsedRange
是在尝试查找最后一行/列数据时。感谢您指出这一点。我倾向于仍然使用它,并确保未使用的列和行被完全删除,因此我对这一怪癖没有太多考虑(因为我通常也是为非常有限的读者编写的)。附带说明:
UsedRange
是在尝试查找最后一行/列数据时。感谢您指出这一点。我倾向于仍然使用它,并确保未使用的列和行被完全删除,所以我不会对这个怪癖考虑太多(因为我通常也为非常有限的读者编写)。