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

标签 excel vba range worksheet-function is-empty

我想以下列方式使用空范围:
Set NewRange = Union(EmptyRange, SomeRange)
我试过设置EmptyRange使用 Nothing 作为空范围, EmptyNull但是出现“运行时错误'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:B2B2:C3 )与 Application.Union 组合时(或上面的函数),结果将有多个重叠单元格的副本。
例如使用,
overlapping ranges A1:B2 and B2:C3
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/

相关文章:

excel - 如何将 Fortran 输出写入 CSV 文件?

string - 使用 Excel-VBA 从字符串中提取 5 位数字

html - 将粗体字体替换为文本周围的 html 粗体标签

sql - 查询Oracle将日期间隔连接在一行中

html - 删除 Outlook 365 中 HTML 邮件正文中表格前后的换行符

excel - VBA:分配给对象的宏,当单击以执行操作时,它会进入代码并触发 - 参数数量错误或属性分配无效

Vba宏如果单元格包含值,则在其他单元格上输入特定文本

excel - Javascript 转换为 Excel VB 函数产生 #NUM!错误

javascript - 范围超过 Canvas 的奇怪错误

c++ - 如何在 C++20 Ranges TS 中实现类似 Python 的切片?