AGB  ·  Datenschutz  ·  Impressum  







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

Excel Automation - merkwürdiger Fehler

Ein Thema von nezumi77 · begonnen am 8. Aug 2009 · letzter Beitrag vom 8. Aug 2009
Antwort Antwort
nezumi77

Registriert seit: 24. Mär 2009
16 Beiträge
 
#1

Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 04:20
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 07:08
Wechsle mal den Typ von ObjNr auf WideString oder OleVariant
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 07:30
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
Heiko
  Mit Zitat antworten Zitat
nezumi77

Registriert seit: 24. Mär 2009
16 Beiträge
 
#4

Re: Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 07:47
Hallo,

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

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 )
  Mit Zitat antworten Zitat
nezumi77

Registriert seit: 24. Mär 2009
16 Beiträge
 
#5

Re: Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 07:53
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)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 08:04
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
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Excel Automation - merkwürdiger Fehler

  Alt 8. Aug 2009, 13:15
Zitat von nezumi77:
Wo im Code der Fehler auftritt weiß ich nicht, da nichts angezeigt wird.
(Immerhin klappt das Abschießen von Excel )
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...
Ralf Kaiser
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:16 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