AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel Chart positionieren

Ein Thema von Sidi61 · begonnen am 8. Dez 2016 · letzter Beitrag vom 12. Dez 2016
Antwort Antwort
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#1

Excel Chart positionieren

  Alt 8. Dez 2016, 23:27
Hallo Forenmitglieder,

hänge mal wieder fest. In meiner Excel-Unit habe ich eine Funktion zum einfügen eines Diagramms geschrieben. Das Erzeugen und einfügen funktioniert, die Positionierung des Diagramms gelingt mir allerdings nicht.

Ich habe mehrere Ansätze die ich so gefunden habe ausprobiert, leider ohne Erfolg.

Weiß vielleicht jemand woran es liegt???

Delphi-Quellcode:
Procedure TFormExcel.MakeChart(Daten: TChartData);
var I : integer;
    Bereich, B, Tabelle : string;
    DName, DN : string; //Namen der Datenreihen
    Diagramm, P,CO : OleVariant;
begin
  //aus welchen Gründen auch immer übernimmt das Diagramm die zuvor in eine Tabelle
  //eingetragenen Datenreihen
  Diagramm := ExcelApp.ActiveWorkbook.Charts.Add;
  Diagramm.Activate;


  //Diagramm.ChartType := xlColumnClustered; //Balkendiagramm
  //Diagramm.ChartType := xlXYScatterLinesNoMarkers; //Liniendiagramm
  Diagramm.ChartType := Daten.Typ;

  //Übernahme der Datenbereihe zu den einzelnen Datenreihen
  Bereich := Daten.Datenbereich;
  if Bereich[length(Bereich)] <> ';then Bereich := Bereich + ';'; //sicherstellen dass auch der letzte Eintrag ein Semikolon am Ende hat
  //Übernahme der Datenreihenbezeichnungen
  DName := Daten.Titel;
  if DName[length(DName)] <> ';then DName := DName + ';';

  if Daten.DatenblattNummer > 0 then //Name des Tabellenblattes ermitteln
  begin
    Tabelle := ExcelApp.ActiveWorkbook.Worksheets[Daten.DatenblattNummer].Name;
  end else
  begin //ist der Name des Tabellenblattes bekannt dann diesen direkt übernehmen
    Tabelle := Daten.DatenblattBezeichnung;
  end;

  for I := 1 to Daten.Datenreihen do //arbeitet alle Datenreihen ab
  begin
    B := Copy(Bereich,1,pos(';',Bereich)-1); //Bereich ohne Semikolon herausfiltern
    Delete(Bereich,1,pos(';',Bereich)); //ist nur ein Bereich definiert, ist B nachher leer
    DN := Copy(DName,1,pos(';',DName)-1);
    Delete(DName,1,pos(';',DName));

    //da u.U. die Datenreihen bereits vorhanden sind, nur fehlende Datenreihen neu einrichten
    if I > Diagramm.SeriesCollection.count then Diagramm.SeriesCollection.NewSeries;

    //Zuweisen der Daten zur Datenreihe
    Diagramm.SeriesCollection(I).Values := '='+''''+Tabelle+''''+'!'+B;

    //Bezeichnung der Datenreihe
    Diagramm.SeriesCollection(I).Name := DN;
  end;

  //Das Einfügen des Diagramms in ein neues bzw. bestehendes Datenblatt darf erst
  //erfolgen wenn es praktisch fertig ist da es sonst bei Anweisungen in der for-Schleife
  //zu Fehlermeldungen kommt
  if Daten.NeuesBlatt then Diagramm.Location(xlLocationAsNewSheet,Daten.ChartTitel)
                      else Diagramm.Location(xlLocationAsObject,Tabelle);



   //Fehlermeldung: Die Methode Left wird vom Automatisierungsobjekt nicht unterstützt
   //Diagramm.left := ExcelApp.ActiveWorkbook.ActiveSheet.cells[20,3];
   //Diagramm.Top := ExcelApp.ActiveWorkbook.ActiveSheet.cells[20,3];

   //Fehlermeldung: Mitglied nicht gefunden
   //Diagramm.Location.Top := ExcelApp.ActiveWorkbook.Activesheet.Rows(20).Top;
   //Diagramm.Location.Left := ExcelApp.ActiveWorkbook.Activesheet.columns(3).Left;

   //Fehlermeldung: OLI-Fehler 800A01A8
   //ExcelApp.ActiveWorkbook.ActiveSheet.Shapes(Diagramm.Name).Top := 1;
   //ExcelApp.ActiveWorkbook.ActiveSheet.Shapes(Diagramm.Name).Left := 1;

   //Fehlermeldung: OLE-Fehler 800A01A8
   //Diagramm.ChartArea.Select;
   //ExcelApp.ActiveWorkbook.ActiveSheet.Shapes(Diagramm.Name).IncrementLeft := -200;
   //ExcelApp.ActiveWorkbook.ActiveSheet.Shapes(Diagramm.Name).IncrementTop := 100;

   //Gibt zwar keine Fehlermeldung positioniert aber auch nicht das Chart
   //ExcelApp.ActiveWorkbook.ActiveSheet.Shapes.Item(1).Top := ExcelApp.ActiveWorkbook.ActiveSheet.Rows.Item[20].Top;
   //ExcelApp.ActiveWorkbook.ActiveSheet.Shapes.Item(1).Left := ExcelApp.ActiveWorkbook.ActiveSheet.Columns.Item[2].Left;

end;
Freue mich über jede Antwort

Gruß
Sidi61
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Excel Chart positionieren

  Alt 8. Dez 2016, 23:59
Mein Excel kommt mit demhier zurecht:  ActiveSheet.Shapes("Diagramm 1").Left := 0; Im Zweifelsfalle in Excel ein Makro aufzeichnen, in dem Du die gewünschte Aufgabe erledigst und dann den so erzeugten VBA-Quelltext nach Delphi übernehmen und die Syntax dann entsprechend anpassen. Meistens klappt das recht gut und mit wenig Aufwand.
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Excel Chart positionieren

  Alt 9. Dez 2016, 22:15
Hallo nahpets,

so wie dein Beispiel zeichnet das Excel Makro auf Shapes("Diagramm 1") - das lässt sich natürlich nicht compilieren.

Ein Versuch mit Shapes('"Diagramm 1"') oder Shapes('Diagramm 1') erzeugt den Fehler: Mitglied nicht gefunden.

Damit komme ich leider nicht weiter.

Gruß
Sidi61
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Excel Chart positionieren

  Alt 11. Dez 2016, 22:59
Hallo zusammen,

nach dem ich nach unzähligen Versuchen nicht zum Erfolg gelangt bin, habe ich nun einen anderen Ansatz probiert der soweit zu funktionieren scheint

Hatte ich zuvor das Diagram wie folgt erzeugt:

Diagramm := ExcelApp.ActiveWorkbook.Charts.Add habe ich es jetzt wie folgt erzeugt:

Diagramm := ExcelApp.ActiveWorkbook.Sheets[1].ChartObjects.Add(10,100,400,200); Hier kann ich die erforderlichen Parameter übergeben: Abstand links, Abstand oben, Chartbreite, Charthöhe.

Die Angaben entsprechen jedoch nicht Millimeter-Werten, eine Umrechnung wie bei Zeilenhöhe und Spaltenbreite passt hier auch nicht.

Weiß jemand welche Einheit diese Parameter darstellen und wie hier auf mm umgerechnet werden kann??

Übrigends, das Ausrichten an einer Zelle funktioniert hier auch:

Delphi-Quellcode:
Z := ExcelApp.ActiveWorkbook.Sheets[1].Range['D20'];
Diagramm.Left := Z.Left;
Diagramm.Top := Z.Top;
Gruß
Sidi61
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Excel Chart positionieren

  Alt 11. Dez 2016, 23:26
Ich bin´s noch mal

Anscheinend sei die Maßeinheit 72 Punkte je Zoll.

Ich habe mal wie folgt umgerechnet:

Delphi-Quellcode:
//Test:
  //15 mm Abstand zum linken Druckbereich
  PosL := round(15 / 25.4 * 72);
  //50 mm Abstand zum oberen Druckbereich
  PosT := round(50 / 25.4 * 72);
  //120 mm Breites Chart
  ChartW := round(120 / 25.4 * 72);
  //100 mm Hohes Chart
  ChartH := round(100 / 25.4 * 72);

  //Parameter: Pos Left, Pos Top, Breite, Höhe
  Diagramm := ExcelApp.ActiveWorkbook.Sheets[Daten.DatenblattNummer].ChartObjects.Add(PosL,PosT,ChartW,ChartH);
Die Zielwerte sind nah drann - der Abstand zum linken Druckberich stimmt, die 50 mm zum oberen Druckbereich sind gemessen 48 mm, die Diagrammbreite hat statt 120 mm gemessen 130 mm und die Diagrammhöhe statt 100 gemessen 97 mm.

Geht das nicht genauer??

Gruß
Sidi61
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Excel Chart positionieren

  Alt 12. Dez 2016, 09:32
Hallo nahpets,

so wie dein Beispiel zeichnet das Excel Makro auf Shapes("Diagramm 1") - das lässt sich natürlich nicht compilieren.

Ein Versuch mit Shapes('"Diagramm 1"') oder Shapes('Diagramm 1') erzeugt den Fehler: Mitglied nicht gefunden.

Damit komme ich leider nicht weiter.

Gruß
Sidi61
Hat mit der Sache nix zu tun, aber nur um das aufzuklären: In Delphi muss man natürlich eckige Klammern nehmen.

Das man bei Excel darauf achten muss, ob man ein Chart hinzufügt oder ob man auf einem Worksheet ein Chart hinzufügt, hast du ja schon gemerkt.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz