Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Excel Series.Value Zuweisung funktioniert mit Office 365 nicht (https://www.delphipraxis.net/200872-excel-series-value-zuweisung-funktioniert-mit-office-365-nicht.html)

Nekromus 3. Jun 2019 14:35

Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Liste der Anhänge anzeigen (Anzahl: 2)
Liebe Community,

Ich habe folgendes Problem:
mit der Verwendung von Office 365 funktioniert mein Code nicht mehr. Mit Excel 2010 funktioniert alles einwandfrei.
Das Problem habe ich bereits identifiziert. Die Series mit den XValues und den Values ist leer bei Verwendung von Office365.
Delphi-Quellcode:
  pts:= ser.Points(EmptyParam) as Points;
          überwachungsvariable:=pts.Count;  //= 0  Keine Werte in der Series
          pt:= pts.Item(pts.Count); // Hier knallt es


Die Zuweisung der Werte geschieht in den Zeilen 550 – 575 bei den Funktionen ExcelRangetoString.
Delphi-Quellcode:
function TDoExportForm.ExcelRangeToString(worksheet_name: WideString;
  rng: ExcelRange): WideString;
var
  s: WideString;
begin
  if worksheet_name <> '' then s:= QuotedStr(worksheet_name) + '!'
  else s:= '';

  Result:= '=' + s + rng.AddressLocal[false, false, xlA1, False, EmptyParam];
end;


function TDoExportForm.ExcelRangeToString(_ws: _Worksheet; cell1,
  cell2: OleVariant): WideString;
begin
  Result:= ExcelRangeToString(_ws.Name, _ws.Range[cell1, cell2]);
 end;
Das Result ist im Screenshot dargestellt:

Hat sich etwas in Office365 geändert?

Weitere Zuweisungen habe ich in den Zeilen 1089 ff probiert:
Delphi-Quellcode:
  ser.XValues:= '="DATA1(IGV=0°)"!D3:D62"';                  // OLE Fehler
          ser.XValues:= '="DATA1(IGV=0°)"!R[-3]C[-3]:R[-62]C[-3]"';  // OLE Fehler
          ser.XValues:= '="DATA1(IGV=0°)"!R3C3:R62C3"';              // OLE Fehler

          ser.Values:=rng; //Mitglied nicht gefunden
Keine Variante funktioniert. Die .tlb habe ich nicht verändert. Die komplette .pas ist im Anhang.

Hat jemand eine Idee??

Liebe Grüße und Danke
Tom

Der schöne Günther 3. Jun 2019 14:50

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Ich tue mich jetzt schwer mich durch eine 1700 Zeilen schwere Unit zu wühlen. Hast du kein Minimalbeispiel dass man nachstellen kann ohne Excel-Profi zu sein?

hoika 3. Jun 2019 15:09

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Hallo,
zumindestens hier steht ein Unterschied

https://stackoverflow.com/questions/...nd-office-2013

Da musst Du dich wohl mit "try and error" durchhangeln ...
Probier das doch mal als Macro in den beiden Words und finde (hoffentlich) die Unterschiede.

Chemiker 3. Jun 2019 22:29

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Hallo,

Du benutzt die „frühe Bindung“ um Excel zu steuern. Der Vorteil ist die Geschwindigkeit, dass bei der Deklaration automatisch IntelliSense zur Verfügung steht. Der Nachteil bei der frühen Bindung ist oftmals das die frühe Bindung an einer bestimmten Excel-Version gebunden ist.
Der große Vorteil bei Verwendung von der „späten Bindung“ besteht hauptsächlich darin, dass unabhängig von der Excel-Version gearbeitet werden kann, allerdings sollte man sich mit Objekten, Methoden und Eigenschaften von Excel vertraut machen.
Wenn Du also Excel – Version unabhängig arbeiten wills, solltest Du Deine Unit auf „späte Bindung“ umstellen.

Bis bald Chemiker

Nekromus 4. Jun 2019 08:06

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo hoika,

die Makroaufzeichnung habe ich mal als Screenshot angehängt. Da gibt es keine Unterschiede. Mein Screenshot von RangeToString stimmt ja überein (in Delphi).

@Chemiker,

hast du ein Tutorial zur späten Bindung für mich?

Lieben Dank

hoika 4. Jun 2019 08:29

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Hallo,
wo setzt du deine Variable ser?

PS:
Ich habe auch keine Lust, die 1.000 Zeilen zu durchgehen.

Nekromus 4. Jun 2019 09:31

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Delphi-Quellcode:
  for i:= 1 to Excel.Worksheets.Count do begin
    ws:= Excel.Worksheets[i] as _Worksheet;
    if IsDataWorksheet(ws) then begin
      spalteFlow:= FindeSpalte(ws, FlowStr);
      spalteValue:= FindeSpalte(ws, ValueStr);


      if (spalteFlow > 0) and (spalteValue > 0) then begin
        zeilen:= Min(ZaehleZeilen(ws, SpalteFlow), ZaehleZeilen(ws, SpalteValue));
        if Zeilen > 0 then begin
          ser:= sc.NewSeries;  //Hier wird neue ser erzeugt
          ser.Name:= ws.Name;
          ser.AxisGroup:= xlPrimary;
          überwachungsvariablestring:=ser.Name;

          cell1:= ws.Cells.Item[3, spalteFlow];
          cell2:= ws.Cells.Item[zeilen +2, spalteFlow];

          ser.XValues:= ExcelRangeToString(ws, cell1, cell2);
Danke für eure Mühe

hoika 4. Jun 2019 09:42

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Hallo,
hm, in dem Macro steht "=', du schreibst '="

Vielleicht mal '+QuotedStr benutzen?
Das ! bei D3 kann ich nicht.


Nimm doch mal testweise genau den gleichen String wie im Macro (auch wenn die Zellen selbst nicht passen).

Jumpy 4. Jun 2019 09:42

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zum Thema Late Binding bei Excel:

http://excelmatters.com/2013/09/23/v...-late-binding/

Nekromus 4. Jun 2019 11:23

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Hallo hoika,

"/' ist doch nur zwischen VBA und Delphi getauscht. Die direkte Zuweisung mit dem gleichen String habe ich auch schon probiert. Das wirft einen OLE-Fehler.

@Jumpy: Danke

Hat sonst niemand eine Idee? Dann müsste ich ja alle Units zu Late Binding umcoden :/

Jumpy 4. Jun 2019 12:15

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zitat:

Zitat von Nekromus (Beitrag 1433734)
Weitere Zuweisungen habe ich in den Zeilen 1089 ff probiert:
Delphi-Quellcode:
  ser.XValues:= '="DATA1(IGV=0°)"!D3:D62"';                  // OLE Fehler
          ser.XValues:= '="DATA1(IGV=0°)"!R[-3]C[-3]:R[-62]C[-3]"';  // OLE Fehler
          ser.XValues:= '="DATA1(IGV=0°)"!R3C3:R62C3"';              // OLE Fehler

          ser.Values:=rng; //Mitglied nicht gefunden

Tut vllt. nichts zur Sache, aber in den manuellen Versuchen wundert es mich, dass du da 3 Gänsefüßchen drin hast. Vor allem das mittlere wundert mich da jetzt.

p80286 4. Jun 2019 21:15

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zitat:

Zitat von Jumpy (Beitrag 1433826)

Tut vllt. nichts zur Sache, aber in den manuellen Versuchen wundert es mich, dass du da 3 Gänsefüßchen drin hast. Vor allem das mittlere wundert mich da jetzt.

Das ist aber sehr vorsichtig ausgedrückt. Die Macro-Aufzeichnung liefert etwas ganz anderes, als in der Delphi-Source steht.

Delphi-Quellcode:
  ser.XValues:= '"DATA1(IGV=0°)"!D3:D62'; // OLE Fehler
  ser.XValues:= '"DATA1(IGV=0°)"!R[-3]C[-3]:R[-62]C[-3]'; // OLE Fehler
  ser.XValues:= '"DATA1(IGV=0°)"!R3C3:R62C3'; // OLE Fehler
So geht's vllt. besser.

Gruß
K-H

Nekromus 5. Jun 2019 15:30

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Das bringt bei mir leider auch einen OLE-Fehler :/

hoika 5. Jun 2019 15:46

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Hallo,
nimm doch mal einen einfacheren Ausdruck zum Testen.
Oder sogar mal VarArrayOf(1.0,2.0,3.0).

p80286 5. Jun 2019 20:54

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Dann schmeiß zunächst einmal die Stringkonstante aus dem Excel-Teil heraus.
Versuch mal den Zugriff auf die Excel-Daten mit activesheet.cells(a,b).

Gruß
K-H

Nekromus 11. Jun 2019 14:42

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Ich bin wieder zurück :)

Auf die Excel-Daten kann ich mit activesheet.cells(a,b) zugreifen und mir die Daten auch anzeigen lassen über eine Message.

Zuweisungen an die Series funktionieren nicht. Ich benutze Delphi XE2. Das soll wohl ein XE2 Problem sein.

Etwas Interessantes:

Delphi-Quellcode:
überwachungsvariablestring:=ser.Formula;
gibt mir Folgendes: =Series("Data1(IGV=0°)",,,1).

Offensichtlich steht in meiner Series keine Range. Das würde auch erklären warum keine Daten in der Series stehen.

Nekromus 12. Jun 2019 06:52

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich versuche Office 2010.bpl als Komponente in RAD Studio 10.3 zu laden, bekomme ich den Fehler aus dem Screenshot. Kann jemand damit etwas anfangen?

Jumpy 12. Jun 2019 08:27

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Ist kein Access bei dem office-paket dabei?

EWeiss 12. Jun 2019 08:46

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zitat:

Zitat von Jumpy (Beitrag 1434405)
Ist kein Access bei dem office-paket dabei?

Sollte schon die richtige sein.. Oder? Access 2010 sonst läufts nicht.
Denke schon halt nur nicht die 2010'er und ich denke deshalb knallts..

gruss

Nekromus 12. Jun 2019 09:42

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Access ist bei meinem Office 365 dabei.

EWeiss 12. Jun 2019 09:58

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zitat:

Zitat von Nekromus (Beitrag 1434419)
Access ist bei meinem Office 365 dabei.

2010? Nun gut wenn dem so ist.

gruss

Delphi.Narium 12. Jun 2019 10:13

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Office 2010 ist aber nicht Office 365.

Genausowenig wie Packages für Office 97 mit Office 2000 liefen oder Office 2000 Packages mit Office 2003 oder ... durch die gesamte Versionshistorie ...

Such Dir mal in deinem Delphi die Funktion "Typbibliothek importieren".

Da solltest Du eine Liste von importierbaren Typbibiotheken finden. Ist da was für Office 365 bei? Dann importiere die bitte. In der Regel sollten dann in der Komponentenpalette unter ActiveX entsprechende Komponenten erscheinen.

Ist da nix bei, dann wähle bitte die Hinzufügenoption. Gehe in das Installationsverzeichnis von Office 365 und suche dort nach Dateien mit der Endung .olb ggfls. auch .tlb. Ist da was zu finden, dann importiere die bitte. Auch hier sollte dann unter ActiveX was in der Komponentenpalette zu finden sein.

Wie es bei aktuellen Delphis genau aussieht, weiß ich nicht, dass musst Du selbst herausfinden.

Sinngemäß müsste es in etwa so laufen: http://docwiki.embarcadero.com/RADSt...ry_Information

Suchmaschine bemühen: Bei Google suchendelphi import typelib office 365

Eventuell hilft das ja irgendwie weiter.

EWeiss 12. Jun 2019 10:21

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Eventuell reichen die Laufzeitbibliotheken für Access 2010 dafür schon aus.
https://www.microsoft.com/de-de/down....aspx?id=10910

gruss

Nekromus 12. Jun 2019 13:06

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Liste der Anhänge anzeigen (Anzahl: 3)
Lieben Dank für die Antworten.

Die Typbibliotheken habe ich schon. (siehe Screenshot RegTypbliotheken).

Die Packages konnte ich auch installieren (siehe Screenshots Komponenten installiert, installierte Packages).

Trotzdem habe ich keinerlei Office Komponenten in der Tool-Palette ....wie z.b TExelchart.

Delphi.Narium 12. Jun 2019 13:19

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zitat:

Zitat von Nekromus (Beitrag 1433734)
Delphi-Quellcode:
  ser.XValues:= '="DATA1(IGV=0°)"!D3:D62"';                  // OLE Fehler
          ser.XValues:= '="DATA1(IGV=0°)"!R[-3]C[-3]:R[-62]C[-3]"';  // OLE Fehler
          ser.XValues:= '="DATA1(IGV=0°)"!R3C3:R62C3"';              // OLE Fehler

          ser.Values:=rng; //Mitglied nicht gefunden

Die drei OLE-Fehler sehen mir nach Syntaxfehlern aus. Kenne keine Excelvariante, die mit 'ner ungeraden Anzahl von ' oder " auskommt.

https://www.delphipraxis.net/110582-...-erzeugen.html

p80286 12. Jun 2019 13:27

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1434440)
Die drei OLE-Fehler sehen mir nach Syntaxfehlern aus. Kenne keine Excelvariante, die mit 'ner ungeraden Anzahl von ' oder " auskommt.

https://www.delphipraxis.net/110582-...-erzeugen.html

Das hatten wir schon in #12/#13, angeblich ist es das nicht(?)

Gruß
K-H

Delphi.Narium 12. Jun 2019 13:43

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Es ist aber trotzdem falsch.

Bzw. wenn ein OLE-Fehler bleibt, heißt das nicht, dass die ungerade Anzahl von " egal ist oder nicht, sondern nur das es nach der Korrektur eine Fehlerursache weniger gibt, ansonsten aber noch mehr falsch sein dürfte.

Die vollständige Fehlermeldung wäre eventuell auch mal hilfreich. Bei OLE-Fehlern bekommt man oft noch 'ne hexadezmale Zeichenfolge geliefert, die bei der Annäherung an die Fehlerursache durchaus hilfreich sein kann.

Wenn man in Excel in 'ner Zelle sowas sieht 0° heißt das noch lange nicht, dass man es auch so per String an Excel übergeben kann. Eventuell muss da nur 'ne 0 übergeben werden, die Anzeige von 0° macht Excel dann, abhängig von der Formatierung der Zelle, selbst.

Da https://www.delphipraxis.net/200946-...ausrechen.html hatten wir ja auch gerade eine Frage bezüglich dessen, was man in Excel sieht und dessen, was man ausliest.

Nekromus 12. Jun 2019 13:58

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Delphi-Quellcode:
unit TestSpäteBindung;

interface

uses Variants, ComObj,Excel2010,Dialogs,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;

procedure ExcelFuellen;

implementation

procedure ExcelFuellen;
var
  Excel : Variant;
  row, column,I: Integer;
  WBk, WS, SheetName: OleVariant;
  Diagramm1: OleVariant;
  serie : OleVariant;
begin
    try
      Excel := GetActiveOleObject('Excel.Application');
    except
      Excel := CreateOleObject('Excel.Application');
    end;

  excel.Application.SheetsInNewWorkBook := 8; //Die 8 is die Anzahl der Sheets
  Excel.Workbooks.Add;

  Excel.Sheets[1].Name := 'DP Sheet'; //Hierbei ist 1 das erste Sheet 2 das zweite usw.
  //von nun an können wir unser Sheet auch über den gegebenen Namen ansprechen! zB:
  Excel.Sheets['DP Sheet'];

  row := 1;
  column := 2;
  Excel.Sheets['DP Sheet'].Cells[row,column].Value := 'Hallo';
  Excel.Sheets['DP Sheet'].Cells[1,3].value := 5.23; //Da Value vom Typ Variant is können wir hier fast alles reinschreiben

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,3].value := I;
  end;

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,4].value := I+30;
  end;

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,5].value := I+50;
  end;

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,6].value := I+80;
  end;

  Excel.Range['A1:B4'].Select; //Den Bereich A1 bis B4 makieren
  Excel.Selection.Font.Bold := true;//und im Makierten Bereich die Schriftdicke ändern

  Excel.Cells[row,column].select;
  Excel.ActiveCell.FormulaR1C1 := '=R2C1+R3C1'; // Rechnet A2 + A3

  //Excel.Sheets['DP Sheet'].Range['A5', 'A5'].Value := 'The meaning of life, the universe, and everything, is';
  //Excel.Sheets['DP Sheet'].Range['B5', 'B5'].Value := 42;

  Excel.Charts.Add;

  Excel.ActiveChart.ChartType:= xlColumnClustered;
  Excel.ActiveChart.Location (Where:= xlLocationAsObject, Name:= 'DP Sheet');
  Excel.ActiveChart.HasTitle := True;
  Excel.ActiveChart.ChartTitle.Characters.Text := 'Reisezeiten';
  Excel.ActiveChart.Axes(xlCategory, xlPrimary).HasTitle := True;
  Excel.ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text := 'Uhrzeit';
  Excel.ActiveChart.Axes(xlValue, xlPrimary).HasTitle := True;
  Excel.ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text := 'Dauer in sec';

  serie := Excel.ActiveChart.SeriesCollection.NewSeries;
    //serie.XValues := '=''Sued_Ost''!Z3S10:Z3'+'S10';
    //serie.Values := '=''Sued_Ost''!Z4S10:Z4'+'S10';

    serie.XValues := '=''Sued_Ost''!C3:C10';
    serie.Values := '=''Sued_Ost''!D3:D10';

  Excel.Visible := true;
  Excel := unassigned;
end;

end.
Ich versuche es gerade mal in später Bindung:

Komischerweise werden immer alle Datenreihen geplottet. Die Werte in der Serie haben gar keinen Einfluss auf das Diagramm.?

Nekromus 13. Jun 2019 07:53

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Bitte entschuldigt den 'Spam'.

Das 'Sued_Ost' musste ich natürlich durch den richtigen Worksheet Namen ersetzen. Jetzt habe ich das Problem, dass das Diagramm trotzdem alle Daten aus

Delphi-Quellcode:
  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,3].value := I;
  end;

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,4].value := I+30;
  end;

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,5].value := I+50;
  end;

  for I := 1 to 20 do begin
   Excel.Sheets['DP Sheet'].Cells[I,6].value := I+80;
  end;
automatisch ins Diagramm nimmt. Warum?

Moombas 13. Jun 2019 08:28

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Weil das Chart in Excel einen Bezug auf die Zellen hat (und behält). Änderst du die Zellwerte, ändert sich das Chart.

Nekromus 13. Jun 2019 08:52

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Ok. Ich habe eine Excel mit recht vielen Werten. Möchte aber nur ausgewählte Spalten anzeigen lassen. Wie kann ich das dann machen?

Ich dachte den Bezug hätte ich nur durch
Delphi-Quellcode:
serie.XValues := '=''Sued_Ost''!C3:C10';
    serie.Values := '=''Sued_Ost''!D3:D10';
festgelegt.

Jumpy 13. Jun 2019 08:59

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Indem du dem Diagramm nur gewisse Spalten als Datenquelle zuordnest?
Kannst du das nicht mal manuell in Excel machen und das mit dem Makro-Rekorder aufzeichnen, damit du weißt, wie das nachher im Code zu schreiben ist?

Nekromus 13. Jun 2019 09:01

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Genau. Das habe ich ja durch

Delphi-Quellcode:
 serie.XValues := '=''Sued_Ost''!C3:C10';
    serie.Values := '=''Sued_Ost''!D3:D10';
gemacht. Das wäre eigentlich nur eine Datenreihe.

Trotzdem hat er alle drin.

Jumpy 13. Jun 2019 10:07

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Ah Ok, jetzt versteh ich worauf du hinaus willst glaub ich. Es gibt in Excel-Diagrammen die SeriesCollection, als einer Sammlung von Datenreihen, die in dem Diagramm dargestellt werden. Du setzt immer nur die Daten der einer Serie aus dieser SeriesCollection.

Nekromus 14. Jun 2019 06:54

AW: Excel Series.Value Zuweisung funktioniert mit Office 365 nicht
 
Das Problem habe ich jetzt gelöst. Vielen lieben Dank an euch alle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 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