![]() |
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:
Und die Zahl wird in der Spalte linksbündig
ExcelApp := CreateOleObject('Excel.Application');
Workbook := ExcelApp.WorkBooks.Open(excelfilename); ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '0,00'; 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 |
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
Zitat:
Gruß, Andreas |
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:
nach
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '0,00';
Code:
geändert. Aber das Ergebnis ist das gleiche.
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '#.##0,00';
LG Mirko |
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.
![]() |
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:
versucht?
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := 'Standard';
Englisches Excel oder Deutsches? Wie sieht es mit Tausenderpunkt und Dezimalkomma aus? Ja nach Einstellung könnte es eventuell mit
Delphi-Quellcode:
bzw.
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '0.00';
Delphi-Quellcode:
funktionieren.
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '#,##0.00';
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. |
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
Zitat:
Spalte A, Zeile 1 [Edit] Ups, du meinstest den Wert in dem Feld und nicht diese Angabe "A1". |
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 |
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:
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.
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat
|
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
Hallo,
villeicht bringt das was Application.ErrorCheckingOptions.BackgroundCheckin g = false siehe ![]() Gruß |
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.
|
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 |
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. |
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 |
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
Zitat:
Wenn sich alle Daten "irgendwo" zwischen A1 und F97 befinden, dann könnte auch ein
Delphi-Quellcode:
reichen.
ExcelApp.Range['A1','F97'].EntireColumn.NumberFormat:= '#.###,00';
Delphi-Quellcode:
entspricht 6 Spalten und 97 Zeilen.
ExcelApp.Range['A1','F97']
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:
angegeben wird, dann gilt er auch nur für A1, also die erste Zelle oben links.
ExcelApp.Range['A1','A1']
|
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:
erzwingt gerade diese Konvertierung des Strings in ein Zahlenformat.
ExcelApp.Range['A1','A1'].Value2:= Zahl;
Gruß, Andreas |
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:
Kann ich das irgendwie korrigieren?
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '@'; LG Mirko |
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
Hallo Mirko,
die Programmzeile
Delphi-Quellcode:
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.
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '@';
Noch etwas habe ich bei meiner Delphi-Version (XE5 Pro) unter Windows 10 beobachtet: Die übliche Anbindung von Excel mittels
Delphi-Quellcode:
ist bei mir unzuverlässig, weil
Var
Excel: Variant; Begin Try Excel:= GetActive0le0bject('Excel.Application'); Except Excel:= CreateOleObject('Excel.Application'); End; ...
Delphi-Quellcode:
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:
GetActive0le0bject('Excel.Application');
Delphi-Quellcode:
Auf diese Weise konnte ich auch nicht-visuelle Konsolen-Anwendungen "wasserdicht" machen. Vielleicht hilft es jemandem hier weiter.
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'); ... Gruß, Andreas |
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
… und noch etwas:
Zitat:
Gruß, Andreas |
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 |
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 |
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:
Funktioniert leider nicht. Excel formatiert nach wie vor wie es möchte, bzw ein Datum erkannt wird.
ExcelApp.Range['A1','A1'].EntireColumn.NumberFormat:= 'dd/mm/yyyy';
LG Mirko |
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:
Gruß, Andreas
Excel.Range['A1','A10'].EntireColumn.NumberFormat:= 'TT/MMMM/JJJJ'; oder
Excel.Range['A1','A10'].EntireColumn.NumberFormat:= 'TT/MM/JJJJ'; |
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 |
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:
verwendet.
GRID.SaveFiletoXLS(Dateiname:String)
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 |
AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden
@oakley: Du könntest das ja nach der Systemsprache entscheiden (
![]() Ansonsten hilft dir das evtl weiter: ![]() bzw. ![]() und dort dann der Key "InstallLanguage", wobei 1031 DE_de ist: ![]() |
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:
Wenn syslang = 1031 habe ich als Systemsprache Deutsch.
LCID := Languages.indexOf(SysLocale.DefaultLCID);
syslang := Languages.LocaleID[LCID]; 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 |
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?
|
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:
LG
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; Mirko |
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ß |
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