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:
Sub EntferneNamen()
Dim i As Name
For Each DefName In ActiveWorkbook.Names
DefName.Delete
Next DefName
End Sub
Exceldatei 3. Mal einlesen - ok (Eintragungen passen, keine Fehlermeldung mehr)
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;