Autor Beitrag
rob87
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Di 29.01.08 09:30 
Hallo,

ich will per OLE Daten an eine Excel-Tabelle übertragen.

Nun hab ich beispielsweise in einer Spalte eine beliebig aufsteigende Zahlenfolge. Und ich will "meinen" neuen Wert unter den letzten Wert setzen und gleichzeitig aber noch prüfen, ob ein höher Wert wie der einzutragende schon vorhanden ist.

Mal vorneweg, ich hab keine Ahnung, wie ich des machen soll.


Moderiert von user profile iconjasocul: Topic aus VCL (Visual Component Library) verschoben am Di 29.01.2008 um 09:35
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Di 29.01.08 21:22 
hmmm, also ich hätte da einen Ansatz mit Umweg. Man könnte die Excel-Tabelle als .csv exportieren. Diese kann man ganz einfach auslesen/bearbeiten.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 07:42 
user profile iconXion hat folgendes geschrieben:
hmmm, also ich hätte da einen Ansatz mit Umweg. Man könnte die Excel-Tabelle als .csv exportieren. Diese kann man ganz einfach auslesen/bearbeiten.


Hmm.. Ein Ansatz ist grundsätzlich nicht schlecht... Weiß sonst noch jemand eine Möglichkeit *ins Forum frag*
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 30.01.08 08:17 
Also ich würde über die Zellen in der betreffenden Spalte loopen und mir die Werte merken. Dann kannst du entscheiden, an welcher Stelle du deinen neuen Wert einträgst.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 08:23 
user profile iconiKilledKenny hat folgendes geschrieben:
Also ich würde über die Zellen in der betreffenden Spalte loopen und mir die Werte merken. Dann kannst du entscheiden, an welcher Stelle du deinen neuen Wert einträgst.


Holla. Sorry, aber ich weiß ned, wie ich des Syntaxmäßig lösen soll.

Gehen wir von einer Excel-Tabelle mit einer Spalte aus: Zum einen soll er zeilenweise durchgehen und prüfen ob ein Wert drinsteht, also irgendwie so:
ausblenden Delphi-Quelltext
1:
2:
3:
      for y := 0 to ?? do
        if Excel.Sheets[sheetname].Cells[y,1].Value := '';
          Excel.Sheets[sheetname].Cells[y,1].Value := wert;
, wobei er hier den Wert dann mehrere Male hintereinander einträgt. Also muss ich ihm noch beibringen, dass er, wenn er den Wert einmal eingetragen hat, aufhören soll.

Und zum anderen soll er noch prüfen, ob bereits ein größerer Wert drin is?


Kommt mein Code-Schnipsel an die Syntax hin, wie du sie machen würdest?
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 30.01.08 08:35 
Fast. 8)

ausblenden 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:
24:
var i,
    curCol,
    code,
    wert,
    maxWert : Integer;
    text    : String;

begin 
  maxWert := 0;
  { das ist die Max-Spaltenanzahl in Excel }
  for i := 1 to 65536 do
    begin 
      curCol := i;
      text := Excel.Sheets[sheetname].Cells[i,1].Value;
      if text = '' then
        Break;

      Val (text, wert, code);
      if code = 0 then
        maxWert := Max (maxWert, wert);
    end;

  Excel.Sheets[sheetname].Cells[curCol,1].Value := DeinNeuerWert;  
end;


So in etwa würd ich das machen.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 08:45 
Schaut gut aus. Versteh nur den Bereich noch ned:

user profile iconiKilledKenny hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
      Val (text, wert, code);
      if code = 0 then
        maxWert := Max (maxWert, wert);




Und du meintest oben mit 65536 wohl vermutlich die maximale Zeilenanzahl (und nicht Spalten) ;) Dann verändere ich die Variable CurCol mal in aktZeile ;)
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 30.01.08 08:54 
Da hast du natürlich Recht, ich hab das eben mal runtergeschrieben... :wink:

Das mit dem Val macht eine Überprüfung, ob der String in der Variablen text ein gültiger Integer ist. Nur dann kann man das mit Max () bearbeiten.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 08:56 
user profile iconiKilledKenny hat folgendes geschrieben:

Das mit dem Val macht eine Überprüfung, ob der String in der Variablen text ein gültiger Integer ist. Nur dann kann man das mit Max () bearbeiten.


Aber dieses Gedönse mit dem Val und maxWert() brauch ich ja gar ned unbedingt. Es reicht ja die Zeile "if text = '' then Break;" denk ich mal??
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 30.01.08 09:00 
Wolltest du nicht überprüfen, ob ein größerer Wert schon vorhanden ist? Mit meinem Code steht nach der Loop in maxWert der größte Wert in der Spalte drin... :?: :!:
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 09:03 
user profile iconiKilledKenny hat folgendes geschrieben:
Wolltest du nicht überprüfen, ob ein größerer Wert schon vorhanden ist? Mit meinem Code steht nach der Loop in maxWert der größte Wert in der Spalte drin... :?: :!:


Ja, dass wollt ich schon überprüfen. :) Aber da muss ich die Excel-Spalte B überprüfen.
Denn in Spalte B steht eg immer ein Integer-WErt drin, den man direkt so überprüfen kann.

Also er soll in der ersten freien Zeile in Spalte A einen Wert (String) eintragen und in Spalte B einen anderen Wert (Integer). Wenn nun in Spalte B schonmal irgendwo ein größerer Wert drinsteht soll er ihn auch eintragen, aber eine Fehlermeldung bringen
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 30.01.08 09:30 
Dann ist die Loop die gleiche, du musst nur zwei Spalten gleichzeitig auslesen und nach der Loop dann schreiben und ggf. einen Fehler ausgeben.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 09:52 
user profile iconiKilledKenny hat folgendes geschrieben:
Dann ist die Loop die gleiche, du musst nur zwei Spalten gleichzeitig auslesen und nach der Loop dann schreiben und ggf. einen Fehler ausgeben.


Irgendwie so?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
      for i := 1 to 65536 do
      for i := 4 to 65536 do
        begin
          x := i;
          text := Excel.Sheets[sheetname_z].Cells[i,1].Value;
          if StrToInt(Excel.Sheets[sheetname_z].Cells[i,2].Value) > maxWertB then
            maxWertB := StrToInt(Excel.Sheets[sheetname_z].Cells[i,2].Value);
          
          if (text = ''then
            if (maxWertB > zaehlerstand_z) then
              begin
                messagedlg('Hinweis: Aktueller Zählerstand niedriger als bisheriger maximaler Zählerstand',mtInformation,[mbOK],0);
                Break;
              end;
      end;

// Beschreiben der Excel-Zeilen


Nur muss ich grad nochmal gucken, warum er die Werte der Spalte B ned überprüft. Er trägt des ganze wunderbar ein. Nur macht er des für die Spalte B auch mit kleineren Werten.

D.H. ich muss den maximalen Wert der Spalte B ermitteln, und dann mit dem zaehlerstand_z vergleichen
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Mi 30.01.08 10:46 
So gehts:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
      for i := 4 to 65536 do
        begin
          x := i;
          text := Excel.Sheets[sheetname_z].Cells[i,1].Value;

          try
            maxWertB := StrToInt(Excel.Sheets[sheetname_z].Cells[i,2].Value);
          except
            //leer
          end;

          if (text = ''then
            if (maxWertB > zaehlerstand_z) then
              begin
                messagedlg('Hinweis: Aktueller Zählerstand niedriger als bisheriger maximaler Zählerstand',mtInformation,[mbOK],0);
                Break;
              end;
      end;

//Werte eintragen


Aber wie mach ich des, wenn ich nun abfragen will, ob man den Wert trotzdem einträgt oder nicht?

So ungefähr (Aber das ist nur ein Ansatz:)
ausblenden 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:
24:
25:
26:
27:
28:
      for i := 4 to 65536 do
        begin
          x := i;
          text := Excel.Sheets[sheetname_z].Cells[i,1].Value;

          try
            maxWertB := StrToInt(Excel.Sheets[sheetname_z].Cells[i,2].Value);
          except
            //leer
          end;

          if (text = ''then
            begin
              if (maxWertB > zaehlerstand_z) then
                begin
                  if(messagedlg('Hinweis: Aktueller Zählerstand niedriger als bisheriger maximaler Zählerstand'+char(13)+'Trotzdem eintragen?',mtConfirmation,[mbYes,mbNo],0) = mrNo) then
                    begin
                      Break;

                    end
                    else
                      //Werte eintragem
                end;
            end else
            begin
              Break;
            end;
      end;


Aber irgendwie steh ich grad aufm Schlauch??
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 31.01.08 23:56 
user profile iconrob87 hat folgendes geschrieben:
Schaut gut aus. Versteh nur den Bereich noch ned:

user profile iconiKilledKenny hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
      Val (text, wert, code);
      if code = 0 then
        maxWert := Max (maxWert, wert);




Und du meintest oben mit 65536 wohl vermutlich die maximale Zeilenanzahl (und nicht Spalten) ;) Dann verändere ich die Variable CurCol mal in aktZeile ;)


beide habt ihr recht... bis zur version 2003 gibts 255 spalten, anschliessend 65... spalten. bis zur version 2003 gibts 65... zeilen, anschliessen 2...... zeilen...

aber mal davon abgesehen...
im pseudocode ungefähr so...

ausblenden Delphi-Quelltext
1:
2:
3:
for 1 to maxSheet do
 for 1 to maxUsedSpalte do 
   for 1 to maxUsedZeile do...


dafür gibts in EXCEL eine funktion, die die maximal benutzte leerzeile/-spalte angibt. hab sie nicht im kopf. sollt aber kein problem sein das rauszubekommen.

was ich mich frag, wie viel zeit habt ihr denn? wenn das 'n grösseres excel ist, wird da dein kaffee bei kalt... von daher würd ich (a) versuchen die datei nativ einzlesen um sie dann zu durchsuchen oder (b) sie in ein format zu bekommen, das man einfach bearbeiten kann.

<HTH>
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Fr 01.02.08 14:01 
user profile iconGrenzgaenger hat folgendes geschrieben:

oder (b) sie in ein format zu bekommen, das man einfach bearbeiten kann.

wo wir wieder bei .csv wären XD

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Do 07.02.08 15:35 
user profile iconXion hat folgendes geschrieben:
user profile iconGrenzgaenger hat folgendes geschrieben:

oder (b) sie in ein format zu bekommen, das man einfach bearbeiten kann.

wo wir wieder bei .csv wären XD


Habs nun mit CSV gelöst. Merci an alle. :D :D