Printing Excel Reports via a Word Document
Using Microsoft Excel & Word
This post will detail the process of establishing a simple database in excel and then linking that to a Standard Report in word and saving the data as a new Word file.
Why use Word?
Some organisations will only accept files in Word format and may have specific formats which are used internationally (International shipping I’m looking at you!)
In these cases although you may be able to setup an Excel file to look exactly like its Word equivalent. But if they wont accept it…
You have to change.
Requirements:
+ A database source in Excel
+ A Word file (to be used as a template, not to be confused with a Word template)
The Process
The process is simply a matter of:
+ Setup a Control sheet
+ Setup a Transfer Sheet
+ Setup a Word template
+ Run the Report
This process will be explained step by step with the help of a worked example: 2007/10 Sample or 1997/03 Sample
This tutorial will only be using the 2007/10 files as examples but feel free to follow along if you are using previous versions.
The 2007/10 Sample has been tested on both Office 2007 & 2010
The 1997/03 Sample has been tested on Office XP (and I make no claim that it will work in prior versions but it might/should)
Open the example workbook (Production records.xlsm from the above links) or your own data file.
Notice that there are 3 worksheets in the workbook:
+ Control: The master sheet which allows selection of your filter or summation criteria and a button to execute a macro
+ Transfer: The transfer sheet, the entry or summation here will be transferred to word
+ Data: The database
Setup a Control Sheet
The control sheet is a simple data validation or selection tool and a button which will run a macro.
It can be as simple or as complex as you need to make it.
Example
In the example above there is simply a Data Validation cell which is linked to a list of shipment numbers and a Button to run the reports VBA subroutine.
You can make yours as simple or as complex as you need to extract the data from your data source.
The Produce Word Report button is linked to the MergeMe VBA subroutine.
Setup a Transfer Sheet
The Transfer sheet requires 2 rows
Row 1: Has a list of field names, These will be used in Word later so use something meaningful.
Row 2: Has a list of the records which will be transferred to Word. The cells will contain sufficient formulas to extract the relevant records from the Data sheet using the Data validation on the Control Sheet.
You need to setup sufficient fields to ensure that all records required in Word are setup or retrieved.
The order of the fields isn’t important as the field names are used for the transfer not the order.
Also you don’t have to use all the fields in Word, but if the Field isn’t made here you can’t retrieve it later.
The format or layout doesn’t matter as this is controlled in Word.
Example
Notice on the Transfer sheet that the Top Row is a list of field names
The second row uses an Index(Match( )) combination to retrieve the relevant records from the Data sheet.
Save the Excel file.
In the sample file I have made a simple retrieval of a matching records and associated fields, but the Transfer sheet could have just as easily sumarised multiple rows of data from your data source.
Setup a Word template
Setup in word a file which will be used as a template for the import.
Leave gaps where your fields values will go.
Save the file
Example
Open the example file (Shipping Template.docx)
If this is the first time you have opened the example file it may prompt you
“Opening this file will run the following SQL File …”
This is ok so accept Yes
You can either accept that and then follow the links to connect the file to the Production records.xlsm file
It will then prompt you for the Data Table which in our case is Transfer$ ie: the Sheet Name with a $ sign at the end
If it didn’t prompt you above or you answered No to the “Opening this file will run the following SQL File …” prompt we will connect again later anyway.
Now setup the file in word with all the text graphics, lines colors etc required for your form/report.
Leave gaps for the fields which we will add next.
Adding fields
Use mail merge to open the data source (Production records.xlsm)
Goto Mailings, Select Recipients, Use Existing List…
Navigate to the Production Records.xlsm file after which it will prompt you for the table which in our case is Transfer$ ie: the Sheet Name with a $ sign at the end (as discussed above)
Move to the 4 missing Field Locations as per the following table and insert the Field Names using the
Mailings, Insert Merge Field tab
Insert Fields as per the following table and highlights above:
| Location | Field Name (from Production Records.xlsm) |
| Shipment No : | Shipment_No |
| Material : | Cargo |
| Tonnes : | Tonnes |
The other fields Destination, Form and Date have already been pre-entered and are shown in Blue
You can format the fields as required, select the entire field and change the font, colors etc to suit.
You can view the field values using the Preview Results Button, see below
Make any other changes to the file
Save the file as a Word File Shipping Template.docx (not as a Word Template *.dotx)
Close Word
Run the Report
In the Production records.xlsm file we will now link the macro to the button on the control sheet
We need to check 3 lines in the macro before we execute it.
Goto VBA using Alt F11
Select the Production Records.xlsm, Modules on the left and find the
Sub MergeMe() Subroutine on the right
Near the top of the subroutine are 2 lines which list both the file which Word will use as a template and what the new file will be saved as after merging.
‘ Setup filenames
Const WTempName = “Shipping Template.docx“ ‘This is the Word Templates name, Change as req’d
Const NewFileName = “New Certificate.docx” ‘This is the New Word Documents File Name, Change as req’d
Change these values as appropriate
The code will overwrite the existing output file if it exists so once executes save it to another name/location.
If you are using your own data file copy this subroutine to your own VBA Module and edit as above.
You can now go back to Excel (Alt F11) and execute the macro using the button on the control page.
You should now have a new file called New Certificate.docx in the same directory as the Sample files.
Future Extensions
The above macro which does this transfer is a simple and easily scalable to 50+ fields without any modification.
Future enhancements would be:
+ Sourcing the New Word File name from the Control sheet
+ Incremental numbering of the word document each time the transfer is done
+ Numbering of the word document based on a Field value each time the transfer is done
+ Export of Multiple records at one time
+ Conditional formatting in Word based on field values
+ Improved error checking
If you are interested I encourage you to modify and post these enhancements here for all to benefit.
Macro
You can copy the Macro into any Excel file and save it as an *.xlsm file and link it to a Button and be up and running in minutes
The macro has a very small number of changes that need making internally to work anywhere.
What have been your Excel to Word transfer experiences ?
What have been your Excel to Word transfer experiences, let us know in the comments below:
What do you think of this approach to data transfer ?






















26 Responses to “Get busy this weekend, with OR XOR AND [Excel Homework]”
first solution for AND
The two numbers are in A1 and B1
= SUBSTITUTE (SUBSTITUTE (A1+B1*9*9, 9, 1), 8, 0)
regards
Stef@n
next solution for OR
=1*SUBSTITUTE (A1+A2;2;1)
regards
Stef@n
last solution for XOR
=1*SUBSTITUTE (A1+A2;2;0)
regards
Stef@n
Or you could make use of the VBA logical operators!
Define the following as custom functions
Public Function BITXOR(x As Long, y As Long)
BITXOR = x Xor y
End Function
Public Function BITAND(x As Long, y As Long)
BITAND = x And y
End Function
Public Function BITOR(x As Long, y As Long)
BITOR = x Or y
End Function
and then use them such:
A B =BITOR(A,B) =BITAND(A,B) =BITXOR(A,B)
0101 0100 0101 0100 0001
an another solution for AND
=1*SUBSTITUTE (SUBSTITUTE (A1+A2;1;0);2;1)
note:
the binary numbers are in A1 and A2 !
regards
Stef@n
I was obviously playing hooky at the beach during the bit-wise math lesson – you lost me at “Understanding bit-wise operations” 🙂
After looking at the above solutions, I find my solution silly, but still:
For the following formulae,
Row 1: headers,
Row 2: OR
Row 3: AND
Row 4: XOR
Column 1: Input 1
Column 2: Input 2
Column 3: Result
OR
{=SUM(IF(MID(A2,ROW(OFFSET($A$1,0,0,LEN(A2),1)),1)+MID(B2,ROW(OFFSET($A$1,0,0,LEN(B2),1)),1)>0,1,0)*10^(LEN(A2)-ROW(OFFSET($A$1,0,0,LEN(B2),1))))}
AND
{=SUM(IF(MID(A3,ROW(OFFSET($A$1,0,0,LEN(A3),1)),1)+MID(B3,ROW(OFFSET($A$1,0,0,LEN(B3),1)),1)=2,1,0)*10^(LEN(A3)-ROW(OFFSET($A$1,0,0,LEN(B3),1))))}
XOR
{=SUM(IF(MID(A4,ROW(OFFSET($A$1,0,0,LEN(A4),1)),1)+MID(B4,ROW(OFFSET($A$1,0,0,LEN(B4),1)),1)=1,1,0)*10^(LEN(A4)-ROW(OFFSET($A$1,0,0,LEN(B4),1))))}
@Anup
Please don't consider your solution silly
Firstly, You are the 3rd person to submit an answer
Secondly, The best formula/function is the one that you know and understand.
I think I have a very tedious solution, which people won't have the patience to do except in small numbers.
I used the same problem setup as "Anup Agarwal"
AND =IF(AND(MID(B2,1,1)="1",MID(C2,1,1)="1"),1,0)&IF(AND(MID(B2,2,1)="1",MID(C2,2,1)="1"),1,0)&IF(AND(MID(B2,3,1)="1",MID(C2,3,1)="1"),1,0)&IF(AND(MID(B2,4,1)="1",MID(C2,4,1)="1"),1,0)
OR =IF(OR(MID(B3,1,1)="1",MID(C3,1,1)="1"),1,0)&IF(OR(MID(B3,2,1)="1",MID(C3,2,1)="1"),1,0)&IF(OR(MID(B3,3,1)="1",MID(C3,3,1)="1"),1,0)&IF(OR(MID(B3,4,1)="1",MID(C3,4,1)="1"),1,0)
=IF(OR(AND(MID(B4,1,1)="1",MID(C4,1,1)="0"),AND(MID(B4,1,1)="0",MID(C4,1,1)="1")),1,0)&IF(OR(AND(MID(B4,2,1)="1",MID(C4,2,1)="0"),AND(MID(B4,2,1)="0",MID(C4,2,1)="1")),1,0)&IF(OR(AND(MID(B4,3,1)="1",MID(C4,3,1)="0"),AND(MID(B4,3,1)="0",MID(C4,3,1)="1")),1,0)&IF(OR(AND(MID(B4,4,1)="1",MID(C4,4,1)="0"),AND(MID(B4,4,1)="0",MID(C4,4,1)="1")),1,0)
Sorry my last post was totally messed up
AND
=IF(AND(MID(B2,1,1)="1",MID(C2,1,1)="1"),1,0)&IF(AND(MID(B2,2,1)="1",MID(C2,2,1)="1"),1,0)&IF(AND(MID(B2,3,1)="1",MID(C2,3,1)="1"),1,0)&IF(AND(MID(B2,4,1)="1",MID(C2,4,1)="1"),1,0)
OR
=IF(OR(MID(B3,1,1)="1",MID(C3,1,1)="1"),1,0)&IF(OR(MID(B3,2,1)="1",MID(C3,2,1)="1"),1,0)&IF(OR(MID(B3,3,1)="1",MID(C3,3,1)="1"),1,0)&IF(OR(MID(B3,4,1)="1",MID(C3,4,1)="1"),1,0)
XOR
=IF(OR(AND(MID(B4,1,1)="1",MID(C4,1,1)="0"),AND(MID(B4,1,1)="0",MID(C4,1,1)="1")),1,0)&IF(OR(AND(MID(B4,2,1)="1",MID(C4,2,1)="0"),AND(MID(B4,2,1)="0",MID(C4,2,1)="1")),1,0)&IF(OR(AND(MID(B4,3,1)="1",MID(C4,3,1)="0"),AND(MID(B4,3,1)="0",MID(C4,3,1)="1")),1,0)&IF(OR(AND(MID(B4,4,1)="1",MID(C4,4,1)="0"),AND(MID(B4,4,1)="0",MID(C4,4,1)="1")),1,0)
@stefan,
I just couldn't get your solutions to work.
01010101010 + 01010101110 = 02020210120
what am i doing wrong?
@anup
...I got yours to work!
@Stephen - I get the same, but Stef@an's second solution for AND does work (at least for the test cases I used)
@ Stephen / Rich
yes , you are right ! - only this works:
OR
=1*SUBSTITUTE (A1+A2;2;1)
XOR
=1*SUBSTITUTE (A1+A2;2;0)
AND
=1*SUBSTITUTE (SUBSTITUTE (A1+A2;1;0);2;1)
@Stef@n - You're answer is really smart, I never knew about the substitute function before. Great Work!
Thx Michael 🙂
yes - it is simply easy 😉
if you add 1 and 1 - excel calculate 2
and then you have to substitute the 2 - new = 0 respectively 1
Here is a good resource for people wanting to learn binary and hexadecimal.
http://justwebware.com/bitwise/bitwise.html
Three that weren't asked for:
NOT
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1+A2,0,3),1,0),3,1)
EQV
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1+A2,0,3),2,3),1,0),3,1)
IMP
=SUBSTITUTE(SUBSTITUTE(A1+SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,0,3),1,0),3,1),0,1),2,0)
(was using Daniel Ferry's bitwise file to verify against)
@ Kyle
Not only takes one parameter and inverts 0 -1 and 1-0
Took out the +A2
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,0,3),1,0),3,1)
Great solutions!
I'll add two:
NAND =1*SUBSTITUTE (A1+A2,2,0)
NOR=1*SUBSTITUTE(SUBSTITUTE (SUBSTITUTE(A1+A2,0,2),1,0),2,1)
This will work for binary numbers of any size (although the text format mask will have to have as many zeroes as there are digits in the longest addend)
Assume binary #s are in C35 & C36, then add and format as text in C37:
=TEXT(C36+C35,"000000000000")
-sum- = 101112211112
AND - SUBSTITUTE 0s for 1s in -sum-, then sub 1s for 2s
=SUBSTITUTE(SUBSTITUTE(C37,"1","0"),"2","1")
OR - sub 1s for 2s in -sum-
=SUBSTITUTE(C37,"2","1")
XOR - sub 0s for 2s in -sum-
=SUBSTITUTE(C37,"2","0")
Just wandered by:
AND:
=SUBSTITUTE(A1+A2,1,0)/2
Clever, Shane. I like that.
[…] post http://www.excelhero.com/blog/2010/01/5-and-3-is-1.html for examples using Sumproduct, and http://chandoo.org/wp/2011/07/29/bitwise-operations-in-excel/ for examples using Text […]
Hi Chandoo,
I am not (yet) really into bitwise calculation, but I am looking for a way to speed up my vba calculation with very big numbers. Would is ben convenient to use bitwise notation for this?
Best regards,
Ronald (the Netherlands)
p.s. love your country!
@Ronald
I'd suggest asking this in the Chandoo.org Forums
https://chandoo.org/forum/
Attach a sample file with an example of some data and describe what you want to achieve