Einzelnen Beitrag anzeigen

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