Skriptbsp.: Diagramm in Excel

    • Offizieller Beitrag

    Hi,
    habe mal ein Muster erstellt zur Diagrammerstellung in Excel per AutoIt.
    Es ist durchkommentiert.
    Die Konstanten für weitere Diagrammtypen findet man in Excel ==> Extra ==> Makro ==> Visual Basic-Editor, dort im Objektkatalog.
    Im Suchfenster "XlChartType" eingeben, dann werden alle Konstanten aufgelistet.

    Spoiler anzeigen
    [autoit]

    Const $xlColumns = 2
    Const $xl3DPieExploded = 70
    Const $xlDataLabelsShowValue = 2

    [/autoit] [autoit][/autoit] [autoit]

    Local $oExcel = ObjCreate("Excel.Application") ; Excel-Objekt erstellen
    $oExcel.Visible = 1
    $oExcel.SheetsInNewWorkbook = 1 ; Anzahl der gewünschten Sheets beim Erstellen festlegen
    Local $oBook = $oExcel.Workbooks.Add ; im Excel-Objekt ein Workbook-Objekt erstellen
    Local $oSheet = $oBook.Sheets(1) ; Sheet-Objekt für Sheet 1 erstellen (Name oder Index)
    $oSheet.Name = 'Mein Sheet' ; Eigenschft Name ändern

    [/autoit] [autoit][/autoit] [autoit]

    ; oder vorhandene Datei öffnen:
    ;~ Local $oBook = $oExcel.WorkBooks.Open($sFilePath, Default, False)
    ;~ Local $oSheet = $oBook.Worksheets.Item(1) ; Index od. Name des Sheets

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten in neuem Sheet eintragen

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Range-Offset-Adressierung ermöglicht einfaches Navigieren mit Schleifen

    [/autoit] [autoit][/autoit] [autoit]

    ; Syntax: NewRange = Objekt.Range("StartZelle").Offset(ZeilenOffset, SpaltenOffset)
    ; Offset=0 ist die betreffende Zeile/Spalte selbst, die Adressierung ist relativ zur StartZelle
    ; negative Werte betreffen also Zeilen/Spalten oberhalb/vor der StartZelle

    [/autoit] [autoit][/autoit] [autoit]

    ; Spaltenbeschriftung B1:H1
    For $i = 0 To 7
    If $i = 7 Then
    $oSheet.Range("B1").Offset(0, $i).Value = 'SUMME'
    Else
    $oSheet.Range("B1").Offset(0, $i).Value = 'HEADER ' & $i+1
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeilenbeschriftung A2:A10
    For $i = 0 To 8
    $oSheet.Range("A2").Offset($i, 0).Value = 'NAME ' & $i+1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Werte eintragen B2:H10
    For $i = 0 To 8
    For $j = 0 To 6
    $oSheet.Range("B2").Offset($i, $j).Value = Random(8,30,1)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Formeln Summen Zeilen und Summe gesamt
    Local $r = 2
    For $i = 0 To 9
    If $i = 9 Then
    $oSheet.Range("I2").Offset($i, 0).Formula = "=SUMME(I2:I10)"
    Else
    $oSheet.Range("I2").Offset($i, 0).Formula = "=SUMME(B"&$r&":H"&$r&")"
    $r += 1
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Diagramm im $oSheet erstellen
    ; Um die Positionierung des Diagramms an einer Zelle auszurichten, kann man die Werte vorab abfragen
    ; und das Diagramm gleich mit diesen Parametern erstellen, oder anschließend verschieben

    [/autoit] [autoit][/autoit] [autoit]

    Local $width = 300, $height = 200

    [/autoit] [autoit][/autoit] [autoit]

    ; Ausrichtung linksbündig an Zelle B13:
    ;~ Local $left = $oSheet.Range("B13").Left
    ;~ Local $top = $oSheet.Range("B13").Top

    [/autoit] [autoit][/autoit] [autoit]

    ; Ausrichtung rechtsbündig an Zelle I13:
    Local $left = $oSheet.Range("J13").Left - $width ; Zelle J13: left = Zelle I13: right !
    Local $top = $oSheet.Range("I13").Top

    [/autoit] [autoit][/autoit] [autoit]

    ; Objekt Diagramm erstellen
    Local $oChart = $oSheet.ChartObjects.Add($left, $top, $width, $height).Chart

    [/autoit] [autoit][/autoit] [autoit]

    With $oChart
    .ChartType = $xl3DPieExploded ; Diagrammtyp festlegen
    .SetSourceData($oSheet.Range("I2:I10"), $xlColumns) ; Datenbereich für Diagramm
    .SeriesCollection(1).XValues = "='Mein Sheet'!Z2S1:Z10S1" ; Beschriftung Legende setzen (Namen aus A2:A10)
    .HasTitle = True ; Titel aktivieren
    .ChartTitle.Characters.Text = "Einzelsummen / Name (Gesamt = " & $oSheet.Range('I11').Value & ")" ; Titel
    .ApplyDataLabels($xlDataLabelsShowValue, False, True) ; Segmente Beschriften mit Werten
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    ; Diagramm (Zeichnungsfläche=Shape) ausrichten, wenn nicht vorab positioniert
    ;~ With $oSheet
    ;~ .Shapes(1).Top = $oSheet.Range("B13").Top ; Ausrichtung Top an Zelle B13.top
    ;~ .Shapes(1).Left = $oSheet.Range("B13").Left ; Ausrichtung Left an Zelle B13.left
    ;~ .Select
    ;~ EndWith

    [/autoit]
  • Toll, gefällt mir!
    Aber da ist ein Fehler (siehe Bild)
    MfG.
    Edit:/ Hab mir den Code noch nicht durchgeschaut, aber hast du da vielleicht ein ' vergessen?

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

  • Der Fehler tritt auf, weil die Daten für die Beschriftung in dem Objekt $oSheet stehen, und nicht im $oChart.

    Ersetzt die Zeile 76 folgendermaßen:

    .SeriesCollection(1).XValues = $oSheet.Range("A2:A10") ; Beschriftung Legende setzen (Namen aus Objekt $oSheet, A2:A10)

    und schon funktionierts.

    Gruss
    Findus

  • Sorry, wusste nicht, dass das beabsichtigt war.
    Aber dann muß es heißen:

    .SeriesCollection(1).XValues.Formula = "='Mein Sheet'!Z2S1:Z10S1"

    Dann kommt auch keine Fehlermeldung mehr.

    Gruss
    Findus

    • Offizieller Beitrag

    Da scheint es Unterschiede in den Excel-Versionen zu geben.
    Bei meinem Excel (Office 2000) kann ich Formeln auch ohne .Formula übergeben, da diese durch das führende = als solche identifiziert werden. Fehlermeldung erhalte ich dabei nicht.
    Aber es ist natürlich korrekt, eine Formel auch als solche zu kennzeichnen. ;)