Excel 范围减法,可能会忽略某些单元格中的错误?

Excel range subtraction, overlooking errors in some cells possible?

我无法弄清楚如何将两个范围相互减去,范围 H:H 中的一些单元格有“#N/A”,而范围 D:D 中没有错误.我在 Excel 中知道它是一个简单的“=H2-D2”并将其向下拖动,但我正在录制一个宏并希望自动执行减法。到目前为止,这就是我所拥有的:

Dim quantity1, quantity2, rIntersect, Qdiff, x  As Range

Set quantity1 = Range("D:D")
Set quantity2 = Range("H:H")

Set rIntersect = Intersect(quantity1, quantity2)

For Each x In quantity1
If Intersect(rIntersect, x) Is Nothing Then
    If Qdiff Is Nothing Then
        Set Qdiff = x
    Else
        Set Qdiff = Application.Union(Qdiff, x)
    End If
End If
Next x

Range("J2").Select
Dim lastRowJ As Long
lastRowJ = Range("A" & Rows.Count).End(xlUp).Row
Range("J2").AutoFill Destination:=Range("J2:J" & lastRowJ)

将此过程放在标准代码模块中:

Public Sub Subtract()
    [j2:j99] = [h2:h99-d2:d99]
End Sub

如果您喜欢它的工作原理,我很乐意对其进行修饰,使其不会仅针对 98 行进行硬编码。让我知道。

更新

这是一个可以处理任意数量行的版本。它关闭了 D 列。因此,如果 D 列中有 567 个数字,那么您将在 J 列中得到 567 个对应(减去)结果。

这假设数据从第 2 行开始,并且在 D 列中的数字结束之前没有空白单元格。

如果您打算从宏对话框中调用它,那么您应该保留它 Public。另一方面,如果您要从同一模块中的另一个过程调用它,则可以将其设为私有。

这是增强的解决方案:

Public Sub Subtract()
    Dim k&
    Const F = "iferror(h2:h[]-d2:d[],0)"
    k = [count(d:d)]
    [j2].Resize(k) = Evaluate(Replace(F, "[]", k + 1))
End Sub

请注意,当 H 列中的对应值为错误时,例程现在会处理错误并在 J 列中放置一个零值。如果您希望在 H 列中出现错误时使用除零以外的其他内容(例如空白),请告诉我,我会根据您的需要进行更新。

更新 2

以下是处理显示空白而不是零的方法:

Public Sub Subtract()
    Dim k&
    Const F = "iferror(if(h2:h[]-d2:d[]=0,"""",h2:h[]-d2:d[]),0)"
    k = [count(d:d)]
    [k2].Resize(k) = Evaluate(Replace(F, "[]", k + 1))
End Sub