Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden (https://www.delphipraxis.net/204327-excel-zahlen-werden-als-zahl-formatiert-muessen-aber-angeklickt-werden.html)

oakley 19. Mai 2020 13:49

Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo zusammen,

ich speichere ein TAdvStringgrid als Excel ab und erhalte durch nachträgliches Anpassen auch ein ordentlich formatiertes Excel Sheet.
Ich habe allerdings noch das Problem mit den Zahlen.Ich verwende:
Code:
ExcelApp := CreateOleObject('Excel.Application');
Workbook := ExcelApp.WorkBooks.Open(excelfilename);
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '0,00';
Und die Zahl wird in der Spalte linksbündig
und mit einem kleinen grünen Dreieck angezeigt. Klicke ich darauf wird die Zahl sauber formatiert.

Ich habe hier schon das ein oder andere gefunden aber irgendwie scheint das formatieren nicht zu funktionieren oder Excel erkennt

Ich verwende Excel 365.

Viele Grüße

Mirko

Andreas13 19. Mai 2020 14:05

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Zitat:

Zitat von oakley (Beitrag 1464884)
... Und die Zahl wird in der Spalte linksbündig

Es scheint mir eher ein String zu sein. Zahlenwerte werden von Excel automatisch rechtsbündig formatiert.
Gruß, Andreas

oakley 19. Mai 2020 14:27

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo Andreas,

wenn ich mit der rechten Maustaste auf die Zahl klicke und nachschaue, sehe ich, das sie als Zahl formatiert ist und oben links die Markierung für den Ablaufverfolgungsfehler angezeigt. Also das grüne Dreieck. Ich habe noch die Zeile:

Code:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '0,00';
nach

Code:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '#.##0,00';
geändert. Aber das Ergebnis ist das gleiche.

LG

Mirko

Jumpy 19. Mai 2020 15:12

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Das Problem ist, dass man Excel zur Neuberechnung/Evaluierung der Zelle zwingen muss. Das passiert z.B. in dem du da rein klickst. Wie man das jetzt schlau programmatisch machen kann, weiß ich auch nicht. Du könntest jetzt das rechtsbündig noch selber setzen, aber dann ist grüne Dreieck immer noch nicht weg.

https://docs.microsoft.com/de-de/off...-recalculation

Delphi.Narium 19. Mai 2020 16:01

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Mir stellt sich gerade die Frage: Ist das, was in A1 steht (aus Excelsicht) überhaupt eine Zahl?

Wie kommt der Wert in die Exceltabelle? Hast Du da mal etwas Code zu?

Oder mal mit
Delphi-Quellcode:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := 'Standard';
versucht?

Englisches Excel oder Deutsches?
Wie sieht es mit Tausenderpunkt und Dezimalkomma aus? Ja nach Einstellung könnte es eventuell mit
Delphi-Quellcode:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '0.00';
bzw.
Delphi-Quellcode:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '#,##0.00';
funktionieren.

In Excel gibt es oben, über dem Sheet doch auch die Eingabezeile, in der man (statt in 'ner Zelle) auch seine Werte, Zeichenfolgen, Zahlen, Formeln, ... eingeben kann. Wenn es sich bei Zahlen aus Excelsicht um einen String handelt, dann ist dort (in der Regel) vor der Zahl ein einzelnes Hochkomma zu finden.

In der Zelle steht die Zahl linksbündig und ist mit 'nem grünen Dreieck gekennzeichnet. In der Eingabezeile müsste dann statt 0 ein '0,00 stehen. Dort werden Zahlen auch nicht mit Nachkommastellen angezeigt, wenn sie keine enthalten. Soll also in der Zelle eine 0 stehen und nur die Darstellung mit zwei Nachkommastellen erfolgen, so darf in der Eingabezeile auch nur eine 0 stehen. Steht dort 0,00 bin ich mit (fast) sicher, dass Excel meint hier eine Zeichenfolge vorliegen zu haben. Prüf' das doch bitte mal zuerst. Solange Excel denkt, es sei eine Zeichenfolge, kannst Du Numberformat beliebig verändern, es wird sich nix wesentliches ändern.

himitsu 19. Mai 2020 16:49

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Zitat:

Mir stellt sich gerade die Frage: Ist das, was in A1 steht (aus Excelsicht) überhaupt eine Zahl?
Nein, das sind zwei Zahlen.

Spalte A, Zeile 1


[Edit]
Ups, du meinstest den Wert in dem Feld und nicht diese Angabe "A1".

oakley 19. Mai 2020 17:10

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
In A1 steht die Überschrift also ein Text.
Und es ist ein deutsches Excel.

LG

Mirko

Delphi.Narium 19. Mai 2020 17:15

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Wenn in A1 Text steht, kann das mit dem Numberformat auch nicht gehen, das ist nunmal nur für Zahlen und nicht für Text.

Delphi-Quellcode:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat
heißt: Setze das Zahlenformat für alle Zeilen im Bereich von A1 bis A1. Und der Bereich umfasst halt genau nur eine Zelle. Und wenn da Text drinne steht, ist das Numberformat vollkommen überflüssig, da absolut wertlos.

mmw 19. Mai 2020 17:33

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo,
villeicht bringt das was

Application.ErrorCheckingOptions.BackgroundCheckin g = false

siehe

https://docs.microsoft.com/de-de/off...groundchecking

Gruß

Rolf Frei 19. Mai 2020 18:08

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Das Problem ist sicher das NumberFormat. Das muss im ANSI Format angeben werden, also im Prinzip gleich wie in Delphi. Du gibst es aber im deutschen Format an. Deine Code würde hier in der Schweiz so nicht funktionieren, da wir hier ein anderes Zahlenformat haben, sprich Tausender- und Komma-Zeichen genau umgekehrt. Das ANSI Zeichen für den Tausender ist "," und für das Komma wäre es der Punkt ".". NumberFormat='#,##0.00' müsste eigentlich so funktionieren.

Chemiker 20. Mai 2020 00:35

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo,

was man machen kann, dass man den Wert nach der Formatierung überschreibt:

Delphi-Quellcode:
    zahl: Extended;    

   if TryStrToFloat(ExcelApp.Range['A1','A1'].value2, Zahl) then
   begin
     ExcelApp.Range['A1','A1'].EntireColumn.NumberFormat:= '#,###.00';
     ExcelApp.Range['A1','A1'].Value2:= Zahl;
   end;

Bis bald Chemiker

Jumpy 20. Mai 2020 10:07

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Wenn es am NumberFormat liegen sollte, kann man in Excel auch NumberFormatLocal verwenden, dann müsste er mit der deutschen Formatsmaske klar kommen. Aber wie gesagt, ich denke Excel versteht es ja, berechnet/evaluiert nur die Zellen nicht neu.
Da die Daten ja aus einem StringGrid kommen denke ich das alles als Text bei Excel reingeschrieben wird. Jetzt gibst du der Zelle mit einer Zahl als Text eine Zahlenformatierung und nun muss man Excel halt nur sagen, dass auch anzuwenden.

oakley 20. Mai 2020 11:54

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Also die Übergabe im ANSI Format (#,##0.00) funktioniert nicht, dann formatiert er falsch wenn ich auf die Zelle klicke.
Die Angabe #,##0.00 formatiert richtig als Zahl aber es bleibt das grüne Dreieck und Summen usw sind mit dem Werten nicht möglich.
Ein Klick mit der rechten Maustaste auf die Zelle bestätigt das Format als Zahl.

@Ralph: ja nur wie mache ich das? Wie bringe ich Excel dazu die Formatierung anzuwenden und nicht was eigenes zu generieren?

@Chemiker: habe ich so gemacht und es funktioniert. Danke !

LG

Mirko

Delphi.Narium 20. Mai 2020 12:15

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Zitat:

Zitat von oakley (Beitrag 1464938)
@Chemiker: Ich müsste dann wahrscheinlich durch jede Zelle in den Zahlenspalten "loopen" und neu schreiben, das würde sicher gehen.

Das Format muss für jede Zelle gesetzt werden und nicht nur für A1.

Wenn sich alle Daten "irgendwo" zwischen A1 und F97 befinden, dann könnte auch ein
Delphi-Quellcode:
ExcelApp.Range['A1','F97'].EntireColumn.NumberFormat:= '#.###,00';
reichen.

Delphi-Quellcode:
ExcelApp.Range['A1','F97']
entspricht 6 Spalten und 97 Zeilen.

Du könntest es auch mal in der Form versuchen:
Delphi-Quellcode:
ExcelApp.Range['A1',Format('%s%d',[Chr(StringGrid.Cols + 64),StringGrid.Rows])].EntireColumn.NumberFormat := '#.###,00';


Range ist der Bereich, für den das Format gelten soll. Wenn der Bereich mit
Delphi-Quellcode:
ExcelApp.Range['A1','A1']
angegeben wird, dann gilt er auch nur für A1, also die erste Zelle oben links.

Andreas13 20. Mai 2020 12:23

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo Mirko,
mich würde zur konkreten Nachvollziehung des Problems mal Dein Code für Deine ursprünglich nicht funktionierende Lösung interessieren, denn Du hast aller Wahrscheinlichkeit nach die Zahlen als Text an Excel übergeben.
Der funktionierende Vorschlag von Chemiker
Delphi-Quellcode:
ExcelApp.Range['A1','A1'].Value2:= Zahl;
erzwingt gerade diese Konvertierung des Strings in ein Zahlenformat.
Gruß, Andreas

oakley 20. Mai 2020 14:16

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo Andreas,

ja da hast Du recht. Ich habe die Speicher Routine eines AdvStringgrid von TMS genommen und die hat die Daten einfach als Text übertragen.
Das war der Fehler. Die Neuformatierung hat dann alles wieder gerade gebogen.

Noch eine kurze Frage, da ich nur sehr selten so etwas mache wie Excel fernsteuern: Im Editor wird mir EntireColumn.Numberformat als undeklariert angezeigt bei
Code:
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '@';
Kann ich das irgendwie korrigieren?

LG

Mirko

Andreas13 21. Mai 2020 19:56

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo Mirko,
die Programmzeile
Delphi-Quellcode:
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '@';
wird auch bei mir als undeklariert markiert, weil bei der vorliegenden "Frühen Bindung ohne Verwendung der Typbibliothek" die IDE über die importierten Routinen noch nichts "weiß". Die Stunde (Sekunde) der Wahrheit schlägt somit erst zur Laufzeit... Du mußt also die Routinen ausgiebig testen.
Noch etwas habe ich bei meiner Delphi-Version (XE5 Pro) unter Windows 10 beobachtet: Die übliche Anbindung von Excel mittels
Delphi-Quellcode:
Var
  Excel: Variant;

Begin
Try
  Excel:= GetActive0le0bject('Excel.Application');
Except
 Excel:= CreateOleObject('Excel.Application');
End;
...
ist bei mir unzuverlässig, weil
Delphi-Quellcode:
GetActive0le0bject('Excel.Application');
bei mir beim Fehlen des Excel-Servers zwar eine EOLESysError-Exception auslöst, aber merkwürdigerweise nicht in den Except-Block springt, sondern einen Programm-Abbruch zur Folge hat. Daher mußte ich eine ich aus den beiden obigen Routinen eine zusammengefasste GetOrCreateOleObject(..) machen:
Delphi-Quellcode:
Uses
, Vcl.OleAuto
, Winapi.Ole2
;
Function MyOleCheck(Res: HResult): Boolean;
Begin
  Result:= Failed(Res);
End;{MyOleCheck}
{--------------}

Function GetOrCreateOleObject(Const ClassName: String): Variant;
VAR
  Unknown   : IUnknown;
  ClassID   : TCLSID;
  WideCharBuf: Array[0..127] of WideChar;
  Fehler    : Boolean;
 
Begin
  StringToWideChar(ClassName, WideCharBuf, SizeOf(WideCharBuf) div 2);
  OleCheck(CLSIDFromProgID(WideCharBuf, ClassID));

  // GetActiveOleObject:
  Fehler:= MyOleCheck(GetActiveObject(ClassID, NIL, Unknown));
 
  // CreateOleObject:
  IF Fehler Then
    Fehler:= MyOleCheck(CoCreateInstance(ClassID, NIL, CLSCTX_INPROC_SERVER OR CLSCTX_LOCAL_SERVER, IID_IUnknown, Unknown));
   
  Try
    Result:= VarFromInterface(Unknown);
  Finally;
    Unknown.Release;
  End;
End;{GetOrCreateOleObject}
{------------------------}
...
Begin
  Try
     Excel:= GetOrCreateOleObject('Excel.Application');
  ...
Auf diese Weise konnte ich auch nicht-visuelle Konsolen-Anwendungen "wasserdicht" machen. Vielleicht hilft es jemandem hier weiter.
Gruß, Andreas

Andreas13 21. Mai 2020 20:09

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
… und noch etwas:
Zitat:

ja da hast Du recht. Ich habe die Speicher Routine eines AdvStringgrid von TMS genommen und die hat die Daten einfach als Text übertragen.
Das war der Fehler. Die Neuformatierung hat dann alles wieder gerade gebogen.
Das stimmt leider nicht. Durch einfaches Formatieren wird aus Excel's String-Zahlen, die jeweils einen Apostroph vor der Zahl haben (z. B. '1) noch keine Zahl. Probier es doch mal aus, indem Du nach der "Umformatierung" die Zahlenkolonne summierst oder mit ihnen andere arithmetische Operationen ausführst. Dann merkst Du sofort, daß es keine Zahlen, sondern Texte sind.
Gruß, Andreas

Chemiker 21. Mai 2020 20:31

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo Andreas13,

der Except Block wird zuverlässig ausgeführt!
Du hast eine nicht ordnungsgemäße geschlosse Excel-Instanz im Hintergrund laufen. Im Task-Manager wird diese Instanz unter Prozesse angezeigt.

Bis bald Chemiker

Andreas13 21. Mai 2020 21:48

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Danke Chemiker, das war der Grund für den Programm-Absturz!
Gruß, Andreas

oakley 22. Mai 2020 12:29

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Nachdem das Ganze jetzt mit dem Neuschreiben der Zahlen funktioniert wollte ich noch die letzte Spalte als Datum formatieren.
Ich habe ein Datum-Format mit Schrägstrichen, also sowas wie 24/12/2020 .
In Excel werden in der betreffenden Spalte teilweise Zellen als Text, teilweise Datum erkannt.
Code:
ExcelApp.Range['A1','A1'].EntireColumn.NumberFormat:= 'dd/mm/yyyy';
Funktioniert leider nicht. Excel formatiert nach wie vor wie es möchte, bzw ein Datum erkannt wird.

LG

Mirko

Andreas13 22. Mai 2020 18:27

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo Mirko,
für die deutsche Excel-Version mußt Du folgendes schreiben:
Delphi-Quellcode:
Excel.Range['A1','A10'].EntireColumn.NumberFormat:= 'TT/MMMM/JJJJ'; oder
Excel.Range['A1','A10'].EntireColumn.NumberFormat:= 'TT/MM/JJJJ';
Gruß, Andreas

Chemiker 22. Mai 2020 19:55

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo,

wenn man das TMS – StringGrid (das SG von Delphi funktioniert genauso) in Excel übertragen will, benutze ich folgende Routine, das ist ein Extrakt sollte aber funktionieren:
Delphi-Quellcode:
procedure HPL_TMS_SG_nach_Excel;
var i, j:integer;
    Text: String;
    Zahl : Extended;
    Datum: TDateTime;
    olevEXCEL: OLEVariant;

begin
  try
    olevExcel := CreateOleObject('Excel.Application');
  except
    ShowMessage('Microsoft Excel kann nicht starten.');
    exit;
  end;
  olevExcel.Visible := true;
  olevExcel.Workbooks.add;
  for i:=0 to AdvStringGrid1.rowcount-1 do
  begin
    for j:=0 to AdvStringGrid1.colcount-1 do
    begin
      Text:=AdvStringGrid1.cells[j,i];
      if TryStrToFloat(Text, Zahl) then
      begin
        olevEXCEL.cells[i+1,j+1].Value2:= Zahl;
      end
      else
      begin
        if TryStrToDate(Text,Datum) then
        begin
          olevEXCEL.cells[i+1,j+1].Value2 := Datum;
        end
        else
        begin
          olevEXCEL.cells[i+1,j+1].Value2 := Text;
        end;
      end;
     end;
  end;
  // Beispiel einer Formatierung
  // Spalte 3 sind Zahlen und werden mit 2 Kommastellen und Euro Zeichen formatiert
  // Anschließend werden die Zellen rot markiert bis auf die Überschrift.
  olevEXCEL.Range['C1','C10'].NumberFormat :='_(€* #.##0,00_);_(€* (#.##0,00);_(€* ""-""??_);_(@_)';
  olevEXCEL.Range['C2','C10'].Interior.Color:= CLRED;

  Showmessage ('Stop!');
  // Hier aus EXCEL die Datei abspeichern.
  // ist nicht im Code enthalten
  if NOT VarIsEmpty(olevEXCEL) then
  begin
    olevEXCEL.ActiveWorkBook.Saved:= TRUE;
    olevEXCEL.Quit;
    olevEXCEL:= Unassigned;
  end;
end;



Bis bald Chemiker

oakley 25. Mai 2020 09:46

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Danke für den Code Chemiker ich hatte bis jetzt immer nur die Standardfunktion
Code:
GRID.SaveFiletoXLS(Dateiname:String)
verwendet.

Andreas, gibt es da nichts, das Sprachunabhängig ist? Was macht man wenn man verschiedene Sprachversionen Excel hat? Deutsch und Englisch z.B.?

LG

Mirko

Moombas 25. Mai 2020 10:02

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
@oakley: Du könntest das ja nach der Systemsprache entscheiden (https://www.delphipraxis.net/175056-...-auslesen.html), da man in der Regel ja die Programme in der gleichen Sprache installiert wie auch die Systemsprache ist.

Ansonsten hilft dir das evtl weiter:
https://docs.microsoft.com/de-de/off...nguagesettings
bzw.
https://renenyffenegger.ch/notes/Win...esources/index
und dort dann der Key "InstallLanguage", wobei 1031 DE_de ist: https://www.science.co.il/language/Locale-codes.php

oakley 25. Mai 2020 15:21

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Okay also ich habe es jetzt so gemacht, dass ich LCID abfrage.


Code:
LCID := Languages.indexOf(SysLocale.DefaultLCID);
syslang := Languages.LocaleID[LCID];
Wenn syslang = 1031 habe ich als Systemsprache Deutsch.

Ich gehe dabei einfach mal davon aus, dass die installierte Excel Sprache gleich der Systemsprache ist.

Danke für Eure Hilfe und die zahlreichen Erklärungen.

LG

Mirko

Jumpy 25. Mai 2020 15:30

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Man kann doch das NumberFormat einfach mit dem amerikanischen/internationalen/allgemeingültigen Format-String setzen. Nur wenn ich stattdessen NumberFormatLocal benutze muss ich aufpassen, oder?

oakley 20. Jun 2020 20:48

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Also das nachträgliche Schreiben der Formate funktioniert.
Das Workbook wird auch nicht angezeigt weil Excelapp.Visible := false gesetzt ist.
Sobald Excel das erste mal gestartet ist wird eine zweite Excel Instanz erzeugt und die ist dann direkt sichtbar.

Wir kann ich unterdrücken, dass bei geöffnetem Excel das Workbook direkt angezeigt wird?

Code:
  ExcelApp := CreateOleObject('Excel.Application');
  Excelapp.Visible := false; <- Wird bei laufendem Excel ignoriert
  Workbook := ExcelApp.WorkBooks.Open(excelfilename); <- hier wird die Datei dann im sichtbaren Excel geöffnet, was aber falsch ist
  ExcelApp.Range['A1','J1'].EntireColumn.AutoFit;
  ExcelApp.Range['A1','J1'].Font.Bold := True;
  ExcelApp.Range['A1','J1'].HorizontalAlignment := -4108; //xlHAlignCeenter
  ExcelApp.Range['A1','J1'].Interior.Color := RGB(150,150,150);

...

  Excelapp.Visible := True;
LG

Mirko

mmw 21. Jun 2020 11:47

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Hallo,
so müsste es funktionieren.

Delphi-Quellcode:

var
  excel_obj: olevariant;
  i: Integer;
begin
  excel_obj := unassigned;
  excel_obj := GetActiveOleObject('Excel.application');

  for i := 1 to excel_obj.windows.count do
    excel_obj.Windows[i].visible := false;

  excel_obj := unassigned;

end;

Gruß

oakley 21. Jun 2020 14:56

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
 
Danke mmw,

das funktioniert.

LG

Mirko


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz