Um ein Diagramm mit MSChart zeichnen zu können muss als erstes die MSChart Komponente in unser Projekt eingebunden werden. Das geht wie folgt:
Im Menüpunkt Projekt->Komponenten das Häckchen bei "Microsoft Chart Control 6.0 (OLEDB)" setzen. Nun erscheint in der Werkzeug Leiste ein kleines Diagramm Symbol. Damit können wir nun ein Diagramm in unser Formular zeichnen.
Nachdem wir das Diagramm an der richtigen Stelle positioniert haben, können wir die ersten Eigenschaften einstellen. Die Einstellungen können aber auch zur Laufzeit über unseren Code vor genommen werden. In meinem Beispiel habe ich das Meiste zur Laufzeit geändert. Hier gibt es eine Übersicht zu den Einstellmöglichkeiten des MSCharts aus dem MSDN.
MSChart-Steuerelement: Eigenschaften, Methoden und Ereignisse
Diagramm mit Daten füllen
Die ersten Einstellungen sowie das Füllen mit Daten wird am einfachsten über einen With Block vorgenommen:
erstes Beispiel: 1 Balken, Daten befinden sich im einem array
Code:
With MSChart1 'MSChart1 ist der Name unseres Diagrammes
.Repaint = true ' Gibt an ob das Diagramm bei Änderungen neu gezeichnet wird
.chartType = 1 ' Diagrammtyp (1 ist ein einfaches Balkendiagramm)
.RowCount = 12 ' Zahl der Werte (Bei mir 12, pro Monat einen Balken)
.ColumnCount = 1 ' Zahl der Linien
.Column = 1 ' Legt die aktuell verwendete Linie fest
For Position = 1 To .RowCount 'Position ist eine Laufvariable vom Typ Integer
.Row = Position 'Festlegen welchen Wert wir festlegen wollen
.Data = wertearray1(position) 'Hier wird der Tatsächliche Wert gesetzt
.RowLabel = Position ' Beschriftung
Next Position
End with
zweites Beispiel: 2 Balken, Daten befinden sich in zwei arrays
Code:
With MSChart1 'MSChart1 ist der Name unseres Diagrammes
.Repaint = true ' Gibt an ob das Diagramm bei Änderungen neu gezeichnet wird
.chartType = 1 ' Diagrammtyp (1 ist ein einfaches Balkendiagramm)
.RowCount = 12 ' Zahl der Werte (Bei mir 12, pro Monat einen Balken)
.ColumnCount = 2 ' Zahl der Linien
For Position = 1 To .RowCount 'Position ist eine Laufvariable vom Typ Integer
.Column = 1 ' Legt die aktuell verwendete Linie fest
.Row = Position 'Festlegen welchen Wert wir festlegen wollen
.Data = wertearray1(position) 'Hier wird der Tatsächliche Wert gesetzt
.RowLabel = Position ' Beschriftung
.Column = 2 ' Legt die aktuell verwendete Linie fest
.Row = Position 'Festlegen welchen Wert wir festlegen wollen
.Data = wertearray2(position) 'Hier wird der Tatsächliche Wert gesetzt
.RowLabel = Position ' Beschriftung
Next Position
End with
Code:
With MSChart1 'MSChart1 ist der Name unseres Diagrammes
.Repaint = true ' Gibt an ob das Diagramm bei Änderungen neu gezeichnet wird
.chartType = 1 ' Diagrammtyp (1 ist ein einfaches Balkendiagramm)
.RowCount = 12 ' Zahl der Werte (Bei mir 12, pro Monat einen Balken)
.ColumnCount = 1 ' Zahl der Linien
.Column = 1 ' Legt die aktuell verwendete Linie fest
If cngraph.State = adStateOpen Then 'Verbindung Schließen falls sie noch offen ist
cngraph.Close
End If
cngraph.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 'Verbindung zur Datenbank herstellen
"Jet OLEDB:Database Password='passwort';Mode=Share Deny None;" & _
"Persist Security Info=False;Data Source =" & App.Path & "\" & "vertraege.mdb;"
cngraph.CursorLocation = adUseClient
If rsgraph.State = adStateOpen Then 'RecordSet schließen falls es noch geöffnet ist
rsgraph.Close
Set rsgraph = Nothing
End If
rsgraph.Open "SELECT Count(idnr) AS AnzahlvonIDNr FROM tbl_vertraege, cngraph, adOpenDynamic, adLockOptimistic
For Position = 1 To .RowCount 'Position ist eine Laufvariable vom Typ Integer
if not rs.eof then
.Data = rsgraph("AnzahlvonIDNr") 'Hier wird der Tatsächliche Wert gesetzt
.RowLabel = Position ' Beschriftung
rsgraph.movenext
end if
Next Position
End with
Beschriftung
Jetzt haben wir unser Diagramm mit Werten gefüllt. Weitere Eigenschaften des Diagramms müssen aber ggf noch angepasst werden. Hier z.B. die Beschriftung der X-Achse. Sie ist momentan einfach nur mit einer Zahl beschriftet. Wir könnten z.B. eine Funktion einbauen die aus den Zahlen die Monatskurzformen bildet.
Code:
Public Function zahltomonatshort(ByVal I As Integer) As String Select Case I Case 1: zahltomonatshort = "Jan" Case 2: zahltomonatshort = "Feb" Case 3: zahltomonatshort = "März" Case 4: zahltomonatshort = "April" Case 5: zahltomonatshort = "Mai" Case 6: zahltomonatshort = "Juni" Case 7: zahltomonatshort = "Juli" Case 8: zahltomonatshort = "Aug" Case 9: zahltomonatshort = "Sep" Case 10: zahltomonatshort = "Okt" Case 11: zahltomonatshort = "Nov" Case 12: zahltomonatshort = "Dez" End Select End Function
Code:
.RowLabel = Position ' Beschriftung
Code:
.RowLabel = zahltomonatshort(Position) ' Beschriftung
In meinem Projekt wollte ich zunächst, dass die Y-Achse nicht direkt über dem höchsten Balken endet. Dazu baut man in die Schleife in der das Diagramm gefüllt wird zunächst eine Maxwert Ermittlung ein:
Code:
If maxwert < rsgraph("AnzahlvonIDNr") Then 'Bzw. Anstatt des Recordsets das Array in den anderen Beispielen
maxwert = rsgraph("AnzahlvonIDNr")
End If
Code:
.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = maxwert + 10
Ich bringe den maxwert einfach auf eine gerade Zahl und setze die Schritte zwischen den einzelnen Beschriftungen auf 2.
Dazu ersetzen wir die Zeile die bisher das Maximum festgelegt hat, also:
Code:
.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = maxwert + 10
Code:
If EvenNumber(maxwert + 10) = True Then 'gerade
.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = maxwert + 10
.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = (maxwert + 10) / 2
Else 'ungerade
.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = maxwert + 9
.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = (maxwert + 9) / 2
End If
Code:
Public Function EvenNumber(ByVal n As Long) As Boolean EvenNumber = (n And 1&) = 0& End Function
Maustaste auf das Diagramm->Eigenschaften, dort den Reiter Achse. Dann die Y Achse wählen und den Maximalwert sowie die Skalierung festlegen.
Jetzt werde ich auf einige bisher im Forum gestellte Fragen zum Thema MSChart eingehen und sie versuchen zu beantworten soweit es mir möglich ist. Die meisten Fragen sind natürlich schon von anderen Leuten beantwortet worden.
F: [...]Wenn ich mit der Maus auf eine Stelle im Graphen klicke, dass mir der Wert dann in einer MsgBox ausgegeben wird?
A: Hier können wir das Ereignis PointSelected verwenden. Es eignet sich aber nur bei bestimmten Diagramm Typen und ich finde es teilweise sehr unkomfortabel weil man ganz genau den Punkt mit der Maus treffen muss.
[/code]
Private Sub MSChart1_PointSelected(Series As Integer, DataPoint As Integer, MouseFlags As Integer, Cancel As Integer)
With MSChart1
.Row = DataPoint
End With
MsgBox MSChart1.Data
End Sub
[/code]
F: [...]möchte ich gerne einen Balken je nach Wert unterschiedliche Farben zuweisen. Hat einer eine Ahnung wie man das im Quellcode macht?
A: Zunächst einmal gibt es die Möglichkeit die Farbe der Balken in den Eigenschaften der MSChart zu ändern.Dazu klicken wir rechts auf unser Diagramm->Eigenschaften. Dort wählen wir den Reiter Datenreihenfarbe. In der Frage wurde jedoch nach einer Änderung der Farbe je nach Wert gefragt. D.h. wir müssen die Farbe zur Laufzeit im Quellcode ändern.
Dazu nehmen wir folgende Zeile:
Code:
if maxwert > 0 and maxwert < 50 then MSChart1.Plot.SeriesCollection(1).DataPoints(-1).Brush.FillColor.Set 0, 0, 255 'SeriesCollection(1) gibt an welche Linie end if if maxwert > 50 and maxwert < 100 then MSChart1.Plot.SeriesCollection(1).DataPoints(-1).Brush.FillColor.Set 255, 255, 255 'SeriesCollection(1) gibt an welche Linie end if
Anstatt .set 255, 255, 255 am ende kann man auch .red .blue oder .green verwenden oder aber .set und dann die RGB werte auf die gewünschte farbe setzen. (Den gewünschten RGB Wert kann man mit vielen Grafik Programmen ermitteln)
F: Ich würde gerne die Gitterlinien in meiner MSChart-Darstellung ausblenden (y-Achse) da bei Darstellung vieler Datenpunkte die Kurve nur noch schlecht sichtbar ist. Kann mir da jemand einen Tipp geben?
A: rechte Maustaste aufs Diagramm->Eigenschaften. Dort der Reiter Achsenraster.
F: Ich würde gerne bei einem MsChart Objekt die Hintergrundfarbe ändern, finde aber keine passende Option dafür! Wisst Ihr, ob das überhaupt möglich ist?
A: rechte Maustaste aufs Diagramm->Eigenschaften. Dort der Reiter Backdrop. Als Muster irgendein Muster wählen und dann die Farbe wählen.
F: Wie kann ich ein MSChart ausdrucken?
A: MSChart-Diagramm ausdrucken
phuu^^ das hat jetzt aber gedauert^^






