I'm sure you thought I'd never answer, but I had some delays in getting to this, took time to create and test the routine, and I also had some issues with Outlook on my computer that took some time.
I created quite a simple routine that works just fine for me. It's going to take a lot more time and effort to explain than to implement, I think.
First off, in the query that is the source for your report you need an additional Yes/No field. Call it Sent for simplicity. Its function eventually is to confirm which emails have been sent and which have not yet been sent. Looking at your query structure, I'd probably put it in the Companies table and then bring it in. You'll also need to bring in the email address field into the query, and eventually into the report. Sent does not have to be on the report, but the email address should be. Make it invisible so it doesn't mess with your visuals that you've already got, but it needs to be there.
You'll also need to create an update query which will update the Sent field back to all False again after you've sent all the emails out. Click Create>Query Design, select the Companies table, and in Design View click Update. Drag the Sent field down, and in the Update To field write False. I called my Query UpdateSent, but call it whatever works for you.
Now you'll need a trigger, be it a Command Button or some other method, but that trigger will run a macro. I'm going to assume a button, and you can modify accordingly. Call the button Command16, and the macro Control, with several named macros within it.
I called the first named macro RunReports, so your trigger event should run Control.RunReports. The RunReports macro has one step in it, a RunMacro command. It will have its RepeatCount condition set to =DCount("[CompanyName]","[DealerAlarmNetBillingCalcQry]") Essentially it will count how many names are in the list and that's how many times it will run. The name of the macro it runs repeatedly is the second named macro in the Control macro group that I simply called Send. It will be named Control.Send in the MacroName field.
Now create the Send macro with the following steps and conditions
Echo>No (keeps operations from being visible on screen until it's all done)
OpenQuery>DealerAlarmNetBillingCalcQry (Opens query so operations can be performed on data it contains)
GoToControl>Sent (Takes the cursor to the Sent field)
FindRecord>=False (This simply searches through the sent field until it lands on a record that has not yet been sent
SetValue>Screen.ActiveControl>True Sets that false record to True)
GoToControl>CompanyName. (This is the identifier that will tell Access which customer's report to print, on the same record you just set to True)
SetTempVar>CompanyName>Screen.ActiveControl (Sets the company name of the same record as a temporary variable to direct the send)
Close>Query>DealerAlarmNetBillingCalcQry (Closes query after you're finished writing to it and you've recorded the company name)
OpenReport>Monthly Dealer AlarmNet Billing>Print Preview. In Where Condition, write [Company Name]=[TempVars]![CompanyName]. You're now just opening the report with the one record of interest.
SendObject>Report>Monthly Dealer AlarmNet Billing>PDF Format. In To: field, put =Screen.ActiveReport!Email, or =[Reports]![Monthly Dealer AlarmNet Billing]!. You'll definitely need square brackets around that report name because it contains spaces. Fill in Subject and Message text as desired, and edit message to NO. That allows for immediate send.
Now the last step is to create a condition in the condition field of the same macro, DCount("[Sent]","[DealerAlarmNetBillingCalcQry]","[Sent]=False")=0. Basically this and succeeding operations will only run after all the check boxes are set to True, meaning all the records have been sent.
In the Action column in front of that condition, put
SetWarnings>No (This disables warnings when you run the update query)
Under the condition expression put an ellipses (...) which indicates that this step will also run when condition is met. In the action column put:
OpenQuery>UpdateSent (This will go back and change all the true values to false ready for the next send)
And you're done in 12 steps.
One click runs the Send macro as many times as there are records to send. It finds a record that hasn't been sent yet, labels it as sent, saves the company name for that record, then opens the report for only that name, attaches it to an email, and sends it. It then repeats the same steps for each record until all are sent. The last step, performed only after they're all sent, resets all the values to false for the next time you want to perform the operation.
I was having problems with Outlook and I wound up with all the records in the outbox, attached and ready to send, but I had to manually release them from there. If your Outlook is working correctly you should be able to send all of them individually with the one click.
Good luck. Let me know. I'm sure there are other ways to accomplish this, but it is simple and it works well.