如何用 VBA 减去组合的命名范围

How to subtract combined named ranges with VBA

我找不到一种方法来减去命名范围内的数据。 我根据以下屏幕在 VBA 中创建了三个命名范围:

我有三个命名范围。我想做的是创建一个由 Data_1 和 Data_2 组成的命名范围,然后从中减去 Data_3。

我试过这样的方法:

Thisworkbook.names.add Name:="Data1and2", RefersTo:="=(" & Data_1 & "," & Data_2 & ")"
Thisworkbook.names.add Name:="FinalResult", RefersTo:="=" & Data1and2 & "-" & Data_3

这似乎有效,没有任何错误,但结果是一个由 0 组成的空白数组。例如,当我从 Data_1 中减去 Data_3(因此没有组合范围)时它工作正常,但是一旦我将两个范围组合成一个命名范围,它就会停止工作。

我也试过直接引用范围,不是通过名称而是通过地址,但它也不起作用。

有什么想法吗?

编辑: 我已经更改了图片以更好地显示问题。 Data_1 和 Data_2 范围可能不相邻且不连续,这就是让我遇到这个问题的原因。我需要以某种方式将它们组合成一个范围。其中一个范围也可以在一列中,而另一个将在一行中(转置)。

要在 VBA 中创建 FinalResult,假设您的三个数据范围已经存在:

.Add Name:="FinalResult", RefersTo:="=Data_1:Data_2-Data_3"

这与您在工作表上手动输入的公式相同。

编辑

在您修改后的问题中,data_1 和 data_2.

现在有不连续的范围,也可能具有不同的形状

如果你有一个现代版本的 windows 桌面 Excel,具有 TEXTJOINFILTERXML 功能,你可以使用以下公式:

FinalResult Refers To:  =FILTERXML("<t><s>" & TEXTJOIN("</s><s>",TRUE,Data_1,Data_2) & "</s></t>","//s")-Data_3

如果 Data_3 的单元格数与 Data_1Data_2 的单元格数不同,将返回错误,您可以测试。

因此,您的相关代码片段将是:

   RefersTo:= "=FILTERXML(""<t><s>"" & TEXTJOIN(""</s><s>"",TRUE,Data_1,Data_2) & ""</s></t>"",""//s"")-Data_3"

    RefersTo:= "=IFERROR(FILTERXML(""<t><s>"" & TEXTJOIN(""</s><s>"",TRUE,Data_1,Data_2) & ""</s></t>"",""//s"")-Data_3,"""")"