如何在 VBA 中设置和使用空范围?

Qbi*_*bik 6 excel vba

我想以下列方式使用空范围:

Set NewRange = Union(EmptyRange, SomeRange)

我试图设置EmptyRange使用为空的范围NothingEmptyNull而是 “运行时错误‘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)

ash*_*awg 3

Application.Union当我需要组合多个对象时,我使用此函数作为替代range,其中“零个或多个”范围可能是Nothing

\n
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

用法示例:

\n
Sub 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

下面是一个变体,它不会在返回的范围中重复重叠的单元格。

\n

通常,当将重叠范围(例如,A1:B2B2:C3)与Application.Union(或上面的函数)组合时,结果将具有重叠单元格的多个副本。

\n

例如使用
\n重叠范围 A1:B2 和 B2:C3

\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

\n

函数union2(如下)通过仅返回唯一的单元格解决了这个问题,并且还处理空范围(不会产生令人烦恼的模糊"Invalid Procedure call or argument"

\n
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 次迭代。)

\n