Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem beim Verwenden von Excel (https://www.delphipraxis.net/172100-problem-beim-verwenden-von-excel.html)

diavy 12. Dez 2012 17:34

Problem beim Verwenden von Excel
 
Hallo zusammen.

Ich bin gerade dabei ein Programm zu schreiben, das automatisch Resultate eines Sport-Turniers an meiner Schule in eine Excel-Tabelle einträgt.

Da das Programm bereits ziemlich lang ist, poste ich nur den Teil, in dem vermutlich der Fehler liegen sollte:


Delphi-Quellcode:
var
  Form1: TForm1;
  excel: variant;
  index7,index6:array[1..7] of integer;
  index5:array[1..6] of integer;
  index:integer;


procedure TForm1.FormCreate(Sender: TObject);
begin
initiateindexes;
excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open('G:\....xlsx');
fillcombo1;
end;

procedure TForm1.ComboBox3Change(Sender: TObject);
var i,j:integer;
begin
ComboBox4.Clear;
j:=StrToInt(copy(ComboBox3.Items[ComboBox3.ItemIndex],2,1)); //Bestimmung der Klasse inngerhalb eines Jahrganges, dient zur Orientierung in der Mappe              
case StrToInt(copy(ComboBox3.Items[ComboBox3.ItemIndex],1,1)) of //Unterscheidet die Jahrgänge
        7: begin
                i:=0;
                Excel.ActiveWorkbook.Sheets['7eme'].Select;
                index:=index7[j];
                while Excel.Cells[(index+i),2].Value <> '' do
                        begin
                        ComboBox4.Items.Add(Excel.Cells[(index+i),2].Value+' '+Excel.Cells[(index+i),3].Value);//die beiden Zellen-Werte sind Name und Vorname alle Mitschüler einer Klasse
                        inc(i);
                        end;
                end;
6:...
5:...
end;
Nachdem ich ein Objekt in der ComboBox3 ausgewählt habe, bekomme ich die Fehlermeldung:
'exception class EVariantError with message: 'Invalid variant type conversion'

Wenn ich dann wieder F9 drücke, kann ich das Programm weiterbenutzen, und in der ComboBox4 befinden sich die korrekten Objekte. Falls ich dann aber wieder was in der ComboBox3 ändere, geht der Spaß wieder von vorne los.

Ich habe auch schon versucht das '.Value' wegzulassen, da ich auch mehrmals den Befehl Excel.Cells[..,..] im Internet ohne das .Value gesehen habe, dies hat jedoch nichts erbracht.

Es wäre sehr nett wenn mir jemand helfen könnte, da ich noch viel zu tun habe, wenig erfahren bin, und unter zeitdruck stehe.

Jumpy 12. Dez 2012 22:27

AW: Problem beim Verwenden von Excel
 
Statt ComboBox3.Items[ComboBox3.ItemIndex] könnte man auch einfach ComboBox3.text nehmen. Ist aber nicht der Fehler, denke ich.
Ob mit oder ohne .Value sollte normalerweise egal sein, da das auch die Standard Eigenschaft einer Zelle ist.

Ich würde mir mal einen Haltepunkt in die Funktion setzen und sehen, an welcher Codezeile genau der Fehler kommt.

hoika 13. Dez 2012 05:19

AW: Problem beim Verwenden von Excel
 
Hallo,

benutze lieber Range statt Cells.
Hier noch ein Link:
http://www.delphipraxis.net/37480-ex...rnsteuern.html

Heiko

diavy 13. Dez 2012 17:17

AW: Problem beim Verwenden von Excel
 
Wie gesagt, ich hab es auch schon mit und ohne .Value versucht und weder noch hat mir zum Erfolg verholfen.

Ich war bestimmt schon 2 Stunden damit beschäftigt Teile in {} zu setzen oder SendMessage(' ') an mehreren Stellen einzubauen, komischerweiser bekomme ich jedoch immer eine Fehlermeldung.

Danke für den Tip mit Range, aber da ich nun schon recht viel geschrieben habe, ändere ich dies nun nicht mehr, da es sofern ich es richtig verstehe "nur" zur Esthetik beiträgt. Ich verhalt's mir für's nächste Mal.

Hat sonst wer eine Idee woran es liegen könnte?

RWarnecke 13. Dez 2012 17:33

AW: Problem beim Verwenden von Excel
 
Zitat:

Zitat von Jumpy (Beitrag 1195301)
Ich würde mir mal einen Haltepunkt in die Funktion setzen und sehen, an welcher Codezeile genau der Fehler kommt.

Hast Du den Vorschlag von Jumpy schon gemacht und den Haltepunkt in der Funktion ComboBox3Change in die erste Zeile gesetzt ? Dann kannst Du mit F7 oder F8 jede Zeile der Funktion nacheinander durchgehen. Dabei ermittelst Du dann auch die Zeile, in welcher der Fehler auftritt.

diavy 13. Dez 2012 19:34

AW: Problem beim Verwenden von Excel
 
Ich dachte er hätte mit seinem Vorschlag eine ähnliche Methode wie die von mir aufgezählten gemeint (zB an bestimmten Stellen SendMessage('') einbauen). Was eine Haltestelle ist, ist mir unbekannt.

Jedoch habe ich wie von dir erwähnt mich mit F7 durchgeklickt, und die Fehlermeldung kam, nach mehrfachem Durchgehen bei:
Delphi-Quellcode:
 while Excel.Cells[(index+i),2].Value <> '' do
Kann es sein, dass die Schleife klappt, wenn die Zelle einen Inhalt hat, jedoch nicht klappt wenn sie keinen Inhalt hat? Dies scheint mir nämlich bezüglich des Ergebnises der Fehlersuche mit F7 am sinnvollsten. Wenn ja, wie kann ich dieses Problem umgehen?

Chemiker 13. Dez 2012 19:35

AW: Problem beim Verwenden von Excel
 
Hallo diavy,

Delphi-Quellcode:
Excel.Cells[(index+i),2].Value
es ist zu beachten, dass die Excel-Cells –Index bei 1 anfängt. Ist sichergestellt das (index+i) min. 1 ist?

Bis bald Chemiker

diavy 13. Dez 2012 19:42

AW: Problem beim Verwenden von Excel
 
Hallo!

Ja, der geringstmöglichste index-Wert beträgt 6.

Edit: Ich glaube http://www.delphipraxis.net/140578-l...cel-zelle.html hier hatte wer ein ähnliches/das selbe Problem. Wenn ich die erwähnten Zeichen (‘’) anstatt von '' in die while-Schleife einfüge, gibt mir Delphi die Fehlermeldung (bereits vor dem Starten des Programmes) : "Illegal character in input file". Was hat es damit auf sich?

GHorn 14. Dez 2012 08:42

AW: Problem beim Verwenden von Excel
 
Versuch mal das:

Delphi-Quellcode:
while (NOT Empty(Excel.Cells[(index+i),2])) do
  begin
    ...
  end;

function Empty(const s: String): Boolean;
// Überprüfen, ob ein String leer ist:
begin
  // Siehe hier:
  // http://www.delphipraxis.net/169312-wie-string-auf-leer-pruefen.html#post1174321
  Result := Trim(s) = '';
end;

nahpets 14. Dez 2012 12:24

AW: Problem beim Verwenden von Excel
 
Hallo,

Zitat:

Zitat von diavy (Beitrag 1195394)
Delphi-Quellcode:
 while Excel.Cells[(index+i),2].Value <> '' do

Das '' ist kein Variant. Versuche es bitte einmal mit
Delphi-Quellcode:
 while Excel.Cells[(index+i),2].Value <> EmptyParam do
EmptyParam ist ein "leerer" Variant, gfls. musst du noch die Unit Variants in die Uses-Klausel aufnehmen.

diavy 14. Dez 2012 12:46

AW: Problem beim Verwenden von Excel
 
@ GHorn: Der Link behandelt doch nur Strings, und es scheint mir als ob gerade die Abwesenheit eines Strings mein Problem wäre. Oder irre ich?

@ nahpets: Mit EmptyParam anstelle von '' bekomme ich ebenfalls die Fehlermeldung 'Invalid variant operation', und zusàtzlich funktionniert die Prozedur nicht nach einem weiteren Exekutieren, anders als mit ''.

Ich habe auch versucht mit hilfe von copy(Excel.Cells...,1,1) aus dem Variant-Problem einen String zu machen, das funktionniert ebenfalls nicht.

Ich bin echt am Verzweifeln.

Blup 14. Dez 2012 13:37

AW: Problem beim Verwenden von Excel
 
Dein Programm bekommt Daten immer als Typ OLE-Variant.
Die meisten Datentypen lassen sich automatisch zu einem String konvertieren, manche aber auch nicht.
Insbesondere für Zellen ohne Inhalt wird kein leerer String sondern "Unassigned" zurückgegeben.
Da wird auch mit Copy kein String draus, Copy verlangt als Parameter bereits einen String.

Versuchs doch mal in der Art:
Delphi-Quellcode:
var
  vName, vVorname: Variant;
  sNameVorname: string;
begin
{...}
  i := index7[j];
  while True do
  begin
    Inc(i);
    vName   := Excel.Cells[i, 2].Value;
    vVorname := Excel.Cells[i, 3].Value;
    if VarIsEmpty(vName) or (vName = '') then
      Break;

    if VarIsEmpty(vVorname) or (vVorname = '') then
      sNameVorname := vName
    else
      sNameVorname := vName + ' ' + vVorname;

    ComboBox4.Items.Add(sNameVorname);
  end;
  Dec(i);
{...}
end;

diavy 14. Dez 2012 14:44

AW: Problem beim Verwenden von Excel
 
Erstmal Danke für deine Mühe!

Nun frage ich mich doch gleich ob es selbstverständliche wäre, dass ich verstehen würde was in der Funktion "VarIsEmpty" zu stehen hat, oder ist das eine Funktion in der Unit?

Wenn sie in der Unit ist, was genau tut sie dann? Bei delphibasics habe ich nämlich nichts dazu gefunden.

Und wieso
Delphi-Quellcode:
VarIsEmpty(vName) or (vName = '')
? - wäre es nicht die Aufgabe der ersten Bedingung, die zweite überflüssig zu machen?

Bernhard Geyer 14. Dez 2012 14:48

AW: Problem beim Verwenden von Excel
 
Zitat:

Zitat von diavy (Beitrag 1195492)
Nun frage ich mich doch gleich ob es selbstverständliche wäre, dass ich verstehen würde was in der Funktion "VarIsEmpty" zu stehen hat, oder ist das eine Funktion in der Unit?

Wenn sie in der Unit ist, was genau tut sie dann? Bei delphibasics habe ich nämlich nichts dazu gefunden.

Die Hilfe-Referenz von DelphiBasic wird halt nicht so vollständig sein wie die der Delphi-Hilfe

Zitat:

Zitat von diavy (Beitrag 1195492)
Und wieso
Delphi-Quellcode:
VarIsEmpty(vName) or (vName = '')
? - wäre es nicht die Aufgabe der ersten Bedingung, die zweite überflüssig zu machen?

Ein leeres Variant ist nicht gleichbedeutent mit einem leeren String.
Das erst beudeutet: "Du hast gar nix"
das zweite: Du hast zwar einen String in deinem Variant, dieser ist aber leer.

ist wie bei einem DBMS der unterschied zwischen nil/null und ''

diavy 14. Dez 2012 14:55

AW: Problem beim Verwenden von Excel
 
Danke für den Link!

Ich verfüge leider nicht über die Delphi-Hilfe, da ich eine sehr alte Delphi-Version besitze und deren Hilfe nur bis Win XP geladen/benutzt werden kann. Und bisher war ich ganz zufrieden mit dem delphibasics-Angebot.

Alles klar, verstehe.


Sobald ich zu Hause bin, werde ich es dann mit VarIsEmpty(vName) versuchen!

Bernhard Geyer 14. Dez 2012 15:00

AW: Problem beim Verwenden von Excel
 
Zitat:

Zitat von diavy (Beitrag 1195497)
Ich verfüge leider nicht über die Delphi-Hilfe, da ich eine sehr alte Delphi-Version besitze und deren Hilfe nur bis Win XP geladen/benutzt werden kann.

Für Vista/Win7/Win8 gibts bei MS ein Update das das alte HLP-Format wieder aktiviert. Einzig bei Server 2012 ist mit HLP entgültig schlüss.

Zitat:

Zitat von diavy (Beitrag 1195497)
Und bisher war ich ganz zufrieden mit dem delphibasics-Angebot.

Ab D2010 ist Hilfe im Web für alle Verfügbar:

http://docwiki.embarcadero.com/RADSt...0/de/Main_Page
http://docwiki.embarcadero.com/RADSt...E/de/Main_Page
http://docwiki.embarcadero.com/RADSt...2/de/Main_Page
http://docwiki.embarcadero.com/RADSt...3/de/Main_Page

diavy 14. Dez 2012 20:01

AW: Problem beim Verwenden von Excel
 
Ein Mal habe ich es mit:
Delphi-Quellcode:
7: begin
                i:=0;
                Excel.ActiveWorkbook.Sheets['7eme'].Select;
                index:=index7[j];
                while (NOT VarIsEmpty(Excel.Cells[(index+i),2].Value)) and (Excel.Cells[(index+i),2].Value<>'') do
                        begin
                        ComboBox4.Items.Add(Excel.Cells[(index+i),2].Value+' '+Excel.Cells[(index+i),3].Value);
                        inc(i);
                        end;
                end;
versucht, und ein Mal mit:
Delphi-Quellcode:
7: begin
                i:=0;
                Excel.ActiveWorkbook.Sheets['7eme'].Select;
                index:=index7[j];
                while NOT VarIsEmpty(Excel.Cells[(index+i),2].Value) do
                        begin
                        ComboBox4.Items.Add(Excel.Cells[(index+i),2].Value+' '+Excel.Cells[(index+i),3].Value);
                        inc(i);
                        end;
                end;
Beide Male habe ich die übliche Fehlermeldung bekommen.
Was nun wiederum neu war, ist, dass nach der Fehlermeldung folgende Zeile blau gefärbt wurde:

Delphi-Quellcode:
ComboBox4.Items.Add(Excel.Cells[(index+i),2].Value+' '+Excel.Cells[(index+i),3].Value);
Nichtsdestotrotz wurden die richtigen Items in die ComboBox eingefügt...

Was ist hier los?

p80286 14. Dez 2012 21:19

AW: Problem beim Verwenden von Excel
 
Wenn du es mit
Delphi-Quellcode:
type
  dummy1,
  dummy2 : string;

....

 while NOT(VarIsEmpty(Excel.Cells[(index+i),2].Value)) do
 begin
   dummy1:='';
   dummy2:='';
   dummy1:=Excel.Cells[(index+i),2].Value;
   dummy2:=Excel.Cells[(index+i),3].Value;
   ComboBox4.Items.Add(dummy1+' '+dummy2);
   inc(i);
 end;
versuchst, was ändert sich?

Gruß
K-H

diavy 14. Dez 2012 21:24

AW: Problem beim Verwenden von Excel
 
ES GEHT!

Ich kann es nicht glauben, wie kann das sein? Das kommt doch eigentlich genau auf das raus, was ich mit copy versucht hatte?

Du kannst dir nicht vorstellen wie dankbar ich dir bin! :)

diavy 15. Dez 2012 15:16

AW: Problem beim Verwenden von Excel
 
Ich habe nun ein weiteres Problem.

Und zwar wollte ich zum Sortieren von Resultaten quicksort benutzen.

Diebezüglich mein Code:

Delphi-Quellcode:
procedure switch(var a,b:integer);
var aux:integer;
begin
aux:=a;
a:=b;
b:=aux;
end;

function seperate(var a:array of integer;l,r:integer):integer;
var i,j,pivot:integer;
begin
pivot:=a[r];
i:=l; j:=r-1;
while i<=j do
        if a[i]<pivot then inc(i)
        else if a[j]>pivot then j:=j-1
        else   begin
                switch(a[i],a[j]);
                inc(i);
                j:=j-1;
                end;
switch(a[i],a[r]);
result:=i;
end;

procedure quicksort(var a:array of integer;l,r:integer);
var i:integer;
begin
if l<r then begin
        i:=seperate(a,l,r);
        quicksort(a,l,i-1);
        quicksort(a,i+1,r);
        end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var test:array[1..20] of integer;I:integer;
begin
test[1]:=21;test[2]:=7;test[3]:=12;test[4]:=99;test[5]:=72;test[6]:=3;test[7]:=50;test[8]:=59;test[9]:=17;test[10]:=190;
test[11]:=8;test[12]:=19;test[13]:=44;test[14]:=87;test[15]:=6;test[16]:=0;test[17]:=55;test[18]:=59;test[19]:=16;test[20]:=29;
quicksort(test,1,20);
for i:=20 downto 1 do
ShowMessage(IntToStr(test[i]));
end;
Dies klappt soweit auch, bis auf die Stelle 1 im Array, die bleibt nämlich unverändert. Mit den Beispielwerten die ich zum Test eingefügt habe, wird so mit der for downto Schleife als letzte MessageBox 21 angezeigt.

Ich bin den Code mehrmals durchgegangen und kann den Fehler nicht finden...

diavy 16. Dez 2012 16:20

AW: Problem beim Verwenden von Excel
 
UP's sind wohl nicht gern gesehen, jedoch muss mein Quicksort morgen früh laufen, und es klappt nie für den ersten Wert. :/

hoika 16. Dez 2012 16:56

AW: Problem beim Verwenden von Excel
 
Hallo,

dann Bau doch nen Bubblesort zusammen.


Heiko

Blup 17. Dez 2012 08:00

AW: Problem beim Verwenden von Excel
 
Dein "quicksort" arbeitet mit einem Array variabler Größe, das erste Element hat den Index 0.
Übergeben wird ein Array das die Elemente von 1 bis 20 adressiert.

Paramter für den Bereich sollten 0 und 19 sein.
Am besten du änderst auch die Definition des statischen Arrays entsprechend.


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