VBA:按变量选择范围
Posted
技术标签:
【中文标题】VBA:按变量选择范围【英文标题】:VBA: Selecting range by variables 【发布时间】:2021-12-13 22:56:35 【问题描述】:我想选择 Excel 工作表的格式化范围。 要定义最后一行和第一行,我使用以下函数:
lastColumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
下一步我要选择这个区域: 公式应如下所示:
Range(cells(1, 1), cells(lastRow, lastColumn).Select
但是,这不起作用。也许有人知道它有什么问题。非常感谢!
【问题讨论】:
究竟是什么不工作?我尝试用随机数据填充 B2 到 D4 的范围,您的代码选择了 A1 到 D4。这不是你所期望的吗? 【参考方案1】:我用“相对引用”录制了一个宏,这就是我得到的:
Range("F10").Select
ActiveCell.Offset(0, 3).Range("A1:D11").Select
这就是我的想法:如果范围选择用引号引起来,VBA 真的想要一个字符串并解释其中的单元格,所以尝试了以下操作:
Dim MyRange as String
MyRange = "A1:D11"
Range(MyRange).Select
它起作用了 :) 即.. 只需使用您的变量创建一个字符串,确保将其标注为 STRING 变量,Excel 会立即读取它;)
经过测试并发现有效:
Sub Macro04()
Dim Copyrange As String
Startrow = 1
Lastrow = 11
Let Copyrange = "A" & Startrow & ":" & "D" & Lastrow
Range(Copyrange).Select
End Sub
【讨论】:
【参考方案2】:我遇到了类似的情况 - 我想根据一些变量创建一个范围。使用 Worksheet.Cells 不能直接工作,因为我认为单元格的值已传递给 Range。
这确实有效:
Range(Cells(1, 1).Address(), Cells(lastRow, lastColumn).Address()).Select
这负责将单元格的数字位置转换为 Range 所期望的,即 A1 格式。
【讨论】:
谢谢,我花了一上午的时间试图弄清楚如何解决语法问题。 :) 谢谢你拯救了我的一天!【参考方案3】:如果您只想选择使用的范围,请使用
ActiveSheet.UsedRange.Select
如果要从A1选择到使用范围的末尾,可以像这样使用SpecialCells方法
With ActiveSheet
.Range(.Cells(1, 1), .Cells.SpecialCells(xlCellTypeLastCell)).Select
End With
有时 Excel 会混淆最后一个单元格是什么。它永远不会比实际使用的范围更小,但如果某些单元格被删除,它可能会更大。为避免这种情况,您可以使用 Find 和星号通配符来查找真正的最后一个单元格。
Dim rLastCell As Range
With Sheet1
Set rLastCell = .Cells.Find("*", .Cells(1, 1), xlValues, xlPart, , xlPrevious)
.Range(.Cells(1, 1), rLastCell).Select
End With
最后,请确保仅在确实需要时进行选择。您需要在 Excel VBA 中执行的大部分操作都可以直接对 Range 执行,而不是先选择它。而不是
.Range(.Cells(1, 1), rLastCell).Select
Selection.Font.Bold = True
你可以
.Range(.Cells(1,1), rLastCells).Font.Bold = True
【讨论】:
【参考方案4】:你缺少一个右括号,I.E.你没有关闭Range()
。
试试这个Range(cells(1, 1), cells(lastRow, lastColumn)).Select
但是你真的应该看看 Dick Kusleika 的另一个答案,寻找可能对你更好的替代方案。具体来说,ActiveSheet.UsedRange.Select
与您的代码具有相同的最终结果。
【讨论】:
【参考方案5】:您将它们转换为地址,但 Cells(#,#) 使用整数输入而不是地址输入,因此只需使用 lastRow = ActiveSheet.UsedRange.Rows.count
和 lastColumn = ActiveSheet.UsedRange.Columns.Count
【讨论】:
【参考方案6】:我尝试使用:
Range(cells(1, 1), cells(lastRow, lastColumn)).Select
其中lastRow
和lastColumn
是整数,但收到运行时错误1004。我使用的是较旧的VB (6.5)。
起作用的是使用以下内容:
Range(Chr(64 + firstColumn) & firstRow & ":" & Chr(64 + lastColumn) & firstColumn).Select.
【讨论】:
其实 firstColumn 应该是 lastRow ==> Range(Chr(64 + firstColumn) & firstRow & ":" & Chr(64 + lastColumn) & lastRow).Selec以上是关于VBA:按变量选择范围的主要内容,如果未能解决你的问题,请参考以下文章