Here, let me explain.
=IF(C6&D6="",""
If Event and Details are blank for this row then there's no need for the date.
INDEX($B$5:$B$19
I want the date so I need to retrieve from column B
AGGREGATE(14,6,ROW($B$5:$B$19)-ROW($B$4)/
I want to retrieve the latest ate so I use the LARGE function of AGGREGATE and check every row. Next I will divide each row number by the results of three logical comparisons multiplied, so only if all three conditions are true will I return a logical one which divided into the row gives me the row number meeting the criteria. i.e. the row with the date.
(($B$5:$B$19>1)*($C$5:$C$19="")*(ROW($D$5:$D$19)<ROW())),1)))
Here's the three criteria:
(($B$5:$B$19>1)*
The B column must be greater than 1, so it won't be text or time (as time is held as a fraction of 1).
($C$5:$C$19="")*
The C column must be blank, so I know it's not an Event/Detail row.
(ROW($D$5:$D$19)<ROW())
The Date it finds must be in a row less than the current row.
So INDEX retrieve the contents of B where I find the highest row with a date before the row I'm on.