Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Excel mit mehreren Sheets öffnen (https://www.delphipraxis.net/195901-excel-mit-mehreren-sheets-oeffnen.html)

Jumpy 7. Sep 2018 09:17

AW: Excel mit mehreren Sheets öffnen
 
Sheet.UsedRange.Columns.AutoFilter

sollte den Autofilter abwechslnd ein und ausschalten.

Moombas 7. Sep 2018 15:55

AW: Excel mit mehreren Sheets öffnen
 
Danke Ralph hierfür, allerdings ist ein umschalten (ein/aus) der Autofilter denke ich nicht so gut. Da der Filter sonst gesetzt wird, wo vorher keiner war und das möchte ich eigentlich auch so beibehalten. Daher wollte ich ihn einfach "löschen", was laut Excelmakro ".ShowAllData" ist. Jedoch keine Ahnung wo ich das einsetzen muss, wenn "sheet.ShowAllData"nicht funktioniert.

HolgerX 7. Sep 2018 16:48

AW: Excel mit mehreren Sheets öffnen
 
Hmm..

Um zu Prüfen, ob ein Filter aktiviert wurde:
Delphi-Quellcode:
if Excel.ActiveSheet.FilterMode then


und um das Filtern auf einem Sheet auszuschalten:
Delphi-Quellcode:
Excel.ActiveSheet.AutoFilterMode := False;

Moombas 10. Sep 2018 08:53

AW: Excel mit mehreren Sheets öffnen
 
Das ist zu 95% so, wie ich es gesucht habe^^ Zwar ist der Filter dann komplett weg (und nicht nur die Filterbedingungen raus) aber das ist nicht schlimm und umgeht damit das "Speicherproblem".

Edit: Mit "if AXLApp.ActiveSheet.FilterMode then AXLApp.ActiveSheet.ShowAllData;" geht es wie gewollt :D Danke für den Tipp HolgerX

Beim Laden der Datei sieht es dann so aus:
Delphi-Quellcode:
function XLS_To_StringGrid(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : string):Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  Sheet: OLEVariant;
  RangeMatrix: Variant;
  X, Y, K, R: Integer;
begin
  Result := False;
  try
    try
      if (Sheetname <> '') and HaveSheet(AXLApp, Sheetname) then begin
        Sheet := AXLApp.WorkSheets[Sheetname];
      end else
        Sheet := AXLApp.WorkSheets[1];

      // In order to know the dimension of the WorkSheet, i.e the number of rows
      // and the number of columns, we activate the last non-empty cell of it
      Sheet.select;
      if AXLApp.ActiveSheet.FilterMode then AXLApp.ActiveSheet.ShowAllData; //Fix: Fehler durch gesetzte Filter vermeiden
      Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

      X := AXLApp.ActiveCell.Row; // Get the value of the last row
      Y := AXLApp.ActiveCell.Column; // Get the value of the last column

      // Set Stringgrid's row &col dimensions.
      AGrid.RowCount := X; // Excel-Row 1 = Header
      AGrid.ColCount := Y;

      RangeMatrix := Sheet.Range['A1', Sheet.Cells.Item[X, Y]].Value; // Assign the Variant associated with the WorkSheet to the Delphi Variant
      // Define the loop for filling in the TStringGrid
      K := 0;
      While (K < X) do begin
        Inc(K);
        for r := 1 to y do
          AGrid.Cells[(R - 1), (K - 1)] := RangeMatrix[K, R];
      end;
      Result := True;
    except
      // Logging...
    end;
  finally
    RangeMatrix := Unassigned;
    Sheet := Unassigned;
  end;
end;
Und beim Speichern so:
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;
      if AXLApp.ActiveSheet.FilterMode then AXLApp.ActiveSheet.ShowAllData; //Fix: Fehler durch gesetzte Filter vermeiden
      // 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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.
Seite 2 von 2     12   

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