【问题标题】:Excel VBA: How to Extend a Range Given a Current SelectionExcel VBA:如何在给定当前选择的情况下扩展范围
【发布时间】:2020-08-02 11:21:29
【问题描述】:

我想做类似的事情:

E18-(1,1) &":" &E18+(1,1)

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

如果我的单元格范围为E18,并且我想将范围扩展到D16:F20,我该怎么做?

【问题讨论】:

  • 扩展是什么意思。如果您已经知道您的范围 ex D16:F20 那么为什么不直接使用它来选择它呢?
  • 这是一个示例,假设我知道单元格的范围可以在工作表中的任何位置。我想做出一个选择,包括这个单元格的周边区域。所以我想扩展/扩展。
  • 好的,开始时只有一个单元格吗?
  • 是的,只有一个。哪个是单元格地址 A1、B3 等
  • Set newRange = Range("E18").Offset(-2,-1).Resize(5,3)

标签: excel vba selection


【解决方案1】:

你的意思是这样的?

语法

ExpandRange [Range]、[左侧列数]、[顶部行数]、[编号右侧的列数],[向下行数]

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

【讨论】:

  • 谢谢你的回答,是的,这就是我要找的。​​span>
【解决方案2】:

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

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

这将使行数增加 5,列数增加 50。适应您的需求。

【讨论】:

    【解决方案3】:

    您可以使用Application.WorksheetFunction.Offset(),它比 VBA 的 Offset 更丰富,可以完成问题所需的一切。
    我认为它和 Siddharth Rout ExpandRange 一样,不需要 UDF。

    【讨论】:

    • 只是一个快速的问题-我想我可能会在这里发布-如何将此范围添加到列表框(作为值)。我尝试了 Listbox1.List = ExpandRange("A1",0,0,1,1) 我也尝试定义一个变体,但它返回错误:无法设置列表属性。
    • @NCC:你想做什么?将结果范围的值分配给列表框?
    • 是的,Siddharth Rout。似乎我不太了解这个概念,因为有时我可以使用它,有时我不会。
    • 我试过了,但我总是在使用 .List 时无法设置列表属性
    【解决方案4】:
    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:感谢 Siddharth Rout 格式化我的消息

    【讨论】:

      【解决方案5】:

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

      这是我的第一篇文章。我知道我参加聚会有点晚了,对我来说很明显,这里的大多数人都比我更有经验和技能。所以我怀疑我的解决方案是否包含了他们“大局”的细微差别考虑,但我已经证实它们对我有用,我希望它们也对你们所有人有用。

      好的,回到问题。 这是我的做法。

      • 示例一
        要针对您的问题提出的确切情况执行此操作,如果您从 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

      【讨论】:

        【解决方案6】:

        我没有返回绝对地址,而是修改了上面的语法以返回一个范围。归功于 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
        

        【讨论】:

          猜你喜欢
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          相关资源
          最近更新 更多