查找一个值的行位置并用它在VBA中进行计算

我有一个代码定义了一个范围,并find该范围的最高和最低值。

我想要做的是获取这些值,find每个行的行,看看高值的行是否小于低值的行,然后做一个计算。

问题1由于某种原因,我一直得到一个无效的限定符错误的行使用比较的行。

问题2如果低值在高点之前,我怎样才能find在低点之前的范围内的最高值?

代码的相关部分是:

Set MDDRange = Worksheets("TIME").Range(Col_Letter(lColumn) & 2, Col_Letter(lColumn) & LastRow) '.Value MDDHigh = Application.WorksheetFunction.Min(MDDRange) MDDHighPos = Worksheets("TIME SERIES").Range(MDDRange).Find(MDDHigh, LookIn:=xlWhole) MDDLow = Application.WorksheetFunction.Max(MDDRange) MDDLowPos = Worksheets("TIME").Range(MDDRange).Find(MDDLow, LookIn:=xlWhole) 'if to see if mddhigh comes before mddlow If MDDHighPos.Row + 1 < MDDLowPos.Row + 1 Then ' error is here MDD = (MDDLow - MDDHigh) / MDDHigh Worksheets("STATS").Cells(6, lColumn).Value = MDD Else 'if my high value is not before my low, how to find the highest value before the low? End If 

任何帮助将深表谢意。

修正了这两个问题(这是从SJR接受的答案和R3uK的修改):

 Set MDDRange = Worksheets("TIME").Range(Col_Letter(lColumn) & 2, Col_Letter(lColumn) & LastRow) '.Value MDDHigh = Application.WorksheetFunction.Max(MDDRange) Set MDDHighPos = MDDRange.Find(MDDHigh) MDDLow = Application.WorksheetFunction.Min(MDDRange) Set MDDLowPos = MDDRange.Find(MDDLow) a = MDDHighPos.Row b = MDDLowPos.Row 'if to see if mddhigh comes before mddlow If a < b Then MDD = ((MDDLow - MDDHigh) / MDDHigh) Worksheets("STATS").Cells(6, lColumn).Value = MDD Else 'this creates a new range from begin of old range to the lowest value, and finds the highest value in this range, then calculates the drawdown Set MDDRangeNew = Worksheets("TIME").Range(Col_Letter(lColumn) & 2, Col_Letter(lColumn) & b) MDDHighNew = Application.WorksheetFunction.Max(MDDRangeNew) MDD = ((MDDLow - MDDHighNew) / MDDHighNew) Worksheets("STATS").Cells(6, lColumn).Value = MDD End If 

干得好。 我假设你的variables声明是在开始…

 Set MDDRange = Worksheets("TIME").Range(Col_Letter(lColumn) & 2, Col_Letter(lColumn) & LastRow) '.Value MDDHigh = Application.WorksheetFunction.Min(MDDRange) Set MDDHighPos = Worksheets("TIME SERIES").Range(MDDRange).Find(MDDHigh, LookIn:=xlWhole) MDDLow = Application.WorksheetFunction.Max(MDDRange) Set MDDLowPos = Worksheets("TIME").Range(MDDRange).Find(MDDLow, LookIn:=xlWhole) 'if to see if mddhigh comes before mddlow If MDDHighPos.Row + 1 < MDDLowPos.Row + 1 Then ' error is here MDD = (MDDLow - MDDHigh) / MDDHigh Worksheets("STATS").Cells(6, lColumn).Value = MDD Else 'if my high value is not before my low, how to find the highest value before the low? Set MDDRange = Worksheets("TIME").Range(Col_Letter(lColumn) & "2", Col_Letter(lColumn) & MDDLowPos.Row - 1) 'And here you go again! ;) End If