【问题标题】:Excel range subtraction, overlooking errors in some cells possible?Excel范围减法,可能忽略某些单元格中的错误?
【发布时间】:2015-08-27 00:21:16
【问题描述】:

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

【问题讨论】:

  • 嗨。除了减法,你还想做什么?实际上,我看不到这里的减法。由于 quantity1 和 quantity2 彼此平行,因此 rIntersect 将始终为 Nothing。
  • 我只想拥有列 J = D - H,我已经尝试了几件事,甚至 Qdiff.Value = quantity1.Value - quantity2.Value,然后进行自动填充,但由于数量 2 中的某些值是 @ 987654323@
  • 我可以进一步帮助您吗?

标签: vba excel range subtraction


【解决方案1】:

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

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

如果您喜欢它的工作方式,我很乐意对其进行修饰,使其不会仅针对 98 行进行硬编码。告诉我。

更新

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

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

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

这是增强的解决方案:

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

【讨论】:

  • 成功了!是的,我使用的电子表格在任何给定时间都会有不同的行数(数据每天更新),有时单元格中可能会有错误值,这在某些情况下是预期的。将其作为私人潜艇更好吗?我把所有东西都放在一个潜艇上。我是自学的,我不想养成任何坏习惯。
  • 如何更改它以显示空白?在宏中,零表示我的数据之间没有区别,将其更改为空白或“检查”对我来说会更好。
  • @Karla 我再次更新了答案以满足您的需求。
  • 您介意解释一下Dim k& 的工作原理吗?我没见过那种格式。
  • @Karla 这只是将“k”变量声明为 Long 类型的另一种方式。它不仅比“As Long”短,而且实际上要老得多。自从 BASIC 语言家族出现以来,它就一直存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2018-12-05
  • 2010-12-08
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多