No veo yo claro lo de mandar un mensaje por cada registro que cumpla las condiciones... Si resulta que tienes 100 facturas vencidas, ¿vas a obligar al usuario final a hacer clic 100 veces para cerrar todos esos mensajes? Eso es una pérdida de tiempo y llevará a más de un cabreo...
Una posible solución sería lanzar un único mensaje, y aunque resuelve el problema de tener que hacer un montón de clics, si hay muchas facturas vencidas, te quedará un msgbox enorme y puede que no te entren todas en dicho msgbox. De cualquier forma, usando un recordset para recorrer la tabla y listar los registros que cumplan la condición lo tienes resuelto. Por ejemplo (escrito sobre la marcha y sin probarlo):
Private Sub Form_Load()
Dim rst As DAO.Recordset
Dim mensaje as String
Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE FFactura<Date()-365")
Do Until rst.EOF
Mensaje=mensaje & rst("NumFactura") & ", "
rst.MoveNext
Loop
MsgBox "Las facturas " & Left(mensaje,Len(mensaje)-2) & " están vencidas"
rst.Close
End Sub
Que te listaría en un único mensaje todas aquellas facturas de antigüedad mayor a un año (365 días).
Pero en mi opinión, lo más "profesional" sería lanzar un informe o una consulta que te muestre todas esas facturas vencidas, con la ventaja que las verás todas en un solo lugar y podrás tener mucha más información fácilmente. Puedes ver un ejemplo explicado paso a paso de cómo hacerlo en el siguiente ejemplo de Neckkito: http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/59-aviso-automatico-al-abrir-un-formulario
Y en esta misma web, si buscas "aviso automático", también te saldrán respuestas sobre el mismo tema.
Si tu vencimiento va a ser variable en función de tus necesidades, yo haría una tabla aux, por ejemplo con dos campos: número y período, y la rellenaría con un único registro, por ejemplo
30 | día o 2 | mes o 1 | año
Y recuperaría ese dato para usarlo en el recordset (para el msgbox) o en la SQL base del informe o consulta y ver los registros vencidos. Algo así (ojo, que va escrito "al vuelo", y puede que haya algún error):
Private Sub Form_Load()
Dim rst As DAO.Recordset
Dim mensaje as String
Select Case DLookUp("Periodo","TAux")
Case "dia"
Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE Abs(DateDiff('d',FFactura,Date"))>" & Dlookup("numero","TAux"))
Case "mes"
Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE Abs(DateDiff('m',FFactura,Date"))>" & Dlookup("numero","TAux"))
Case "año"
Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE Abs(DateDiff('yyyy',FFactura,Date"))>" & Dlookup("numero","TAux"))
End Select
Do Until rst.EOF
Mensaje=mensaje & rst("NumFactura") & ", "
rst.MoveNext
Loop
MsgBox "Las facturas " & Left(mensaje,Len(mensaje)-2) & " están vencidas"
rst.Close
End Sub
Por último, un pequeño comentario sobre la respuesta de Icue: a pesar de que funcione correctamente, de lo que no tengo duda, me parece "rizar el rizo" lo de usar un campo extra en la tabla y usar consultas de actualización, cuando trabajar con diferencias de fechas es mucho más eficiente y simple. De hecho, si haces la búsqueda que te indicaba en esta web, verás que Icue ya dio otras respuestas en este sentido.