【问题标题】:getting the maximum value calculated from 2 columns of data (without helper column)获取从 2 列数据计算的最大值(没有辅助列)
【发布时间】:2026-02-02 08:05:03
【问题描述】:

我有一些数据,存储在 A 列和 B 列中。 对于每一行,我想得到 A 列和 B 列中的值之间的差异。 IE。单元格(1,2) - 单元格(1,1),以此类推其余行。 第二步是确定第 i 行的差异是否是前面第 n 行的最大值。 使用辅助列,我可以使用公式或这样的代码来完成。

for i = 1 to LR
cells(i,3) = cells(i,2) - cells(i,1)
next i

for i = 1 to LR
if cells(i,3) = .max(range(cells(i-19,3),cells(i,3))) then
cells(i,4) = "MAX"
end if
next i

虽然我不想添加帮助列,但哪些 vba 代码可以做到这一点?你能告诉我代码吗?因为我可能不熟悉我需要的语法?

【问题讨论】:

  • 所以基本上,你想计算 B 和 A 中任何值之间的最大差值并返回这个单个值?
  • @JvdV 你好。实际上不是。对于每对数据,都需要一个差值 (di = Bi - Ai)。如果 di 是 i - 19 到 i 行中最大的,我想给一个标志。
  • 我想知道我是否可以使用类似的功能来做到这一点。
  • 看看@jamheadart 他在这种情况下的解决方案。请注意,您现在也在此处谈论差异...
  • 另外,你为什么不简单地使用条件格式“标记”它?

标签: excel vba function helper


【解决方案1】:

这与您的公式一样,无需使用辅助列。我假设最终目标是在差异达到峰值的集合旁边写上“MAX”这个词

Sub PeakDifferences()

Dim i As Long
Dim j As Long
Dim myArr() As Double
Dim subArr(1 To 20) As Double 'change 20 to 19 here if only looking at last 19 numbers

    With ActiveSheet

        lr = .Cells(.Rows.Count, "A").End(xlUp).Row
        ReDim myArr(1 To lr)

        For i = 1 To lr
            myArr(i) = .Cells(i, 2).value - .Cells(i, 1).value
            For j = LBound(subArr) To UBound(subArr)
                If i - j < 0 Then Exit For
                subArr(j) = myArr(i - j + 1)
            Next
            If myArr(i) = WorksheetFunction.Max(subArr) Then .Cells(i, 3) = "MAX"
        Next i

    End With

End Sub

【讨论】:

  • 最近的。但它给出了与我的公式版本不同的结果。我的公式是(在 C 列上)= B25 - A25,(在 D 列上)=IF(C25=MAX(C6:C25),"MAX","")。可以再帮忙看看吗?
  • 所以基本上如果它是针对前 19 个值而不是针对所有先前值的最大值?
  • 很抱歉,如果我没有把我的问题说清楚。 :P
  • @JohnLiu 我已将上面的代码更新为仅查看最后 20 个值的最大值(C6:C25 是 20 个值,而不是 19),但您可以将上面的约束编辑为 19跨度>
  • @JohnLiu 还请注意,它会检查它在哪里等于前 n 个值的最大值,而不是它在哪里是 ">=" 到前 n 个值的最大值
【解决方案2】:

又快又脏:

Sub Test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long, mx As Double

With ws
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    mx = .Evaluate(Replace("MAX(B1:BY-A1:AY)", "Y", lr))
End With

End Sub

阅读评论,您想将“MAX”返回到 C 列,其中该特定行的结果是该点的最大值。同样,又快又脏:

Sub Test2()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long, mx As Double

With ws
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Range("C1").FormulaArray = "=IF(INDEX(B:B,ROW())-INDEX(A:A,ROW())=MAX(B$1:INDEX(B:B,ROW())-A$1:INDEX(A:A,ROW())),""MAX"","""")"
    .Range("C1:C" & lr).FillDown
End With

End Sub

一种可能更好的方法是循环数组,但其他答案涵盖了这种方法。在这个例子中我会坚持Evaluate =)

【讨论】:

  • 谢谢。这段代码给了我一个“类型不匹配”。
  • @JohnLiu,请参阅更新。顺便说一句,您是否参考了正确的工作表?
  • 感谢您的更新。工作表参考没问题,但代码仍然没有分配正确的标志。让我彻底消化你的代码,看看是否可行。
  • 添加所需结果的屏幕截图以供参考。是的,有可能=)
【解决方案3】:

这能满足你的需要吗?

Sub e()
Dim i As Long
Dim m As Double
For i = 1 To LR
    If Abs(Cells(i, 1) - Cells(i, 2)) > m Then m = Abs(Cells(i, 1) - Cells(i, 2))
Next i
MsgBox m
End Sub

循环遍历行并检查当前最大差异m 是否超过当前行差异。它包含在 Abs 中以帮助处理任何负值

但是正如 JvdV 指出的那样,这不是一回事 - 我的答案是寻找最大的差异,而不是最大值;

-150 比 100 相差更大,但 100 是 -150 和 100 之间的最大值。

【讨论】:

  • 赞成。但是我能说两句小话吗?使用ABS 与查找MAX 结果不同。循环的另一件事是使用数组来加快速度。
  • 我只是预感到这是最大的差异而不是最大值,但我真的不知道他的数据实际上是什么样的。
  • 我认为我在 A 列上的数据应该总是大于在同一行 B 列上的数据。