![]() |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
@Holger: mit deinem Tool in meinem integriert.
Delphi-Quellcode:
@jumpy: Da ich die "extrahierte" Version von Holger nutze kommt die angesprochene Zeile so nicht mehr vor.
if StringGridToXLS(FXLApp, DE_XLS, 'DE') then SaveExcel(FXLApp) else CloseExcel(FXLApp);
//... ...ggf. mache ich es nachher testweise nochmal so, wie ich es ursprünglich gefunden hatte ( ![]() |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Mit folgendem Schnipsel, kann man aus einem Stringgrid in eine Excel-Tabelle schreiben:
Delphi-Quellcode:
(um den Spaltenfehler hab ich mich damals leider nicht mehr gekümmert)
if forcestring then begin
excel.activesheet.Cells.NumberFormat := '@'; end; for i:=0 to sg.rowcount-1 do begin for j:=0 to sg.colcount-1 do begin zelle:=sg.cells[j,i]; {---- Fehler 800A03EC bei mehr als 255 Spalten!} excel.activesheet.cells(i+1,j+1):=zelle; {cells1..x/1..y } end; end; Damit wird auch 007 übernommen. Gruß K-H |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Es scheint ein Problem der Exceldatei zu sein.
Und zwar durch folgendes ausgelöst: Exceldatei ("jungfräulich") mit den Daten gefüllt - ok Exceldatei 1mal eingelesen - ok Exceldatei 1mal gespeichert - ok (Eintragungen passen) Exceldatei 2. Mal einlesen - Fehler -> Namenskonflikt (_Filterdatabase) aus Exceldatei alle versteckten Namen entfernt mit folgendem Macro:
Code:
Exceldatei 3. Mal einlesen - ok (Eintragungen passen, keine Fehlermeldung mehr)
Sub EntferneNamen()
Dim i As Name For Each DefName In ActiveWorkbook.Names DefName.Delete Next DefName End Sub Exceldatei 2. Mal speichern - alles durcheinander Das Problem scheint also mit dem Namenskonflikt zu sein, denn wenn dieser nicht auftreten würde, bräuchte ich das Makro nicht auszuführen, welches scheinbar "zu viel" löscht und zu dem Fehler führt. -.- Aktuell scheint die Lösung zu sein, Excel direkt noch zu speichern:
Delphi-Quellcode:
function StringGridToXLS(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : string):Boolean;
const xlCellTypeLastCell = $0000000B; var Sheet: OLEVariant; MaxCol : Integer; MaxRow : Integer; Range : OleVariant; Data : OleVariant; Col : Integer; Row : Integer; R1,R2 : string; begin Result := False; try //Worksheet auswählen if (Sheetname <> '') and HaveSheet(AXLApp, Sheetname) then begin Sheet := AXLApp.WorkSheets[sheetname]; end else Sheet := AXLApp.WorkSheets[1]; Sheet.select; // Der vorhandenen Daten im Grid, nicht der möglichen in Excel... MaxCol := AGrid.ColCount; MaxRow := AGrid.RowCount; if (MaxRow > 0) and (MaxCol > 0) then begin //Bereich auswählen R1 := RefToCell(1, 1); R2 := RefToCell(MaxCol, MaxRow); Range := Sheet.Range[R1, R2]; if not VarIsNull(Range) then begin //Daten aus Grid holen Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant); for Row := 0 to Pred(MaxRow) do begin for Col := 0 to Pred(MaxCol) do begin Data[Succ(Row), Succ(Col)] := AGrid.Cells[Col, Row]; end; end; //Daten dem Excelsheet übergeben Range.Value := Data; Range.Columns.AutoFit; Result := True; end; end; finally SaveExcel(AXLApp); Range := UnAssigned; Sheet := Unassigned; Data := Unassigned; end; end; |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
So, ich arbeite nun mit dem Programm und seit der letzten Änderung (zwischendurch das Speichern) trat kein Namenskonflikt und auch sonst kein Problem mehr mit Excel auf :)
Danke für eure Hilfe und Unterstützung ;) Evtl. hilft der Thread auch anderen weiter, es war ja doch ein recht spezielles Problem. |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
Hallo Moombas,
ich will mal grundsätzlich die Frage stellen, ob Dein Vorgehen Zielführend ist. Ich habe das so verstanden: 1. Excel-Datei wird in einem Stringgrid eingelesen 2. In dem Stringgrid werden einigen Daten verändert 3. Das Stringgrid mit den veränderten Daten wird zurück in die Excel-Datei geschrieben Da die Synchronisierung zwischen Deinen Programm und Excel zu Problemen führen kann, stelle ich mal 2 Alternativen vor. Was spricht dagegen, die Daten die verändert werden sollen direkt in Excel mit Hilfe Deines Programms zu ändern, ohne den Umweg über das Stringgrid. Die andere Möglichkeit ist, die Daten aus der Excel-Datei in einem Stringgrid einzulesen, die Daten im Stringgrid zu verändern und anschließend in einer XLS-Datei ohne Excel zu speichern. Bis bald Chemiker |
AW: Excel Stringgrid in (vorhandene) Excel abspeichern
@Chemiker:
Der Umweg über das Stringgrid ist kein Umweg :) Die Daten der Exceldatei sollen über das Stringgrid geändert werden können und zusätzlich werden diese teilweise automatisiert geändert. Und wie gesagt seit der letzten Änderung ist nur einmal ein Problem aufgetreten, welches aber wohl an einer anderen Stelle lag. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 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 by Thomas Breitkreuz