AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel mit mehreren Sheets öffnen

Ein Thema von Moombas · begonnen am 5. Apr 2018 · letzter Beitrag vom 10. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Moombas
Moombas

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

Excel mit mehreren Sheets öffnen

  Alt 5. Apr 2018, 12:28
Moin ich habe folgendes Problem:

Ich habe eine xls Datei mit mehreren Sheets und möchte sie in Stringgrid einlesen. Mit dem ersten Sheet funktioniert es auch aber ab dem 2. kommt immer eine Fehlermeldung.

"Die Activate Methode des Range Objektes konnte nicht ausgeführt werden"

Jemand eine Idee wo mein Denkfehler ist?

Code:
function TTools.Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string; Sheetname : string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application'); // Create Excel-OLE Object
  try
    XLApp.Visible := True;                       // Excel
    XLApp.Workbooks.Open(AXLSFile);              // Open the Workbook

    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname]; // Sheet := XLApp.Workbooks[1].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.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    x := XLApp.ActiveCell.Row;                  // Get the value of the last row
    y := XLApp.ActiveCell.Column;               // Get the value of the last column

    // Set Stringgrid's row &col dimensions.
    AGrid.RowCount := x;
    AGrid.ColCount := y;

    RangeMatrix := XLApp.Range['A1', XLApp.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 := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;

  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;


procedure TTools.EinlesenFClick(Sender: TObject);
begin
  Xls_To_StringGrid(DE_XLS, ExcelE.Text, 'DE');
  Xls_To_StringGrid(CH_XLS, ExcelE.Text, 'CH');
end;
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Excel mit mehreren Sheets öffnen

  Alt 5. Apr 2018, 12:53
unsicher:
War es nicht so, dass Excel zwischen technischen (intern) und sichtbaren Sheetnames unterscheidet?
Die beiden Attribute können identischen Inhalt haben oder sich unterscheiden (bei kopierten Sheets z.B.). Einfach mal ein workbook öffnen und alles sheetnamen ausgeben lassen bzw. Doku nachschlagen, wie das mit der Sheetbenennung/Zugriff ist.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

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

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 08:35
also wenn ich XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname].name mir als showmessage ausgeben lasse passt es, das er das sheet findet. Er hat auch immer nur dann ein Problem, wenn ich nicht mit Sheet 1 arbeiten möchte (die Sheets sind vom Aufbau identisch).

und er hat eindeutig mit "Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;" ein Problem, wenn ich das auskommentiere läufts durch, nur bekomme ich natürlich nicht das Ergebnis was ich brauche.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 08:53
Vermutlich geht es nicht, weil es sich nicht um das aktive Sheet handelt.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

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

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 09:07
Das habe ich auch schon probiert, dann bekomme ich die Fehlermeldung:

"Variante des Typs (Error) konnte nicht in Typ (OleStr) konvertiert werden."

Und das auch nur wenn ich "Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;" mit drin habe.

...

Edit: Es lag an der Exceldatei, kleine Korrekturen haben den Fehler behoben. -.-

Geändert von Moombas ( 6. Apr 2018 um 09:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 09:42
Das habe ich auch schon probiert
Was hast du probiert?
Ich meine, dass du vorher noch das hier ausführen musst:
Sheet.Select;
Peter
  Mit Zitat antworten Zitat
Benutzerbild von tshubaka
tshubaka

Registriert seit: 11. Sep 2009
Ort: Neckertal
35 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 09:49
Hallo Moombas
hier
Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname];

muss das nicht so lauten?
XLApp.workbooks.open(ExtractFileName(AXLSFile));

Sheet := XLApp.WorkSheets[sheetname].Select;

Gruss
Peter
Peter
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#8

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 10:01
Hmm..

Das habe ich auch schon probiert, dann bekomme ich die Fehlermeldung:

"Variante des Typs (Error) konnte nicht in Typ (OleStr) konvertiert werden."

Und das auch nur wenn ich "Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;" mit drin habe.

Du müsstest zunächst das Sheet selber auf 'active' setzen, nicht nur die 'Cells.SpecialCells'.

'Sheet.Activate;'
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

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

AW: Excel mit mehreren Sheets öffnen

  Alt 6. Apr 2018, 10:09
Es lag an der Exceldatei, kleine Korrekturen haben den Fehler behoben.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

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

AW: Excel mit mehreren Sheets öffnen

  Alt 7. Sep 2018, 09:04
Moin zusammen,

ich bin es nochmal und habe einen kleinen Nachtrag/Nachfrage, die am besten hierzu passt.
Der Fehler der Exceltabelle beim Einlesen lag immer dann vor, wenn ein Filter gesetzt war und dieser bestimmte Zeilen raus gefiltert hat (ich war davon ausgegangen, das der Filter nur eine optische Geschichte ist und im Hintergrund die Tabelle ja noch alle Daten hat).

Weiß jemand wie ich den Filter über Delphi entferne? Das was in den Excel-Makros drin steht, hat leider nicht geholfen, denn wenn ich "Sheet.ShowAllData;" aktiviere kann mein Programm die Exceldatei nicht mehr einlesen (keine Fehlermeldung, das Stringgrid bleibt einfach leer). Ich würde damit gerne diese Fehlerquelle ausschließen.

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;
// Sheet.ShowAllData;
      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;

Geändert von Moombas ( 7. Sep 2018 um 09:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz