Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Excel - Vergleich führt zu Ungültiger Varianten Operation


Stecky2000 - Do 03.02.11 12:02
Titel: Excel - Vergleich führt zu Ungültiger Varianten Operation
Hallo,

ich hab mal wieder ein Problem und komme mit den durch die Suchfunktion gefundenen Dingen nicht klar, da sie auf mein Problem nicht ganz passen.

Ich habe folgenden Code

Delphi-Quelltext
1:
If (Excel.Cells[StrToInt(V_Ini_Excel_9ProzentX), StrToInt(V_Ini_Excel_9ProzentY)] = 'X'then                    


und genau da löst er die EVariantInvalidOpError aus.

Ich habe schon abgewandelt in


Delphi-Quelltext
1:
If (Excel.Cells[StrToInt('27'), StrToInt('19')] = 'X'then                    


und


Delphi-Quelltext
1:
If (Excel.Cells[2719] = 'X'then                    



Excel hab ich übrigens auf zwei verschiedene Arten deklariert:

mal so: Excel: OLEVariant;
und auch mal so: Excel: Variant;

Immer der gleiche Effekt.


Also insgesamt (gekürzt) so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
Excel: Variant; //OLEVariant;


begin

...        

        try
          excel := CreateOleObject('Excel.Application');
          excel.visible := False;   
        except
          ShowMessage('Excel konnte nicht gestartet werden !');
        end;

        Excel.DisplayAlerts:=False;
        Excel.Workbooks.Open(OpenDialog1.Filename);  

        If (Excel.Cells[StrToInt(V_Ini_Excel_9ProzentX), StrToInt(V_Ini_Excel_9ProzentY)] = 'X'or 
           (Excel.Cells[StrToInt(V_Ini_Excel_9ProzentX), StrToInt  (V_Ini_Excel_9ProzentY)] = 'x'then
           RadioGroup6.ItemIndex := 4;

...


Die Variablen V_Ini_Excel_9ProzentX und V_Ini_Excel_9ProzentY sind übrigens String.

aber immer der gleiche Effekt.

Ich glaube nicht, dass ich da was am Code geändert hätte und das hat ja sonst immer funktioniert.

Habt Ihr einen Tipp?


bummi - Do 03.02.11 12:11

ich greife immer über Sheets zu ...


Delphi-Quelltext
1:
2:
3:
4:
5:
Function  TMSOLE.Cell(xpos,ypos:integer;sheet:String=''):Variant;
begin
  if Length(Sheet)=0 then Result:=FExcel.Sheets[1].Cells[xpos,ypos]
  else Result:=FExcel.Worksheets[Sheet].Cells[xpos,ypos];
end;


Stecky2000 - Do 03.02.11 12:15

Der Zugriff auf Excel ist ja eigentlich kein Problem, yumal es in der datei die ich ;ffne nur ein Sheet gibt.

Ich habe eine Prozedur mit der ich nach excel schreibe und diese mmit der ich aus Excel lese.

Die schreibende funktioniert noch wie zuvor, die zum Lesen löst beim Vergleich (ist Zellinhalt = X) diesen Fehler aus.


bummi - Do 03.02.11 13:12

so gehts ...

Delphi-Quelltext
1:
Cells[a,b].Text                    


elundril - Do 03.02.11 13:24

Bzw über Cells[x,y].Value geht es auch soweit ich weiß, wenn du direkt zahlen vergleichen willst später mal. Und zwar aus dem grund weil dir Value ein Variant zurückliefert.

lg elundril


Bergmann89 - Do 03.02.11 14:04

Hey,

pack dir den Inhalt der Zelle vorher in ne String-Variable

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  str: String

str := Excel.Cells[StrToInt(V_Ini_Excel_9ProzentX), StrToInt(V_Ini_Excel_9ProzentY)];
If (str = 'X'then {...}


MfG Bergmann


bummi - Do 03.02.11 14:05

@Bergmann89
da bekommst Du nur eine Referenz, keinen String. Value oder Text sind richtig.


Stecky2000 - Fr 25.02.11 08:44

Sorry das ich mich so lange nicht gemeldet habe.

Ich wollte mich nur noch mal für die Tipps bedanken. Ich habe es mit .Text gemacht und es funktioniert.

Unter Delphi 7 ging es auch ohne, in Delphi 2010 braucht es das wohl.


Also, nochmals vielen Dank.