我想以下列方式使用空范围:
Set NewRange = Union(EmptyRange, SomeRange)
我试图设置EmptyRange
使用为空的范围Nothing
,Empty
并Null
而是 “运行时错误‘5’无效的过程调用或参数”出现,看来我必须使用If
语句或有是做这项工作的其他关键字?
我可以用 :
If EmptyRange Is Nothing Then
Set NewRange = SomeRange
Else
Set NewRange = Union(EmptyRange, SomeRange)
End If
Run Code Online (Sandbox Code Playgroud)
而不是建设:
Set NewRange = Union(EmptyRange, SomeRange)
Run Code Online (Sandbox Code Playgroud)
Application.Union
当我需要组合多个对象时,我使用此函数作为替代range
,其中“零个或多个”范围可能是Nothing
:
Function union(ParamArray rgs() As Variant) As Range\n Dim i As Long\n For i = 0 To UBound(rgs())\n If Not rgs(i) Is Nothing Then\n If union Is Nothing Then Set union = rgs(i) Else Set union = Application.union(union, rgs(i))\n End If\n Next i\nEnd Function\n
Run Code Online (Sandbox Code Playgroud)\n用法示例:
\nSub demo_union()\n Dim rg1 As Range, rg2 As Range, rg3 As Range, newRg As Range\n Set rg1 = Range("A1")\n Set rg3 = Range("C3")\n Set newRg = union(rg1, rg2, rg3)\n newRg.Select\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n下面是一个变体,它不会在返回的范围中重复重叠的单元格。
\n通常,当将重叠范围(例如,A1:B2
和B2:C3
)与Application.Union
(或上面的函数)组合时,结果将具有重叠单元格的多个副本。
例如使用
\n
Application.Union([A1:B2], [B2:C3]).Cells.Count \'8 cells (repeats B2)\n
Run Code Online (Sandbox Code Playgroud)\n\xe2\x86\x91 ...返回8 个单元格:\n(循环将进行 8 次迭代。)A1
B1
A2
B2
B2
C2
B3
C3
For Each
函数union2
(如下)通过仅返回唯一的单元格解决了这个问题,并且还处理空范围(不会产生令人烦恼的模糊"Invalid Procedure call or argument"
)
Debug.Print union2([A1:B2], [B2:C3]).Cells.Count \'7 cells\n
Run Code Online (Sandbox Code Playgroud)\n\xe2\x86\x91 ...返回7 个单元格:A1
B1
A2
B2
C2
B3
C3
\n(For Each
循环将进行 7 次迭代。)