I don't think arrays will save that much here, the time is being taken deleting the rows from the sheet 'Main'
If you manually add your filter and then delete the rows that are left manually you will see what i mean.
You could have another tab for this month and move the data that is needed to that, thus removing the need to delete:
Sub test()
Dim rng As Range
Set rng = [A7].CurrentRegion
If Not ActiveSheet.AutoFilterMode = True Then [A7].AutoFilter
[A7].AutoFilter 16, "<" & DateSerial(Year(Now()), Month(Now()), 1)
On Error GoTo NoCells
Union(Range(rng(2, 1), rng(rng.Rows.Count, 6)), Range(rng(2, 15), rng(rng.Rows.Count, 20))).SpecialCells(xlCellTypeVisible).Copy
On Error GoTo 0
Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
[A7].AutoFilter 16, ">=" & DateSerial(Year(Now()), Month(Now()), 1)
On Error GoTo NoCells
rng.Offset(1).Resize(rng.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy
On Error GoTo 0
Sheet3.Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
[A7].AutoFilter
Exit Sub
NoCells:
MsgBox "No older/ newer dates found"
End Sub
Other than that maybe someone else here on the forum has a suggestion?