La mecánica sería similar al proceso que te di anteriormente, pero cambiando las tablas y los campos.
Antes de seguir, indicarte que hay un error en el código que te pasé (en la parte del where), y que hará que no te funcione correctamente: en tus tablas facturas y presupuestos, debieras tener unos campos id que relacionen cada registro (por ejemplo idPresupuesto e idFactura). Si es así, el WHERE sería:
WHERE idPresupuesto =" & Me.idPresupuesto
Pues si insertas filtrando por el idcliente, y el cliente tiene más de un presupuesto, te va a insertar de más...
Dicho esto, el código de tu botón quedaría así:
Dim miSQL As String
Dim numFactura As Integer
DoCmd.SetWarnings False
'Insertas los datos del presupuesto
miSQL = "INSERT INTO Facturas(idclientes,fecha) SELECT idclientes,fecha FROM Presupuestos WHERE idPresupuesto =" & Me.idPresupuesto
DoCmd.RunSQL miSQL
'Buscas la factura que acabas de insertar y la insertas
numFactura = DLast("IDFactura", "Facturas")
miSQL = "INSERT INTO FactMaterial(idFacturas,idMaterial,Unidades,PrecioUnidad) SELECT " & numFactura & " AS Factura,idMaterial,Unidades,PrecioUnidad FROM PresMaterial WHERE idPresupuestos=" & Me.subPresMaterial.Form.idPresupuestos
DoCmd.RunSQL miSQL
DoCmd.SetWarnings True
'Opcional: abres el formulario en la nueva factura
DoCmd.OpenForm "Facturas", , , "ID=" & numFactura
Fíjate que previamente a insertar los datos del subformulario hay que buscar el último Idfactura (el que se acaba de crear) para que los datos del subformulario queden correctamente relacionados.
Te dejo un mini-ejemplo para que lo veas mejor: http://www.filebig.net/files/pV29seWkZW
(El ejemplo no lleva exactamente los mismos nombres que tu tienes)