derhoeppi
Goto Top

PowerShell Excel Hinzufügen von Series zu einem Chart

Hallo,

in einem neuen Projekt sitze ich gerade daran in einer Excel Tabelle ein Chart zu erstellen, dass auf Werte in derselben Arbeitsmappe - aber in unterschiedlichen Tabelle verweist. Meine Vorgehensweise ist das Aufzeichnen von Makros für bestimmte Funktionen. Das Erstellen eines Charts habe ich bereits hinbekommen. Nun bin ich dabei die Daten auszuwählen. Im Makro sieht es z.B. so aus:
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).Name "=""Test"""  
ActiveChart.SeriesCollection(1).Values = "=Test!$B$4:$M$4"  
ActiveChart.SeriesCollection(1).XValues = "=Test!$B$3:$M$3"  

Im Anschluss folgt das Hinzufügen weiterer Serien / Reihen. In Powershell habe ich es nun so übersetzt:
$chart1 = $Excel.Worksheets.Item("Übersicht").shapes.item('Chart 1')  
$wks = $Excel.Worksheets.Item("Tabelle 1")  
$chart1.SeriesCollection().NewSeries
$chart1.SeiresCollection(1).Name = "FirstOne"  
$chart1.SeiresCollection(1).Values = $wks.Range("B4:M4")  
$chart1.SeiresCollection(1).XValues = $wks.Range("B3:M3")  

Wenn ich diesen Part ausführe erhalte ich folgende Meldung: "Method invocation failed because [System._ComObject] does not contain a method named 'SeriesCollection'."

Worin besteht mein Fehler?

Gruß
derhoeppi

Content-ID: 286748

Url: https://administrator.de/forum/powershell-excel-hinzufuegen-von-series-zu-einem-chart-286748.html

Ausgedruckt am: 25.12.2024 um 04:12 Uhr

114757
Lösung 114757 26.10.2015, aktualisiert am 27.10.2015 um 15:24:09 Uhr
Goto Top
Moin Meister Hoeppi ...
Worin besteht mein Fehler?
  • Erstens in Rechtschreibfehlern:
SeiresCollection
$chart1.SeiresCollection(1).Name = "FirstOne"
$chart1.SeiresCollection(1).Values = $wks.Range("B4:M4")
$chart1.SeiresCollection(1).XValues = $wks.Range("B3:M3")

  • Zweitens ist NewSeries() ist eine Methode keine Eigenschaft, und deshalb mit Klammern am Ende auszuführen
$chart1.SeriesCollection().NewSeries()

  • Drittens kann man das Chart auch direkt so ansprechen:
$chart1 = $Excel.Worksheets.Item("Übersicht").ChartObjects(1).Chart
  • Viertens kann man so auf die SeriesCollection verweisen:
$series = $chart.SeriesCollection().NewSeries()
$series.Name = "Test"  
$series.Values = '=Tabelle1!$A$3:$G$3'  
  • Fünftens solltest du darauf achten im Range für die Values in Hochkommas zu verwenden, denn bei doppelten Anführungszeichen werden die Dollarzeichen darin als Powershellvariablen interpretiert.
----
Funktionsfähiges Komplettbeispiel:
$xl = New-Object -Com Excel.Application
$wb = $xl.Workbooks.Open("C:\Mappe1.xlsm")  
$xl.Visible = $true
$ws = $wb.Sheets.Item(1)
$chart = $ws.ChartObjects(1).Chart
$series = $chart.SeriesCollection().NewSeries()
$series.Name = "Test"  
$series.Values = '=Tabelle1!$A$3:$G$3'  
Gruß jodel32
derhoeppi
derhoeppi 26.10.2015 aktualisiert um 21:29:58 Uhr
Goto Top
Hallo jodel32,

vielen Dank. Nun habe ich noch ein kleines Problem. Bei $series.Values wird der Tabellenname durch eine Variable bestimmt. Nun habe ich aber das Problem beim Zusammensetzen des Strings mit den Hochkomma und Anführungszeichen.

Als Beispiel sollte es in etwa so aussehen:
Var_Values = "'="+$Tabellenname+"!$A$3:$G$3'"  
$series.Values = $Var_Values

So wie du bereits geschrieben hast, interpretiert er die $ bei der Range Angabe als Variablen. Ich habe ebenso mit zusätzlichen Hochkommas versucht, aber bisher kommt nicht gescheites bei raus.

Zu deiner dritten Anmerkung habe ich noch eine Frage.
$chart1 = $Excel.Worksheets.Item("Übersicht").ChartObjects(1).Chart  
Ich gebe meinem Chart einen Namen. Kann ich dieses Objekt auch mit dem Namen ansprechen? Der Hintergrund dazu ist, dass ich mehrere Charts auf einem Tabellenblatt platziere, bei denen Series zur Scriptlaufzeit hinzugefügt werden. Ich möchte ungern vermuten welcher Chart nur 1,2,3 oder 4 ist.

Gruß
derhoeppi
114757
114757 26.10.2015 aktualisiert um 22:08:37 Uhr
Goto Top
$series.Values = "=$Tabellenname" + '!$A$3:$G$3'  

Kann ich dieses Objekt auch mit dem Namen ansprechen?
probier's doch einfach aus...

Laut Doku sollte auch der Name statt des Index gehen
https://msdn.microsoft.com/de-de/library/office/ff195149.aspx

Gruß jodel