首页 > 解决方案 > VBA - 比较列和一个目标单元格之间的绝对差异

问题描述

我试图找出 in 中的值和 in 中的值之间Cell C3Sheet2绝对 Col C差异Sheet1。之后,差异按降序排序。计算出的差异将输入到 D 列。这是我到目前为止的代码,但它在Call Load,处引发错误compile error. Argument not optional。谁能帮我看看这里有什么问题?任何帮助是极大的赞赏!!

找到absdiff:

Sub absdiff()

Dim i As Integer
Dim test As Range
Dim calc As Range

If Sheet1.Range("A:A") <> "" Then

Call Load

End If

Load:
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row

test = Sheet2.Cells(3, 3).Value
calc = Cells(i + 1, "C").Value
Range("D" & i).Value = Abs(test - calc)

Next i

End Sub

更新列的排序:

Private Sub Worksheet_Change(ByVal Target As Range)

Call absdiff

On Error Resume Next
If Not Intersect(Target, Range("D:D")) Is Nothing Then
Range("D").Sort Key1:=Range("B2"), _
Order1:=xlDescending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
End If
End Sub

标签: excelvbasorting

解决方案


这行得通吗?每次你在 D 中放一些东西时,都会触发 change 事件,这似乎不是一个理想的状态。

为什么不将您的代码分配给一个按钮呢?

此外,testandcalc是单元格的值,而不是范围变量。我已更改为,Variant但您可以使用Long,或者Double如果您知道它们将是数字。


代码重新调整。我已将所有内容放入更改事件中,每当更改 C 列时就会触发该更改事件。之前的问题是每次排序发生时都会调用另一个过程,这会导致无限循环,因此堆栈空间不足。

当我假设您想按 D 排序时,您的排序代码引用了无效范围(“D”)并按 B 排序。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim i As Long
Dim test As Variant
Dim calc As Variant

If Not Intersect(Target, Range("C:C")) Is Nothing Then
    test = Sheet2.Cells(3, 3).Value
    For i = 1 To Sheet1.Cells(Rows.Count, "A").End(xlUp).Row
        calc = Sheet1.Cells(i + 1, "C").Value
        Sheet1.Range("D" & i).Value = Abs(test - calc)
        Application.EnableEvents = False
        Range("A:D").Sort Key1:=Range("D2"), _
              Order1:=xlDescending, Header:=xlYes, _
              OrderCustom:=1, MatchCase:=False, _
              Orientation:=xlTopToBottom
        Application.EnableEvents = True
    Next i
End If

End Sub

推荐阅读