Einzelnen Beitrag anzeigen

Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#23

AW: Excel Stringgrid in (vorhandene) Excel abspeichern

  Alt 19. Apr 2018, 10:11
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;

Geändert von Moombas (19. Apr 2018 um 10:28 Uhr)
  Mit Zitat antworten Zitat