![]() |
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:
Was mache ich falsch?
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; 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. |
Re: Excel Automation - merkwürdiger Fehler
Wechsle mal den Typ von ObjNr auf WideString oder OleVariant
|
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:
Heiko
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; |
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: ) |
Re: Excel Automation - merkwürdiger Fehler
Habe jetzt noch ein bisschen rumprobiert.
Komischerweise funktioniert das:
Delphi-Quellcode:
das aber nicht:
var
temp, ObjNr: String; (...) repeat inc(zeile); temp := WS.Cells.Item[zeile,spalte].Value; until (temp = ObjNr)
Delphi-Quellcode:
var
ObjNr: String; (...) repeat inc(zeile); until (WS.Cells.Item[zeile,spalte].Value = ObjNr) |
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
|
Re: Excel Automation - merkwürdiger Fehler
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
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