Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Excel Automation - merkwürdiger Fehler (https://www.delphipraxis.net/138353-excel-automation-merkwuerdiger-fehler.html)

nezumi77 8. Aug 2009 04:20


Excel Automation - merkwürdiger Fehler
 
Guten Morgen,

ich will Daten in eine (bereits geöffnete) Excel-Tabelle eingeben. Dazu soll mein Programm zunächst mal die Zeile der Tabelle finden, in der sich eine bestimmte Objektnummer befindet, die ich in Edit1 eingebe (übergebe ich an die String-Variable "ObjNr").

Mein Prog liefert mir die Fehlermeldung:
...raised exception class EVariantError with message "Invalid variant type conversion"...

Das komische ist: Nach dieser Fehlermeldung funzt Excel nicht mehr, wenn ich eine beliebige ".xls" Datei anklicke. Selbst wenn mein Prog bzw. Delphi geschlossen ist. Es geht erst wieder nach Neustart.

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Excel2000, OleServer, StdCtrls, ComCtrls, Clipbrd;

...
type

...
    ExcelQueryTable1: TExcelQueryTable;
    ExcelApplication1: TExcelApplication;
    ExcelChart1: TExcelChart;
    ExcelWorksheet1: TExcelWorksheet;
    ExcelWorkbook1: TExcelWorkbook;
    ExcelOLEObject1: TExcelOLEObject;

...

procedure TForm1.Button1Click(Sender: TObject);
var
vArray, WS : OleVariant;
aRange : Range;
i, lc: Integer;
ObjNr, adr, temp: String;
begin
ExcelApplication1.Connect;
ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);
ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveSheet as _Worksheet);
WS := ExcelApplication1.ActiveSheet as _Worksheet;

If Edit1.Text <> '' then begin
ObjNr := Edit1.Text;
zeile := 1;
spalte := 2;
repeat
inc(zeile);
until
(WS.Cells.Item[zeile,spalte].Value = ObjNr) or (WS.Cells.Item[zeile,spalte].Value = 'xx');
If (WS.Cells.Item[zeile,spalte].Value = ObjNr) then Edit2.Text := WS.Cells.Item[zeile,4].Value +' '+WS.Cells.Item[zeile,5].Value;
end else begin
If Edit2.Text <> '' then begin
adr := Edit2.Text;
//zeile := 1;
spalte := 4;
repeat
inc(zeile);
until
(Pos(adr,WS.Cells.Item[zeile,spalte].Value) > 0) or (WS.Cells.Item[zeile,spalte].Value = 'xx');
If (Pos(adr,WS.Cells.Item[zeile,spalte].Value) > 0) then begin
Edit2.Text := WS.Cells.Item[zeile,4].Value +' '+WS.Cells.Item[zeile,5].Value;
Edit1.Text := WS.Cells.Item[zeile,2].Value;
end;
end;
end;
Label1.Caption := WS.Cells.Item[zeile,20].Value;

ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;

end;
Was mache ich falsch?
Gibt es einen Befehl, mit dem man bei derartigen Fehlern Excel wieder zum laufen bringt, ohne den Rechner neu starten zu müssen?

Gruß, Stephan.

mkinzler 8. Aug 2009 07:08

Re: Excel Automation - merkwürdiger Fehler
 
Wechsle mal den Typ von ObjNr auf WideString oder OleVariant

hoika 8. Aug 2009 07:30

Re: Excel Automation - merkwürdiger Fehler
 
Hallo,

wo genau kommt denn der Fehler ?

Zu der Neustart-Sachen.

- Task-Manager
- auf Reiter Prozesse
- nach Excel.Exe suchen und abschiessen
bei mehreren alle Excel.Exe abschiessen
- danach kannst du dein "normales" Excel wieder aufmachen



Ausserdem wäre es schön, wenn du den Quelltext mal anständig formatierst,
man bekommt ja Augenkrebs ;)

Vorschlag
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  vArray : OleVariant;
  WS    : OleVariant;
  aRange : Range;
  i     : Integer;
  lc    : Integer;
  ObjNr : String;
  adr   : String;
  temp  : String;
begin
  ExcelApplication1.Connect;
  ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);
  ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveSheet as _Worksheet);
  WS := ExcelApplication1.ActiveSheet as _Worksheet;

  If Edit1.Text <> '' then
  begin
    ObjNr := Edit1.Text;
    zeile := 1;
    spalte := 2;

    repeat
      inc(zeile);
    until (WS.Cells.Item[zeile,spalte].Value = ObjNr) or
          (WS.Cells.Item[zeile,spalte].Value = 'xx');

    If (WS.Cells.Item[zeile,spalte].Value = ObjNr) then
    begin
      Edit2.Text := WS.Cells.Item[zeile,4].Value +' '
                    +WS.Cells.Item[zeile,5].Value;
    end
    end
    else
    begin
      If Edit2.Text <> '' then
      begin
        adr := Edit2.Text;
       //zeile := 1;
        spalte := 4;

        repeat
          inc(zeile);
        until (Pos(adr,WS.Cells.Item[zeile,spalte].Value) > 0) or
              (WS.Cells.Item[zeile,spalte].Value = 'xx');

        If (Pos(adr,WS.Cells.Item[zeile,spalte].Value) > 0) then
        begin
          Edit2.Text := WS.Cells.Item[zeile,4].Value +' '
                        +WS.Cells.Item[zeile,5].Value;
          Edit1.Text := WS.Cells.Item[zeile,2].Value;
        end;
      end;
    end;
    Label1.Caption := WS.Cells.Item[zeile,20].Value;

    ExcelWorksheet1.Disconnect;
    ExcelWorkbook1.Disconnect;
    ExcelApplication1.Disconnect;
  end;
Heiko

nezumi77 8. Aug 2009 07:47

Re: Excel Automation - merkwürdiger Fehler
 
Hallo,

ObjNr als OleVariant und WideString habe ich versucht, ohne Erfolg... :cry:

hoika, die Meldung kommt nicht beim compilieren, sondern erst wenn ich den Knopp drücke. Wo im Code der Fehler auftritt weiß ich nicht, da nichts angezeigt wird.
(Immerhin klappt das Abschießen von Excel :wink: )

nezumi77 8. Aug 2009 07:53

Re: Excel Automation - merkwürdiger Fehler
 
Habe jetzt noch ein bisschen rumprobiert.

Komischerweise funktioniert das:

Delphi-Quellcode:
var
temp, ObjNr: String;

(...)

repeat
      inc(zeile);
      temp := WS.Cells.Item[zeile,spalte].Value;
    until (temp = ObjNr)
das aber nicht:

Delphi-Quellcode:
var
ObjNr: String;

(...)

repeat
      inc(zeile);
    until (WS.Cells.Item[zeile,spalte].Value = ObjNr)

mkinzler 8. Aug 2009 08:04

Re: Excel Automation - merkwürdiger Fehler
 
Bei der Zweisung von String zu WideString und umgekehrt wird der Typ konvertiert. Beim direkten Vergleich anscheinend nicht, deshalb würde ich für die lokalen Variablen auch Ole-Typen verwenden

Ralf Kaiser 8. Aug 2009 13:15

Re: Excel Automation - merkwürdiger Fehler
 
Zitat:

Zitat von nezumi77
Wo im Code der Fehler auftritt weiß ich nicht, da nichts angezeigt wird.
(Immerhin klappt das Abschießen von Excel :wink: )

Na ja, du kannst aber doch an den Anfang der Methode einen Breakpoint setzen und diese Methode dann im Debugger durchsteppen. Dann solltest du eigentlich, auch ohne Anzeige einer Meldung, sehen wo der Fehler auftritt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 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