Mit iGrafx Professional haben Sie die Möglichkeit, einzelne Objekte mit diversen Daten zu hinterlegen. Mit Hilfe dieser Daten lassen sich dann beispielsweise auch Inventarlisten erstellen. Als einfachstes Beispiel wäre hier die Möglichkeit zu nennen, ein benutzerdefiniertes Feld für den Preis der jeweiligen Komponente hinzuzufügen. Nachdem benutzerdefinierte Felder global verteilt werden, stehen diese jedem Objekt innerhalb eines Charts zur Verfügung.
Die Werte dieser Datenfelder sollen nun ausgelesen und in Microsoft Excel exportiert werden. Anschließend soll dann in Excel noch die Summe der einzelnen Komponenten gebildet und die jeweilige ID der Objekte und der Objektname vermerkt werden. Damit ist es möglich, in Excel einzelne Objekte zu löschen, die dann analog dazu im iGrafx Professional Chart entfernt werden. Optional können Sie nach dem gleichen Prinzip auch eine Datenbank-Anbindung einrichten.
In der Visual Basic-Entwicklungsumgebung legen Sie zunächst ein neues Modul an. Dies hat den Sinn, dass auf die im Code enthaltenen Informationen aus verschiedenen Bereichen zugegriffen werden kann.
Zunächst müssen die einzelnen Variablen in dem Modul definiert werden. Die Variablen werden als Global definiert, da Sie so darauf auch aus Formularen zugreifen können.
Global iObj As Integer
Global iDef As Integer
Global iShapeObj As Integer
Global igxDocument As iGrafx3.Document
Global igxDiagram As Diagram
Global igxDataDef As CustomDataDefinitions
Global igxObjekt As DiagramObject
Global MyExcel As Excel.Application
Global ws As Excel.Worksheet
In dem Modul legen Sie nun eine Prozedur mit dem Namen "LeseDaten" an. Darin werden zunächst die einzelnen Objekte initialisiert. Dies erfolgt durch Zuweisung der entsprechenden Objekte an die Variablen per Set-Anweisung. Ferner wird Excel gestartet und dort ein Arbeitsblatt hinzugefügt.
Sub LeseDaten()
Set igxDocument = Application.ActiveDocument
Set igxDiagram = igxDocument.ActiveDiagram
Set MyExcel = New Excel.Application
MyExcel.Visible = True
MyExcel.Workbooks.Add
Set ws = MyExcel.ActiveSheet
Im nun folgenden Teil werden die Spaltenüberschriften in die Excel Tabelle eingefügt und entsprechend formatiert. Es werden hierbei die ID und der Name des Objektes eingetragen.
ws.Range("A1") = "ID"
ws.Range("B1") = "ObjectName"
ws.Rows("1:1").Select
MyExcel.Selection.Font.Bold = True
In der nun folgenden Schleife werden die Namen der benutzerdefinierten Felder ausgelesen und als Spaltenüberschrift in die Tabelle eingetragen. Es ist hierbei unerheblich, wie viele benutzerdefinierte Felder angelegt wurden, da aufgrund der Count-Eigenschaft alle etwaigen Einträge abgefragt werden.
For iObj = 1 To igxDocument.CustomDataDefinitions.Count
ws.Cells(1, iObj + 2) = _
igxDocument.CustomDataDefinitions(iObj).Name
Next
Nun werden noch die eigentlichen Daten der benutzerdefinierten Felder, die Objekt ID und der Shape Name ausgelesen und der entsprechenden Spalte in Excel zugewiesen. Auch hier werden wieder alle Objekte über eine Schleife über die Count-Eigenschaft abgefragt. Es werden aber lediglich Shapes als gültige Objekte zugelassen. Linien oder Zeichenobjekte werden somit nicht verarbeitet.
For iObj = 1 To igxDiagram.DiagramObjects.Count
Set igxObjekt = igxDiagram.DiagramObjects(iObj)
' Nur Shape-Objekte
If igxObjekt.Type = ixObjectShape Then
iShapeObj = iShapeObj + 1
ws.Cells(2 + iObj, 1) = igxObjekt.ID
ws.Cells(2 + iObj, 2) = igxObjekt.ObjectName
For iDef = 1 To igxDocument.CustomDataDefinitions.Count
ws.Cells(2 + iObj, 2 + iDef) = _
igxObjekt.CustomDataValues.Item(1).Value
Next
End If
Next
Zuletzt wird die Summe der eingetragenen Werte aus dem Feld Preis gebildet, die Spalte mit den Objekt Namen automatisch auf die optimale Breite eingestellt und die Zelle A1 aktiviert, so dass die Markierung aufgrund der "Autofit" Funktion nicht mehr erscheint.
ws.Cells(iShapeObj + 4, 1) = "Summe"
ws.Cells(iShapeObj + 4, 3).Select
MyExcel.ActiveCell.FormulaR1C1 = _
"=SUM(R[-" & iShapeObj + 1 & "]C:R[-2]C)"
ws.Cells(1, 2).EntireColumn.AutoFit
ws.Columns("A:A").Select
MyExcel.Selection.HorizontalAlignment = xlLeft
ws.Range("A1").Select
End Sub
In der zuletzt folgenden Prozedur namens "Start" wird das Formular UserForm1 durch die Methode SHOW aufgerufen. Das Formular wird im nächsten Abschnitt erstellt.
Sub Start()
UserForm1.Show
End Sub
Fügen Sie ein neues UserForm ein. Platzieren Sie wie in der Abbildung zu sehen zwei Schaltflächen auf dem UserForm. Die Caption-Eigenschaften dieser Schaltflächen, sprich die Bezeichnung, können Sie frei wählen oder Sie übernehmen die Beschriftungen aus der Abbildung.

Nun muss noch das Formular mit Code hinterlegt werden. Bei einem Click-Ereignis auf die erste Schaltfläche soll die Subroutine "LeseDaten" ausgeführt werden. Da diese Routine in einem Modul steht, kann sie direkt ausgeführt werden.
Private Sub CommandButton1_Click()
LeseDaten
End Sub
Bei einem Click Ereignis auf die zweite Schaltfläche sollen die zuvor in Excel markierten Objekte im Chart und in Excel entfernt werden. Dies wird mit zwei verschachtelten For-Next Schleifen erreicht. Hier wird der markierte Bereich (dies können auch mehrere unabhängige Zeilen sein) abgefragt und im Falle, dass es sich um Shapes handelt, im iGrafx Chart entfernt. Zuletzt werden die markierten Zeilen in Excel gelöscht.
Private Sub CommandButton2_Click()
Dim r As Excel.Range
Dim objID As Integer
For Each r In MyExcel.Selection.Rows
If Not IsNumeric(ws.Cells(r.Row, 1)) Then
Exit For
End If
objID = ws.Cells(r.Row, 1)
For Each igxObjekt In igxDiagram.DiagramObjects
If igxObjekt.Type = ixObjectShape Then
If igxObjekt.ID = objID Then
igxObjekt.DeleteDiagramObject
End if
End If
Next
Next
MyExcel.Selection.EntireRow.Delete
ws.Cells(1, 1).Select
End Sub
Wenn Sie das Formular ausführen, erscheint das Formular in Ihrem Chart und Sie können die Objekte auslesen. Ferner wird automatisch ein Makro hinterlegt, das Sie über das Menü Extras - Visual Basic - Makros aufrufen können. Das Macro befindet sich in Document.Projects und trägt den Namen Module1.Start.
|