Te pongo un ejemplo, por si te da una idea.
Dices que tienes configurado el informe para que presente 3 registros.
Si tengo el formulario Ventas con un subformulario DetalleVenta, en el que sólo hay un producto vendido

Cuando pulso el botón Imprimir esta Factura

En el caso de que hubiera dos productos

En mi caso particular, en el botón tengo puesto
Private Sub Comando16_Click()
DoCmd.SetWarnings False
If DCount("*", "detalleventa", "idventa=" & Me.IdVenta & "") = 1 Then
DoCmd.RunSQL "insert into detalleventa(idventa)values(Idventa)"
DoCmd.RunSQL "insert into detalleventa(idventa)values(Idventa)"
ElseIf DCount("*", "detalleventa", "idventa=" & Me.IdVenta & "") = 2 Then
DoCmd.RunSQL "insert into detalleventa(idventa)values(Idventa)"
End If
DoCmd.OpenReport "FACTURAS", acPreview, , "numfactura='" & Me.NumFactura & "'"
DoCmd.RunSQL "delete * from detalleventa where producto is null or producto="""""
End Sub
En esencia lo que hace es contar cuántos registros hay con el Idventa del formulario. Si hay uno le añade dos registros a la tabla DetalleVenta con el mismo Idventa que el formulario. Si hay 2, le añade uno. Se podría usar variables para no tener que repetir dos veces lo de Docmd.runsql"insert... pero sólo para 2 como máximo creo que no vale la pena.
Luego abre el informe y luego elimina esos registros "vacíos"