Excel VBA:如何在当前选定区域的基础上扩展范围

11
我想做类似于以下内容的事情:
E18-(1,1) &":" &E18+(1,1)

我的意图是保留范围选择E18(值=B),并将其扩展到D16:F20

Cell_Image_Excel_Highlighted_B

如果我有一个单元格的范围E18,我想将范围扩展到D16:F20,该如何实现?


2
什么是扩展?如果您已经知道您的范围,例如 D16:F20,那么为什么不直接使用它来选择它呢? - Siddharth Rout
这是一个例子,假设我知道一个单元格的范围可以在工作表上的任何位置。我想要选择包括此单元格周围区域的内容。因此,我要扩展/展开。 - NCC
1
好的,一开始只有一个单元格吗? - Siddharth Rout
我已经尝试了resize,但似乎不起作用。 - NCC
1
Set newRange = Range("E18").Offset(-2,-1).Resize(5,3) - Tim Williams
显示剩余2条评论
6个回答

16

你是指像这样吗?

语法

ExpandRange [范围], [左侧列数], [顶部行数], [右侧列数], [向下行数]

Sub Sample()
    Debug.Print ExpandRange(Range("B5"), 1, 1, 1, 1)            '<~~ $A$4:$C$6
    Debug.Print ExpandRange(Range("A1"), 1, 1, 1, 1)            '<~~ Error
    Debug.Print ExpandRange(Range("XFD4"), 1, 1, 1, 1)          '<~~ Error
    Debug.Print ExpandRange(Range("XFD1048576"), 1, 1, 1, 1)    '<~~ Error
    Debug.Print ExpandRange(Range("E5"), 1, 1, 1, 1)            '<~~ $D$4:$F$6
End Sub

Function ExpandRange(rng As Range, lft As Long, tp As Long, _
rt As Long, dwn As Long) As String
    If rng.Column - lft < 1 Or _
       rng.Row - tp < 1 Or _
       rng.Column + rt > ActiveSheet.Columns.Count Or _
       rng.Row + dwn > ActiveSheet.Rows.Count Then
        ExpandRange = "Error"
        Exit Function
    End If

    ExpandRange = Range(rng.Offset(-1 * tp, -1 * lft).Address & ":" & _
                        rng.Offset(dwn, rt).Address).Address
End Function

13

这是我用来调整现有选择的简单代码。

Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count + 50).Select

这将使行数增加5,列数增加50。根据您的需要进行适应。


4
你可以使用Application.WorksheetFunction.Offset(),它比VBA的Offset更强大,并且可以执行问题所需的所有操作。 我认为它可以像Siddharth Rout ExpandRange一样做到,而不需要使用UDF。

只是一个快速的问题 - 我想我可能会在这里发布 - 如何将此范围添加到列表框中(作为值)。我尝试过 <code>Listbox1.List = ExpandRange("A1",0,0,1,1)</code>,我还尝试定义一个变量,但它返回错误:无法设置 List 属性。 - NCC
1
@NCC:你想做什么?将结果范围的值分配给列表框吗? - Siddharth Rout
是的,Siddharth Rout。看起来我对这个概念不熟悉,因为有时它能正常工作,有时却不能。 - NCC
我尝试过,但当我使用<code>.List</code>时,总是会出现“无法设置列表属性”的错误。 - NCC

2
Range(Cells(WorksheetFunction.Max(1, Selection.Row - 1), _
      WorksheetFunction.Max(1, Selection.Column - 1)), _
      Cells(WorksheetFunction.Min(Selection.Worksheet.Rows.Count, _
      Selection.Row + 1), _
      WorksheetFunction.Min(Selection.Worksheet.Columns.Count, _
      Selection.Column + 1))).Select

upd: thanks Siddharth Rout for formating my msg


2

如何在工作表的任何位置选择和扩展范围,到工作表的任何位置。

这是我的第一篇帖子。我知道我来晚了,显然大多数人比我更有经验和技能。所以我怀疑我的解决方案不包括他们的“大局”微妙考虑,但我已经验证它们对我有效,我希望它们对你们所有人也有效。

好的,回到问题。 以下是我如何做到的。

  • 示例一
    如果您从单元格E18开始,想要将范围扩展到D16:F20,则使用以下代码。只要您有足够的空间容纳整个范围,您的活动单元格实际上可以是任何位置,该范围将跟随它。

    Range(ActiveCell.Offset(-2, -1), ActiveCell.Offset(2, 1)).Select

  • 示例二
    如果您已经选择了一个范围,然后想要进一步扩展它(假设再向下2行,向右1列),则执行以下操作:

    Range(Selection, Selection.Offset(2, 1)).Select

  • 示例三
    如果您想要选择一系列连续包含数据的单元格范围,从活动单元格开始一直向下,直到遇到空单元格,然后还要添加左侧1列的单元格,则执行以下操作:

    Range(ActiveCell, Selection.End(xlDown).Offset(0, -1)).Select


0

我修改了上面的语法以返回一个范围,而不是返回绝对地址。感谢Siddharth Rout = )

Function ExpandRG(rng As Variant, lft As Long, tp As Long, rt As Long, dwn As Long) _
 As Range
 Set ws = rng.Parent
If rng.Column - lft < 1 Or _
   rng.Row - tp < 1 Or _
   rng.Column + rt > ActiveSheet.Columns.Count Or _
   rng.Row + dwn > ActiveSheet.Rows.Count Then
        MsgBox "Out of range"
        Exit Function
End If

 Set rng = ws.Range(rng.Offset(-1 * tp, -1 * lft).Address & ":" & _
                    rng.Offset(dwn, rt).Address)                        
End Function

Sub aa()
Dim ori_add, O_add, New_add As Range
Set ori_add = Range("B2")
Set O_add = ori_add

Call ExpandRG(ori_add, 1, 1, 1, 1)
Set New_add = ori_add

MsgBox "Original address " & O_add.Address & ", new address is" & New_add.Address
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接