我想以下列方式使用空范围: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
而不是 build :
Set NewRange = Union(EmptyRange, SomeRange)
最佳答案
我用这个函数代替Application.Union
当我需要合并几个 range
对象,其中“零个或多个”范围可能是 Nothing
:
Function union(ParamArray rgs() As Variant) As Range
Dim i As Long
For i = 0 To UBound(rgs())
If Not rgs(i) Is Nothing Then
If union Is Nothing Then Set union = rgs(i) Else Set union = Application.union(union, rgs(i))
End If
Next i
End Function
示例用法:Sub demo_union()
Dim rg1 As Range, rg2 As Range, rg3 As Range, newRg As Range
Set rg1 = Range("A1")
Set rg3 = Range("C3")
Set newRg = union(rg1, rg2, rg3)
newRg.Select
End Sub
以下是 的变体不复制重叠单元格在返回的范围内。
通常在将重叠范围(例如
A1:B2
和 B2:C3
)与 Application.Union
组合时(或上面的函数),结果将有多个重叠单元格的副本。例如使用,
Application.Union([A1:B2], [B2:C3]).Cells.Count '8 cells (repeats B2)
↑ ...返回 8 单元格:A1
B1
A2
B2
B2
C2
B3
C3
(而 For Each
循环将有 8 次迭代。)功能
union2
(下)通过仅返回唯一单元格来解决此问题,并且还处理空范围(不会产生令人讨厌的模糊 "Invalid Procedure call or argument"
)Debug.Print union2([A1:B2], [B2:C3]).Cells.Count '7 cells
↑ ...返回 7 单元格:A1
B1
A2
B2
C2
B3
C3
( For Each
循环将有 7 次迭代。)
关于excel - 如何在 VBA 中设置和使用空范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27554867/