Printing Ms-Access Report from Excel
or printing Report of another Database from Active Database.
We often talk about the Back-End, Front-End design of Microsoft Access Applications. All the Tables are maintained in the back-end database and kept linked to the front-End. We keep them linked because we always retrieve information from them or update with latest data.
When the external database tables are linked to the front-end they are as good as the native tables of the front-end and you will not find any difference in working with them.
NB: When you are linking Tables from a Network location see that you provide full network address of the database \\ServerName\FolderName\Subfoldername\DatabaseName.mdb format, rather than server mapped address T:\FolderName\Subfoldername\DatabaseName.mdb. If the Network Location mapping to you machine (T:\) changes (to K:\ or Z:\ etc.) at a later stage you don’t need to do anything to refresh the linked Tables.
When you need to retrieve (or add/update) information in a table that is not linked to the front-end database we need a VBA program to do that.
A sample procedure is shown below:
Public Function CategoryTable() Dim wsp As Workspace, db As Database Dim rst As Recordset 'Set a reference to the active Workspace Set wsp = DBEngine.Workspaces(0) 'DBEngine.Workspaces(0).Databases(0) is CurrentDB 'Open a second database in Workspace(0).Databases(1) position Set db = wsp.OpenDatabase("C:\mdbs\NWSample.mdb") 'Open Categories recordset from Database(1) Set rst = db.OpenRecordset("Categories") 'Display the CategoryName field value MsgBox rst![CategoryName] rst.Close db.Close 'remove objects and release memory Set rst = Nothing Set doc = Nothing Set db = Nothing Set wsp = Nothing End Function
When an Access Database is open in the Application Window, it is open within a Workspace in the Workspaces Collection, under Application.DBEngine Object. The default Workspace is Workspace(0) and the first open database is addressable at Workspaces(0).Databases(0). We can open more than one Database within the same Workspace and work with it’s Table or Query recordsets. This approach is good if we are not working with those tables/queries on a day-to-day basis, rather than keeping them linked permanently to the front-end database.
But, we cannot open Forms or Report with this approach.
Application.DBEngine.Workspaces(0).Databases(0) Object is CurrentDB. Several databases can be opened in Workspaces(0) but the Current Database only will be visible in the Application Window and other databases, if open, will remain in memory till we close them. Now you know that we can work with tables, of databases loaded into memory, which are not linked to the Front-end, whenever we want to retrieve or update information in them. Besides that we can create Tables or Queries in them too.
What we will do if we want to create a Query on an external Table that is not linked to the Font-end database? Believe it or not you can create Queries in Microsoft Access without linking external Tables to the current database. Want to find out how? You can learn the trick from here.
So far our discussion was on external Tables/Queries. But, the procedures explained above will not help to open a Form or Report from another database. This can be done only within a separate Access Application Window. This statement is not 100% true, we will see why it is not next week.
Before going with the Excel based procedure let us see how it is done from the Active Database.
The simple procedure steps are given below:
- Create a separate Access Application Object.
- Set it’s visible property value to Yes, so that we can see the Application Window.
- Open the required Access Database within that Application Window.
- Open the required Report in Print-mode (acViewNormal) to send the Report directly to the default printer, or in Preview-mode (acViewPreview) to view the Report before sending it to the printer manually.
- Close the Database first and Quit the Application.
Sample VBA Code is given below:
' Include the following in Declarations section of module. Dim appAccess As Access.Application Public Function PrintReport() '--------------------------------------------------------- 'Original Code Source: Microsoft Access Help Document '--------------------------------------------------------- Dim strDB As String ' Initialize string to database path. Const strConPathToSamples = "C:\Program Files\Microsoft Office\Office11\Samples\" strDB = strConPathToSamples & "Northwind.mdb" ' Create new instance of Microsoft Access Application. Set appAccess = CreateObject("Access.Application") ' Make Application Window Visible appAccess.Visible = True ' Open database in Microsoft Access window. appAccess.OpenCurrentDatabase strDB ' Open Catalog Report in Print Preview appAccess.DoCmd.OpenReport "Catalog", acViewPreview ' Enable next line of code to Print the Report 'appAccess.DoCmd.OpenReport "Catalog", acNormal 'appAccess.DoCmd.Close acReport, "Catalog", acSaveNo 'appAccess.CloseCurrentDatabase 'appAccess.Quit End Function
- Copy and Paste the above Code into a new Standard Module of your Database.
- Make changes to the Path of the Database and Report name, if needed.
- Click somewhere in the middle of the Code and press F5 to run the Program.
If you were able to run the code successfully and Print/Preview your Report in a separate Access Application Window, then you may proceed to do the same thing from Microsoft Excel.
- Open Microsoft Excel.
- Display VBA Window (Developer – – >Visual Basic).
- Insert a Standard Module (Insert – – > Module) in the VBA Window.
- Copy and Paste the above Code into the Module and Save it.
Before running the Code you must add the Microsoft Access 12.0 Object Library to the Excel Project.
- Select References.. from Tools Menu.
- Find Microsoft Access 12.0 Object Library (or whatever version available in your machine) and put a check mark to select it.
- Click OK Command Button to close the Control.
- Click in the middle of the Code and press F5 to run.
You will see the same result you saw when you run the Code in Microsoft Access.