如何在多个非连续范围的选择中更改所选范围的一部分

时间:2014-01-22 13:27:13

标签: arrays vba excel-vba multipleselection excel

我将尝试通过仅关注问题并解决所有非必要的问题/脚本来说明场景。

用户选择多个非连续的单元格。 VBA会做一些事情......然后插入一列。 如果所选单元恰好位于列的右侧,则内容将移动原始选定单元格的一列。我需要在退出sub之前重新选择具有原始内容的单元格。

例如,

  1. 用户选择“A1”,“C3”和“D4:E6”。
  2. vba在“B”处插入一列
  3. 现在“C3”和“D4:E6”的内容移至“D3”和“E4:F6”
  4. 我需要vba在退出sub之前选择“A1”,“D3”和“E4:F6”。
  5. 我考虑过几种方法:

    1. 将整个选择偏移到右侧一列。

      selection.offset(0,1).select

      这不是一个好的解决方案,因为“A1”会移动到“B1”。只有当用户选择的单元格全部位于插入列的右侧时才可以。

    2. 将选择的每个单元格(选定范围)放入数组中。更改受影响的细胞范围。并使用vba再次选择它们。问题是我写的vba不能一次选择整个范围数组(多个不连续的单元格)。它只选择数组中的最后一个单元格。以下是汇总代码:

      Sub mtArea()
      
      Dim Cell, Rg, sRg() As Range
      Dim h, i, j, k, noCell, Cnt As Long
      Set Rg = Selection
      
      noCell = Rg.Cells.Count
      k = 0
      
      ' assign each cell in selection to a specific array
      
      If Rg.Areas.Count > 1 Then
         ReDim sRg(noCell)
         For Each Cell In Rg
            k = k + 1
            Set sRg(k) = Cell
         Next Cell
      End If
      
      ' select the new located cells
      
      For i = 1 To noCell
       If sRg(i).Column > 5 Then ' assuming insert column is "E"
         h = 1
       Else
         h = 0
       End If
      sRg(i).Offset(0, h).Select
      Next i
      
      End Sub
      

      在这种情况下,仅选择原始范围中的最后一个单元格。有没有办法选择整个sRg()范围数组?

    3. 我也希望以这种方式探索:

      Dim Rg as Range
      Set Rg = Selection
      

      当用户选择多个不连续的单元格时,是否有办法让vba更改Rg变量中的单个单元格范围位置?

    4. 该方法应该是什么?

      谢谢。

2 个答案:

答案 0 :(得分:0)

试试这个

Sub InsertDemo()
    InsertAndAdjustSelection 2

End Sub

Sub InsertAndAdjustSelection(Col As Long)
    Dim strAddress() As String
    Dim i As Long

    ' Save adresses of selected cells
    strAddress = Split(Selection.Address, ",")

    ' Insert Column
    Columns(Col).Insert

    ' Unpdate saved addresses
    For i = 0 To UBound(strAddress)
        If Range(strAddress(i)).Column >= Col Then
            strAddress(i) = Range(strAddress(i)).Offset(, 1).Address
        End If
    Next

    ' Select range
    Range(Join(strAddress, ",")).Select
End Sub

答案 1 :(得分:0)

如果您为该范围指定名称,则会在插入列后调整单元格:

Sub RememberTheCells()
    Range("A1,C3,D4:E6").Select
    Selection.Name = "Previous"
    Columns("B:B").Insert Shift:=xlToRight
    Range("Previous").Select
    MsgBox Selection.Address
End Sub