Using The MSChart Control in VB 6
Using The MSChart Control in VB 6
Using The MSChart Control in VB 6
The MSChart control allows you to plot data in charts according to your specifications. You can
create a chart by setting data in the controls properties page, or by retrieving data to be plotted
from another source, such as a Microsoft Excel spreadsheet. The information in this topic focuses
on using an Excel worksheet as a data source.
Possible Uses
To chart dynamic data, such as current prices of selected commodities.
To plot stored data, such as product prices, for graphic analysis of trends.
The code above produces a simple, single-series chart. A series in a chart, is set of related data
points. For example, a typical series might be the prices of a commodity over the course of a year.
The chart below shows a single-series chart.
To create a more complex, multi-series chart, you must create a multi-dimensioned array, as shown
in the following example:
1
Dim arrPriceQuantity(1 to 5, 1 to 2)
Dim i as Integer
For i = 1 to 5
arrPriceQuantity(i, 1) = i ' Series 1
arrPriceQuantity(i, 2) = 0 - i ' Series 2
Next i
MsChart1.ChartData = arrPriceQuantity
When you create a multi-dimensioned array, the first series can be assigned a string; when the
array is assigned to the ChartData property, the strings become the labels for the rows. The
following code shows this feature.
Dim arrValues(1 to 5, 1 to 3)
Dim i as Integer
For i = 1 to 5
arrValues(i, 1) = "Label " & i ' Labels
arrValues(i, 2) = 0 + i ' Series 1 values.
arrValues(i, 3) = 2 * i ' Series 2 values.
Next i
MsChart1.ChartData = arrValues
As you can see, creating a chart using the ChartData property can be quick and simple. However,
the problem with using an array is getting the data into the array. Most users of this kind of data
will probably prefer to use a spreadsheet program, such as Microsoft Excel, or perhaps a database
program, such as Microsoft Access, to store and retrieve the data.
2
Setting or Returning a Data Point
Once you have created a chart, using an array from a spreadsheet or other data source, you may
also want to set or return the value of a particular data point. This can be done by first setting the
Row and (if applicable) Column properties, then setting or returning the Data property. For
example, in a simple (single-series) chart, the following code would change the third data point.
With MSChart1
' Change third data point to 50.
.Row = 3
.Data = 50
End With
If the chart has more than one series use the Column property to designate the series, then set the
Row and Data properties as above.
With MSChart1
' Set the second data point of the fourth series
' to 42.
.Column = 4
.Row = 2
.Data = 42
End With
If you've started to explore the MSChart control, you will notice that it has a large number of
events. These events allow you to program the chart to respond to practically any action of the
user. As an example of this programmability, the PointActivated event is used in the following
example to show how a data point can be changed using the Series and DataPoint parameters. (The
PointActivated event occurs whenever a data point is double-clicked.) The Series and DataPoint
parameters correspond to the Column and Row properties, and can thus be used to set the Data
property:
3
Each of these parts has a corresponding object in the MSChart control which can be used to change
the format of practically any element of the chart. For example, the code below dramatically
changes the look of a chart by changing the colors of the Plot object.
Formatting Fonts
A very basic task with fonts might be to set the text of the chart's title. In order to do this, use the
Title object's Text property:
4
This is simple enough. The next question is how to change the font's attributes.
In order to format any text attribute on the chart, you must use the VtFont object. For example, to
format the title, the following code will work:
With MSChart1.Title.VtFont
.Name = "Algerian"
.Style = VtFontStyleBold
.Effect = VtFontEffectUnderline
.Size = 14
.VtColor.Set 255, 0, 255
End With
You can use the same technique with other parts of chart. The only difference lies in the object
model. For example, to format the text attributes of the Legend area use the following code:
MSChart1.Legend.VtFont.Size = 18
To change the scale of the plot, you must specify that the y axis of the chart is going to be changed
(changing the x axis has no visible effect). A convenient way to change the scale is to use a
ComboBox control, as shown in the following code:
Case "Percent"
MSChart1.Plot.Axis(VtChAxisIdY).AxisScale _
.Type = VtChScaleTypePercent
' Set the PercentBasis to one of six types. For
' the sake of expediency, only one is shown.
MSChart1.Plot.Axis(VtChAxisIdY).AxisScale _
.PercentBasis = VtChPercentAxisBasisMaxChart
Case "Linear"
MSChart1.Plot.Axis(VtChAxisIdY).AxisScale _
.Type = VtChScaleTypeLinear
5
End Select
End Sub
Using the functions in the preceding examples, you can take the Long value returned by the
CommonDialog object, and set the color of MSChart objects. The example below allows the user
to change the color of a Series by double-clicking it:
Before Rotation
7
After Rotation
You can also rotate a 3D chart by using the Set method of the View3D object.
MSChart1.Plot.View3D.Set 10,100
By default, the chart comes with one LightSource. The following code will set the four parameters
that affect the LightSource. These will be explained later. In the meantime, paste the code into a
standard EXE project, and run it.
This code results in a chart that appears to have a light source shining on it from the lower left of
the screen. As the chart is rotated, surfaces which face the light directly get brighter.
8
Light Basics
The LightSource feature is comprised of two parts:
Ambient light: As its name suggests, this is light that has no specific source and thus no
directionality.
LightSources: a directional light that can be shone on the chart from any angle, with
variable intensity. More than one light source can be created.
Ambient Light
Ambient light has a noticeable effect when you are using the LightSources. Ambient light simply
bathes the chart evenly in a light that comes from no particular direction. You can set the
AmbientIntensity property to any value between 0 and 1, with 0 turning off the light, and 1
increasing it to its maximum. For instance, to turn the ambient on to one quarter of its brightness,
set the AmbientIntensity property to .25.
Tip As you experiment with the LightSources, it is useful to set the property to 0. With no
ambient light, the effect of the LightSource is accentuated.
The EdgeVisible and EdgeIntensity properties work together to highlight the edges of the chart.
When the AmbientIntensity is set to a low value, you can set the EdgeIntensity property to a high
value. The result is that the edges seem to glow, as shown in the following figure:
LightSources
Each LightSource in the LightSources collection has an Intensity property which like the
AmbientIntensity property you can set to a value between 0 and 1. This property sets the
brightness of the individual LightSource.
Each LightSource also can be positioned in the virtual space that surrounds the chart by setting the
X, Y, and Z properties. By varying these properties, you can specify the direction from which the
light will shine on the chart.
9
Using the Add Method to Add a LightSource
By default, the MSChart contains one LightSource member in the LightSources collection. You
can, however, add LightSource members using the Add method, as shown below:
The parameters for the Add method include values for X, Y, and Z, which allow you to specify
exactly the angle from which the light will shine, and a value for Intensity of the light.
The example below shows three series of data by first creating a Recordset object that has four
fields; the first field contains the labels for the X axis, and remaining fields are displayed as series
data.
Option Explicit
' Be sure to set a reference to the Microsoft ActiveX Data
' Objects 2.0 Library.
Private rsProducts As New ADODB.Recordset
Private cn As New ADODB.Connection
' First change the path to a valid path for your machine.
cn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & _
"C:\Program Files\Microsoft Visual Studio\VB98\nwind.mdb" ' <-Change this
path.
10
Using an Excel Worksheet to Populate an
Array
If you have data stored in an Excel worksheet, you can use the GetObject method to get a reference
to the workbook that contains the worksheet, then retrieve the values using the reference. To first
get the reference, the only argument needed is the path to the workbook, as shown below:
Note In order to use Excel objects, you must set a reference to the Excel Objects library. To do
this, click the Project menu, then click References. Search for the Excel Objects library and
double-click it. Click OK. Also, note that if you're using GetObject with the Excel 5.0 Object
Library, you must declare the variable as a WorkSheet; if you are using the Excel 8.0 Object
Library, declare the variable as a WorkBook.
After setting a reference to the Excel object library, you can use the reference to walk through the
Excel object model, populating the array with data from the worksheet. To do this, use the Range
method in conjunction with the Value property to get the data from any single cell in a spreadsheet.
Dim arrPrices (1 to 7)
Dim i As Integer
For i = 1 to 7
' Fill the array with seven values from column B of
' the worksheet.
arrPrices(i) = wkbObj.Worksheets(1) _
.Range("B" & i + 1).Value
Next i
If you're not familiar with Excel spreadsheets, the following figure shows where the values are
coming from.
11
The layout of a spreadsheet, and the method used to refer to its cells, also maps conveniently to the
method of referring to data points in the MSChart control. For example, a "column" in a
spreadsheet (as in column "B" in the preceding illustration) corresponds to a "column" in the
MSChart. And when you create a multi-series chart, each column corresponds to a series.
Similarly, the "row" of a spreadsheet corresponds to the "row" in a "column" in the MSChart. For
this reason, it helps to engineer a chart with a spreadsheet in mind.
For example, just as we first created a multi-series chart by increasing the dimensions of the array,
we can now fill the array by using more than one column of the worksheet. In other words, to
create a multi-series chart, we fill two (or more) columns of the spreadsheet with numbers, and use
the columns to fill an array, as illustrated in the following code:
Dim arrData (1 to 7, 1 to 2)
Dim i As Integer
For i = 1 to 7
' Values from column A fill the first series of the
' array. If these values are strings, they become
' the labels for the rows.
arrData(i, 1) = wkbObj.Worksheets(1) _
.Range("A" & i + 1).Value
Tip Use the CurrentRegion property to return the number of rows in an Excel column. You can
then use this number to specify the upper bound of the array's first dimension.
The preceding code, used in conjunction with the spreadsheet shown in the figure above, will
produce a chart that has each row labeled with the appropriate day of the week.
12