Here is a "strictly from Excel" method which I have used on numerous
occasions. Easier to set up than describe. The tricky bit is getting
the labels to print in the right place on the sheet. Set up all the
labels on the sheet and change row heights/column widths between them
to suit.
The data comes from a simple table on a worksheet which has headings
for Name, address etc. The data range has been selected and named
"ElectricityRange" (to omit the heading row) via Insert/Name/Define.
A second sheet is set up, in this case with 2 identically formatted
bills per sheet. This sheet has a single cell named "Number" (outside
the print range) and formulas in the cells to refer to the table. eg.
one cell on the top bill has the formula :-
=INDEX(ElectricityRange,Number,1)
the corresponding cell on the second bill has the formula :-
=INDEX(ElectricityRange,Number+1,1)
you will probably need to go further with
=INDEX(ElectricityRange,Number+2,1)
etc.
The code to do the printing is :-
'---------------------------------------------------------------
Sub PRINT_ALL_eBILLS()
'--------------------------
rsp = MsgBox("About to print all Electicity bills." & vbCr _
& "OK to proceed ?", vbYesNo, "PRINT BILLS")
If rsp = vbCancel Or rsp = vbNo Then End
'---------------------------------------------------------
Dim MyBill As Worksheet
Set MyBill = ThisWorkbook.Worksheets("Electricity Bills")
Application.Goto Reference:=MyBill.Range("A1")
'----------------------------------------------------------
'- 2 bills per sheet
For b = 1 To 29 Step 2
MyBill.Range("Number").Value = b
'MyBill.PrintPreview ' option for testing
MyBill.PrintOut Copies:=1
Next
End Sub
'------------------------------------------------------------
Hope this helps.