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.countlastColumn = ActiveSheet.UsedRange.Columns.Count

【讨论】:

【参考方案6】:

我尝试使用:

Range(cells(1, 1), cells(lastRow, lastColumn)).Select 

其中lastRowlastColumn 是整数,但收到运行时错误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:按变量选择范围的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vba 选择粘贴范围

在 VBA 中选择特定的工作表和范围

VBA-如何选择具有值的列单元格

Excel VBA 输入框 - 选择范围(类型 8)但不是固定范围,即 A1 不是 $A$1

Excel VBA - 如何选择范围向下到第一个空白单元格

选择特定范围的单元格并仅删除突出显示的单元格并向上移动的 VBA