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?
- 1256 megtekintés
Hozzászólások
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???
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Azé' ezt triviálisnak nevezni enyhe perverzitás ...
- A hozzászóláshoz be kell jelentkezni
:-) 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.
- A hozzászóláshoz be kell jelentkezni