| [ Team LiB ] |
|
Recipe 12.6 Send Access Data to Excel and Create an Excel Chart12.6.1 ProblemYou want to export data from Access to Excel and create a chart programmatically. 12.6.2 SolutionYou can use an ADO Recordset object to export data to Excel programmatically, then use Automation with Excel to create a chart based on the exported data. Load and run frmExcel from 12-06.MDB. This form calls out to Excel, passing in the values from a recordset to create an Excel spreadsheet and chart based on sales data from the Northwind sample database (see Figure 12-9). Figure 12-9. The finished Excel worksheet and chart![]() Here's how you can create Excel charts in your own Access applications:
Figure 12-10. qryTopTenProducts in datasheet view![]()
Figure 12-11. References needed to make the code work![]()
12.6.3 DiscussionTwo constants are declared in this procedure—one for the name of the query used to export data, and one for the name of the worksheet in Excel: Private Const conQuery = "qryTopTenProducts" Private Const conSheetName = "Top 10 Products" You need to declare an ADO Recordset variable as well as Excel Application, Workbook, Worksheet, and Chart object variables: Dim rst As ADODB.Recordset ' Excel object variables Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim xlChart As Excel.Chart Dim i As Integer The Application object variable is needed to launch Excel; the Workbook variable is needed to create a new workbook; the Worksheet variable is needed to work with the worksheet when exporting the data; and the Chart variable is needed for creating and manipulating the chart. The first section of code launches Excel, creates a new workbook, removes all but one worksheet, and renames the worksheet: Set xlApp = New Excel.Application
Set xlBook = xlApp.Workbooks.Add
xlApp.DisplayAlerts = False
For i = xlBook.Worksheets.Count To 2 Step -1
xlBook.Worksheets(i).Delete
Next i
xlApp.DisplayAlerts = True
Set xlSheet = xlBook.ActiveSheet
xlSheet.Name = conSheetName
Next, the ADO recordset is created based on the saved query: Set rst = New ADODB.Recordset rst.Open _ Source:=conQuery, _ ActiveConnection:=CurrentProject.Connection Once the recordset is opened, the field names are copied into the Excel worksheet and formatted: With xlSheet
With .Cells(1, 1)
.Value = rst.Fields(0).Name
.Font.Bold = True
End With
With .Cells(1, 2)
.Value = rst.Fields(1).Name
.Font.Bold = True
End With
Only a single line of code is needed to copy the data from the ADO recordset to the Excel worksheet: .Range("A2").CopyFromRecordset rst
Next, the columns are formatted one at a time, using Autofit to size the rows to the widest entry, and assigning a number format to the second column: .Columns(1).AutoFit
With .Columns(2)
.NumberFormat = "#,##0"
.AutoFit
End With
End With
The chart is then created and formatted using the Chart object: Set xlChart = xlApp.Charts.Add
With xlChart
.ChartType = xl3DBarClustered
.SetSourceData xlSheet.Cells(1, 1).CurrentRegion
.PlotBy = xlColumns
.Location _
Where:=xlLocationAsObject, _
Name:=conSheetName
End With
Setting the location loses the references, so you must retrieve a new reference to the Chart object. The chart is then formatted using the methods and properties of the Chart object: With xlBook.ActiveChart
.HasTitle = True
.HasLegend = False
With .ChartTitle
.Characters.Text = conSheetName & " Chart"
.Font.Size = 16
.Shadow = True
.Border.LineStyle = xlSolid
End With
With .ChartGroups(1)
.GapWidth = 20
.VaryByCategories = True
End With
.Axes(xlCategory).TickLabels.Font.Size = 8
.Axes(xlCategoryScale).TickLabels.Font.Size = 8
End With
The worksheet and chart are then displayed by setting the Application object's Visible property to True: xlApp.Visible = True Finally, the cleanup code runs, shutting down all the objects that have been used and reclaiming memory: rst.Close Set rst = Nothing Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing The examples shown here barely scratch the surface of the capabilities of Excel Automation. Excel has a complex object model that is very easy to get lost in!
|
| [ Team LiB ] |
|