| Autor |
Beitrag |
rob87
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: 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 jasocul: Topic aus VCL (Visual Component Library) verschoben am Di 29.01.2008 um 09:35
|
|
Xion
      

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)
|
Verfasst: 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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 07:42
Xion 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 08:23
iKilledKenny 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:
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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 30.01.08 08:35
Fast.
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; 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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 08:45
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 30.01.08 08:54
Da hast du natürlich Recht, ich hab das eben mal runtergeschrieben...
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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 08:56
iKilledKenny 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 09:03
iKilledKenny 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 09:52
iKilledKenny 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?
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;
|
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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Mi 30.01.08 10:46
So gehts:
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 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;
|
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:)
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 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 end; end else begin Break; end; end; |
Aber irgendwie steh ich grad aufm Schlauch??
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 31.01.08 23:56
rob87 hat folgendes geschrieben: | Schaut gut aus. Versteh nur den Bereich noch ned:
iKilledKenny hat folgendes geschrieben: |
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...
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
      

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)
|
Verfasst: Fr 01.02.08 14:01
Grenzgaenger 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 
      
Beiträge: 461
Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
|
Verfasst: Do 07.02.08 15:35
|
|