Moin zusammen,
ein wenig weiter bin ich nun gekommen, jedoch scheitere ich an folgender Hürde, da ich leider keine Fehlermeldung erhalte, nur einen "halben" Absturz:
Delphi-Quellcode:
function StringGridToXLS(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : widestring):Boolean;
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, String(Sheetname)) then
begin
Sheet := AXLApp.WorkSheets[sheetname];
end else
begin
Sheet := AXLApp.WorkSheets[1];
end;
Sheet.select;
if AXLApp.ActiveSheet.FilterMode then
begin
AXLApp.ActiveSheet.ShowAllData;
end;
// 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]; //--ABSTURZ--!!
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;
An der markierten Stelle, also bei
Range := Sheet.Range[R1, R2]; //--ABSTURZ--!!
stürzt das Programm ab.
Die Werte in R1 und R2 sind korrekt ermittelt worden und in weder in Excel noch sonst irgendwie erhalte ich eine Fehlermeldung.
Ich lande in Lazarus nur im Assembler:
0000000077C7F2D0 895c2420 mov %ebx,0x20(%rsp)
und muss sowohl das Programm als auch Excel dann "killen". Was macht Lazarus hier wieder anders?