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
我无法弄清楚如何将两个范围相互减去,范围 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