derhoeppi
Goto Top

PowerShell Excel Chart Sortierung - Reihenfolge der Legende ändern

Hallo,

ich habe aus PowerShell heraus eine Tabelle mit Charts erstellt. Diesen habe ich Serien hinzugefügt. Ich möchte die Serien gerne alphabetisch sortieren um die Übersichtlichkeit bei ca. 30 Serien zu erhöhen. Derzeit habe ich jedoch keine Idee wie ich es umsetzen kann, weil beim Aufzeichnen des Makros in Excel wurde außer dem selektieren des Charts nichts aufgezeichnet .
Bis jetzt habe ich die Serien in ein Array geschrieben und dort die Namen extrahiert, so dass ich diese sortieren kann. Nun stehe ich aber vor dem Problem, dass ich bisher keine Methode die Reihenfolge zu ändern. Muss das über Neuanlegen und löschen laufen oder gibt es einen einfacheren Weg?

Gruß
derhoeppi

Content-Key: 286915

Url: https://administrator.de/contentid/286915

Ausgedruckt am: 29.03.2024 um 12:03 Uhr

Mitglied: 122990
122990 28.10.2015 aktualisiert um 12:27:31 Uhr
Goto Top
Moin,
wie wärs mit vorher sortieren und dann die vorsortierten Serien gleich in der richtigen Reihenfolge hinzufügen ...?!
Oder du nutzt die PlotOrder Eigenschaft der Serien und weist ihnen den richtigen Index zu.
Vorgehensweise also: Sortiertes Array durchlaufen und mittels Schleife einen inkrementierten Index der PlotOrder-Eigenschaft zuweisen, feddich.

Gruß grexit
Mitglied: derhoeppi
derhoeppi 28.10.2015 um 13:15:07 Uhr
Goto Top
Hallo,

das Problem ist, dass im Laufe der Zeit weitere Reihen hinzukommen. Diese sollen dann ebenso sortiert werden. Aus diesem Grund ist es zwar möglich vor dem hinzufügen der Reihen diese zu Sortieren, aber das funktioniert eben nicht mehr für das nachträgliche Hinzufügen von Reihen.

Ich werde nun mal die PlotOrder Eigenschaft testen.

Gruß
derhoeppi
Mitglied: derhoeppi
derhoeppi 28.10.2015 um 15:32:47 Uhr
Goto Top
Hallo,

so ich habe mir die PlotOrder Eigenschaft angesehen. Zuerst habe ich die Eigenschaft für zwei Serien gesetzt. Danach war leider kein Unterschied zu sehen. Ich habe dabei Serien von ganz hinten nach ganz vorn verschieben wollen. In einem weiteren Versuch habe ich mir die Eigenschaft PlotOrder einer jeden Serie ausgegeben. Dabei musste ich feststellen das wenn ich vorher den Namen aus den SeriesCollection() in ein neues Array schreibe und dieses dann sortiere, ändert sich die PlotOrder - quasi nach der Reichenfolge im sortierten Array.

Deshalb bin ich zum Auslesen, sortieren und neu anlegen der Serien übergegangen. Abgesehen davon das es ewig dauert, habe ich ein Problem mit den Werten. Wenn ich aus einer Serie den Wert Values auslese erhalte ich den nativen Wert. Bei der ursprünglichen Einrichtung habe ich jedoch die Range für die Eigenschaft Values angegeben. Wie kann ich diese denn auslesen?

write-host "Chart_sort"  
    $seriesVMName = New-Object System.Collections.ArrayList
    $chartVMcount = $Excel.Worksheets.Item("Overview").Shapes.Item('ChartVMcount').Chart  
    $seriesVM = $chartVMcount.SeriesCollection()
    $seriesVMcounter = $seriesVM.count
    $seriesVMcounter
    foreach($serie in $seriesVM){
        $seriesVMName.Add($serie.Name) | Out-Null
        }
    $seriesVMName.Sort()
    #$seriesVMName
    
    for ($ChartIndex = 0 ;$ChartIndex -lt $seriesVMcounter; $ChartIndex ++){
        $seriesChart = $seriesVM | ?{$_.Name -eq $seriesVMName[$ChartIndex]}
        write-Host "Nächste Serie"  
        $seriesChart.Name
        $seriesChart.Values
        $seriesChart.xValues
        #$seriesChart.PlotOrder
        $NewSerie = $SeriesVM.NewSeries()
        $NewSerie.Name = $seriesChart.Name
        $NewSerie.Values = $seriesChart.Values
        $NewSerie.xValues = $seriesChart.xValues 
        #$chartVMcount.SeriesCollection($seriesVMName[$ChartIndex]).PlotOrder = $ChartIndex
        } 
Wenn ich statt dem neu erstellen der Serien die PlotOrder verwende, sehe ich in der Legende keinen Unterschied.

Gruß
derhoeppi
Mitglied: 122990
Lösung 122990 28.10.2015 aktualisiert um 20:53:18 Uhr
Goto Top
Wenn man es so macht wie ich empfohlen habe, geht das problemlos (hier getestet) !
$xl = New-Object -Com Excel.Application
$wb = $xl.Workbooks.Open("C:\Mappe1.xlsx")  
$xl.Visible = $true
$ws = $wb.Sheets.Item(1)
$chart = $ws.ChartObjects('Diagramm1').Chart  

$cnt = 1
$chart.SeriesCollection() | sort Name | %{
    $_.PlotOrder = $cnt
    $cnt++
}
Bei der ursprünglichen Einrichtung habe ich jedoch die Range für die Eigenschaft Values angegeben. Wie kann ich diese denn auslesen?
Schau dir mal diese Eigenschaften des Series-Objekts an:
Formula
FormulaLocal
FormulaR1C1
FormulaR1C1Local

e188b49dfdba21063a01b439c3b00c0c
Mitglied: derhoeppi
derhoeppi 28.10.2015 um 20:53:05 Uhr
Goto Top
Hallo grexit,

danke für die Unterstützung. Die vier Eigenschaften werde ich mir morgen ansehen. Die Lösung mit der PlotOrder ist jedoch aufgrund der wenigen Zeilen und der damit verbundenen Skriptlaufzeit deutlich attraktiver.

Gruß
derhoeppi