OOo calc find/search függvény

 ( toflex | 2010. május 6., csütörtök - 12:33 )

Sziasztok!

Az alábbi problémába futottam bele a minap.
Egy olyan táblázatot kell csinálnom ami számokat ad össze, de a számok előtt betűk is szerepelhetnek.

az érintett cellák tartalma ilyesmi lehet:
8
10,5
D.10,5
VI.12
II.9.5

a betűk és a számok között az elválasztó mindig egy speciális karakter, itt éppen pont (előre megadott)
A cellák formátuma mindegyiknek szövegre van állítva, mert csak így tudtam elkerülni, hogy pl a VI.12-t dátummá alakítsa.

arra gondoltam, hogy először rejtett cellákban leválasztanám a betűket, majd a cellékat szummáznám. a leválasztást egy ehhez hasonló utasítással oldanám meg:

IF((SEARCH(".";C8)<1); C8; RIGHT(C8;LEN(C13)-SEARCH(".";C8))

a gond vele az, hogy a SEARCH és a FIND függvény miatt az egész függvény eredménye 0 lesz, abban az esetben, ha a . nem szerepel a cellában.

próbáltam az isnumber függvényt is, de az mivel a cella fomrátuma szöveg, mindig hamisat ad vissza.

nincs valami ötletetek, hogyan tudnám ezt megoldani?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

regi a kerdes, de azert nem hagy nyugodni a dolog. A fenti kifejezesben egyreszt nincs FIND, masreszt nem nagyon ertem, hogy miert is lenne 0 a SEARCH miatt az egesz eredmenye? (Az if majd visszaad valamit, amit te megadsz.) A fenti kepletben meg van egy hiba, az IF hamis agaban hivatkozol C13-ra - nem a miatt van a gond, hogy ott is C8-ra kene inkabb???

Azóta még öregebb lett a kérdés:)
Bár az alapelv nem lenne rossz, de Zahynak igaza van a hibákkal kapcsolatban (pont azért nem működik a képleted, mert nem 0-t ad vissza a SEARCH, hanem hibakódot). Az if(feltétel; igaz ág; hamis ág) megoldással az a gond, hogy nem igazi hibakezelést valósít meg, pusztán elágazik kiértékeléstől függően. Emiatt a következő képlet már jobb lenne (de ez sem tökéletes, mert feltételezi hogy a hibakódot mindig a pont hiánya okozza, ami persze nem igaz, tehát ha jobbat akarsz, akkor még azt is figyelni kell, mi a hibakód):

IF(ISERROR(SEARCH(".";C8)); C8; RIGHT(C8; LEN(C8) - SEARCH(".";C8) )

Sőt, akár cifrázhatod regexp segítségével is például a keresést:

SEARCH("\.?([:digit:]+\,[:digit:]+|[:digit:]+)$";C8)

Elfelejtettem írni, hogy van még egy triviális megoldási lehetőség (lehet, hogy lehetne még egyszerűsíteni, csak gyorsan összedobtam, zárójelek egy része is redundáns de átláthatóbb így):

IF(ISERROR(SEARCH(".";C8));C8;RIGHT(C8;(LEN(C8))-(SEARCH("@";(SUBSTITUTE(C8;".";"@";(LEN(C8)-LEN(SUBSTITUTE(C8;".";"")))))))))

magyarul jobbról balra haladva:
LEN(SUBSTITUTE(C8;".";"") => cellahossz pontok nélkül

(LEN(C8)-LEN(SUBSTITUTE(C8;".";""))) => (cella hossza - pontnélküli hossz) adja meg a pontok számát

SEARCH("@";...) => kicseréljük @-ra a legutolsó pontot (mivel a pontok száma alapján a legutolsó pontra tudunk pozicionálni search utolsó paramétere segítségével)

RIGHT(C8;(LEN(C8))-(SEARCH("@";....)) => jobbról vágjuk ki és jelenítsük meg a mező szükséges részét, azaz a (teljes hossz - utolsó pont pozicíója balról számolva) pozicíóig tartó sztringdarabot

Azé' ezt triviálisnak nevezni enyhe perverzitás ...

:-) Csak annyira, mint felsőoktatásban matekórán másfél órás levezetések után "a többi bizonyítás triviális" felkiáltással otthagyni az üveges csirkeszemekkel meredő hallgatóságot..
Egyébként ez az a fajta megoldás akkor kellett élesben, mikor szóközzel tagolt sztringeket kellett Excelben manipulálni regexp nélkül, valahogy így volt a legegyszerűbb az utolsó "szót" kiválasztani egy eléggé vegyes mezőhalmazban.