我的问题是如何从范围对象中删除一个或多个单元格?之前我问过类似的问题,有人指出了这个问题:Remove cell from Range (object)
接受的答案:
Function getExcluded(ByVal rngMain As Range, rngExc As Range) As Range
Dim rngTemp As Range
Dim rng As Range
Set rngTemp = rngMain
Set rngMain = Nothing
For Each rng In rngTemp
If rng.Address <> rngExc.Address Then
If rngMain Is Nothing Then
Set rngMain = rng
Else
Set rngMain = Union(rngMain, rng)
End If
End If
Next
Set getExcluded = rngMain
End Function
Sub test()
MsgBox getExcluded(Range("A1:M10000"), Range("a10")).Address
End Sub
接受的答案仅在排除范围是单个单元格的情况下有效-至少我尝试过的情况就是这样。我要排除的单元通常有一个以上的单元,因此我尝试修改代码:
我的尝试:
Function getExcluded(ByVal rngMain As Range, rngExcl As Range) As Range
Dim rngTemp As Range
Dim cellTemp As Range, cellExcl As Range
Set rngTemp = rngMain
Set rngMain = Nothing
For Each cellTemp In rngTemp 'go through all cells in established range
If Intersect(cellTemp, rngExcl) Is Nothing Then 'check for each cell if it intersects with the range to be excluded; no overlap -> put it into rngMain
If rngMain Is Nothing Then
Set rngMain = cellTemp
Else
rngMain = Union(rngMain, cellTemp)
End If
Debug.Print "cellTemp: " & cellTemp.Address
Debug.Print "rngMain: " & rngMain.Address
End If
Next cellTemp
Set getExcluded = rngMain
Sub test5()
getExcluded(Range("A1:D3"), Range("B1:C1")).Select
End Sub
问题似乎出现在Set rngMain = Union(rngMain, rng)
行中。我的Debug.Print
语句告诉我cellTemp
正在按应有的方式进行迭代;但是,即使执行Union
的行并且无论cellTemp
是什么,rngMain
仍为$A$1
我做错了什么?
类似这样,也设置联合范围
Function testexclude(rngMain As Excel.Range, rngExclude As Excel.Range) As Excel.Range
Dim c As Excel.Range
Dim r As Excel.Range
For Each c In rngMain
If Intersect(c, rngExclude) Is Nothing Then
If r Is Nothing Then
Set r = c
Else
Set r = Union(r, c)
End If
End If
Next c
Set testexclude = r
End Function