获取从 2 列数据计算出的最大值(没有辅助列)

getting the maximum value calculated from 2 columns of data (without helper column)

我有一些数据,存储在A列和B列中。 对于每一行,我想得到 A 列和 B 列中的值之间的差异。 IE。 cells(1,2) - cells(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 代码可以做到这一点吗?你能告诉我代码吗,因为我可能不熟悉我需要的语法?

这是否满足您的需求?

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 之间的最大值。

快速而肮脏:

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

阅读评论,您想 return "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:INDEX(B:B,ROW())-A:INDEX(A:A,ROW())),""MAX"","""")"
    .Range("C1:C" & lr).FillDown
End With

End Sub

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

这与您的公式相同,无需使用辅助列。我假设最终目标是在差异达到峰值

的集合旁边写下 "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