Option Explicit Function vbaThirdFriday(ByVal aDate As Date) As Date On Error GoTo ErrorLabel Dim Roll As Date Roll = DateSerial(Year(aDate), Month(aDate), 15) vbaThirdFriday = Roll + (13 - WeekDay(Roll)) Mod 7 Exit Function ErrorLabel: MsgBox "error in vbaThirdFriday( " + str(aDate) + " )" vbaThirdFriday = aDate End Function Function vbaThirdFridayQuarter(ByVal aDate As Date) As Date On Error GoTo ErrorLabel Dim Roll As Date Dim Quarter As Integer Quarter = 1 + 3 * ((Month(aDate) - 1) \ 3) Roll = DateSerial(Year(aDate), Quarter, 15) vbaThirdFridayQuarter = Roll + (13 - WeekDay(Roll)) Mod 7 Exit Function ErrorLabel: MsgBox "error in vbaThirdFridayQuarter( " + str(aDate) + " )" vbaThirdFridayQuarter = aDate End Function Function vbaThirdFridayYearly(ByVal aDate As Date) As Date On Error GoTo ErrorLabel Dim Roll As Date Roll = DateSerial(Year(aDate), 1, 15) vbaThirdFridayYearly = Roll + (13 - WeekDay(Roll)) Mod 7 Exit Function ErrorLabel: MsgBox "error in vbaThirdFridayYearly( " + str(aDate) + " )" vbaThirdFridayYearly = aDate End Function Function vbaNextSettlement(ByVal aDate As Date) As Date On Error GoTo ErrorLabel vbaNextSettlement = vbaThirdFriday(aDate) If vbaNextSettlement <= aDate Then vbaNextSettlement = vbaThirdFriday(vbaNextSettlement + 20) End If Exit Function ErrorLabel: MsgBox "error in vbaNextSettlement( " + str(aDate) + " )" vbaNextSettlement = aDate End Function Function vbaNextSettlementQuarterly(ByVal aDate As Date) As Date On Error GoTo ErrorLabel vbaNextSettlementQuarterly = vbaThirdFridayQuarter(aDate) If vbaNextSettlementQuarterly <= aDate Then vbaNextSettlementQuarterly = vbaThirdFridayQuarter(vbaNextSettlementQuarterly + 90) End If Exit Function ErrorLabel: MsgBox "error in vbaNextSettlementQuarterly( " + str(aDate) + " )" vbaNextSettlementQuarterly = aDate End Function Function vbaNextSettlementyearly(ByVal aDate As Date) As Date On Error GoTo ErrorLabel ' find third friday in this month vbaNextSettlementyearly = vbaThirdFridayYearly(aDate) If vbaNextSettlementyearly <= aDate Then vbaNextSettlementyearly = vbaThirdFridayYearly(vbaNextSettlementyearly + 355) End If Exit Function ErrorLabel: MsgBox "error in vbaNextSettlementyearly( " + str(aDate) + " )" vbaNextSettlementyearly = aDate End Function Function vbaPrevSettlement(ByVal aDate As Date) As Date On Error GoTo ErrorLabel vbaPrevSettlement = vbaThirdFriday(aDate) If vbaPrevSettlement > aDate Then vbaPrevSettlement = vbaThirdFriday(vbaPrevSettlement - 30) End If Exit Function ErrorLabel: MsgBox "error in vbaPrevSettlement( " + str(aDate) + " )" vbaPrevSettlement = aDate End Function Function vbaPrevSettlementQuarterly(ByVal aDate As Date) As Date On Error GoTo ErrorLabel vbaPrevSettlementQuarterly = vbaThirdFridayQuarter(aDate) If vbaPrevSettlementQuarterly > aDate Then vbaPrevSettlementQuarterly = vbaThirdFridayQuarter(vbaPrevSettlementQuarterly - 30) End If Exit Function ErrorLabel: MsgBox "error in vbaPrevSettlementQuarter( " + str(aDate) + " )" vbaPrevSettlementQuarterly = aDate End Function Function vbaPrevSettlementYearly(ByVal aDate As Date) As Date On Error GoTo ErrorLabel vbaPrevSettlementYearly = vbaThirdFridayYearly(aDate) If vbaPrevSettlementYearly > aDate Then vbaPrevSettlementYearly = vbaThirdFridayYearly(vbaPrevSettlementYearly - 355) End If Exit Function ErrorLabel: MsgBox "error in vbaPrevSettlementyearly( " + str(aDate) + " )" vbaPrevSettlementYearly = aDate End Function