我将尝试通过仅关注问题并解决所有非必要的问题/脚本来说明场景。
用户选择多个非连续的单元格。 VBA会做一些事情......然后插入一列。 如果所选单元恰好位于列的右侧,则内容将移动原始选定单元格的一列。我需要在退出sub之前重新选择具有原始内容的单元格。
例如,
我考虑过几种方法:
将整个选择偏移到右侧一列。
selection.offset(0,1).select
这不是一个好的解决方案,因为“A1”会移动到“B1”。只有当用户选择的单元格全部位于插入列的右侧时才可以。
将选择的每个单元格(选定范围)放入数组中。更改受影响的细胞范围。并使用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()范围数组?
我也希望以这种方式探索:
Dim Rg as Range
Set Rg = Selection
当用户选择多个不连续的单元格时,是否有办法让vba更改Rg变量中的单个单元格范围位置?
该方法应该是什么?
谢谢。
答案 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