Your methodology for computing invoices is rather unusual. As far as I can see you are mainly copying values from one form to another. What is not clear is whether that data is then saved to rows in tables before printing. This is really the crux of the matter. If the data is saved, then you should be able to open a report of multiple invoices, in the same way that my simple demo does. It's just a matter of restricting the report's RecordSource query to the relevant subset of rows from the tables to which the data has been saved. My demo does this by restricting the query to those rows where the order has been despatched but not paid for. How you would restrict your data is for you to decide, it's not something I can advise you on, but in principle it would be similar, though more complex. An example of a report where this is done can be found in the Northwind sample database distributed by Microsoft. In this the invoice report is based on the following query:
SELECT Orders.[Order ID], Orders.[Ship Name], Orders.[Ship Address],
Orders.[Ship City], Orders.[Ship State/Province], Orders.[Ship ZIP/Postal Code],
Orders.[Ship Country/Region], Orders.[Customer ID],
Customers.Company AS [Customer Name], Customers.Address, Customers.City,
Customers.[State/Province], Customers.[ZIP/Postal Code], Customers.[Country/Region],
[Employees Extended].[Employee Name] AS Salesperson, Orders.[Order Date],
Orders.[Shipped Date], Shippers.Company AS [Shipper Name], [Order Details].[Product ID],
Products.ID AS [Product ID], [Order Details].[Unit Price], [Order Details].Quantity,
[Order Details].Discount,
CCur(Nz([Unit Price][Quantity](1-[Discount]),0)/100)*100 AS ExtendedPrice,
Orders.[Shipping Fee], Products.[Product Name]
FROM (Shippers RIGHT JOIN (Customers RIGHT JOIN (Orders
LEFT JOIN [Employees Extended]
ON Orders.[Employee ID] = [Employees Extended].ID)
ON Customers.ID = Orders.[Customer ID]) ON Shippers.ID = Orders.[Shipper ID])
LEFT JOIN ([Order Details] LEFT JOIN Products
ON [Order Details].[Product ID] = Products.ID)
ON Orders.[Order ID] = [Order Details].[Order ID];
As you can see this in essence does the same as my demo, i.e computing the invoice data from orders data with a query, but with a rather more complex query than my simple examples. I would expect that you would be able to do something similar.
While the above example is the usual way of computing invoices, if your unusual method does result in the data being stored in rows in tables, then there should be no problem in printing multiple invoices once you have worked out the criteria necessary for restricting the report's query to the relevant data. The only requirement would be that the relevant rows for all the outstanding invoices have been inserted into the tables when the report is printed.