Determining “Highest Since” or “Lowest Since”

Alex routinely analyzes the latest building industry data, and needs to write articles about the data. Frequently he needs to highlight some new piece of data, such as “industrial building construction was the lowest since August 2007.” Alex wondered if there was a way to automate this type of highlighting; if column A contains the month and year and column B contains the values for those periods, Alex would like a formula in column C that indicates “this value is the highest since April 2007” or “this value is the lowest since November 2004.”

Assuming that the month and year listed in column A is really an Excel date value (and not text), you can easily create a formula to return the desired information. If you have row 1 occupied with headings for your columns, enter the following in cell C2:

=IF(ROW(B2)=2,"",IF(B2>MAX($B$1:B1), "this value is 
the highest since " & TEXT(INDEX($A$1:A1,MATCH(MAX(
$B$1:B1),$B$1:B1,0)), "mmmm yyyy"), IF(B2<MIN($B$1:B1),
"this value is the lowest since " & TEXT(INDEX($A$1:A1,
MATCH(MIN($B$1:B1),$B$1:B1,0)), "mmmm yyyy"),"")))

Remember that this is a single formula, and should be entered all on one line. You can copy the formula down as many rows as necessary in column C, and it should provide the desired information. It only makes a notation in column C if the value in column B is greater than the maximum or less than the minimum of all the foregoing values in column B.

If you have quite a bit of data in your worksheet, you could notice that the formula results in long recalculation times. If this is the case, then you may want to consider using macro that will do the desired analysis and provide the appropriate information. The following macro provides looks backward through the information in column B and provides both a “lowest since” and “highest since” result in columns C and D.

Sub FindHiLow()
    Dim orig_cell As Range
    Dim orig_val As Integer
    Dim orig_row As Integer
    Dim rownum As Integer
    Dim newcell As Range
    Dim new_val As Integer
    Dim lowrow As Integer
    Dim hirow As Integer

    Set orig_cell = ActiveCell
    orig_row = ActiveCell.Row
    orig_val = orig_cell.Value

' find lowest
    lowrow = 0
    For rownum = orig_cell.Row - 1 To 1 Step -1
        Set newcell = Cells(rownum, 2)
        new_val = newcell.Value
        If orig_val >= new_val Then
            lowrow = rownum
            Exit For
        End If
    Next
    If lowrow = 0 Then lowrow = 1
    Cells(orig_row, 3).Value = "Lowest since " & Cells(lowrow, 1)

' find highest
    hirow = 0
    For rownum = orig_cell.Row - 1 To 1 Step -1
        Set newcell = Cells(rownum, 2)
        new_val = newcell.Value
        If orig_val <= new_val Then
            hirow = rownum
            Exit For
        End If
    Next
    If hirow = 0 Then hirow = 1
    Cells(orig_row, 4).Value = "Highest since " & Cells(hirow, 1)
End Sub