Entwickler-Ecke
Sonstiges (Delphi) - [Excel] Inhalt einer Spalte durchsuchen und darauf reagieren
rob87 - Di 29.01.08 09:30
Titel: [Excel] Inhalt einer Spalte durchsuchen und darauf reagieren
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 - 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.
rob87 - 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 - 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 - 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 - Mi 30.01.08 08:35
Fast. 8)
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 - Mi 30.01.08 08:45
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 ;)
iKilledKenny - 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 - 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 - 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 - 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 - 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 - 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 - 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??
Delete - 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 - 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
rob87 - Do 07.02.08 15:35
Xion hat folgendes geschrieben: |
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 |
Habs nun mit CSV gelöst. Merci an alle. :D :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!