获取从 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
我有一些数据,存储在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