To number

Gyűlt már meg valakinek a baja azzal az Excel problémával, hogy kapott egy adatsort, amiben számok voltak, és az Excel nem tudta azokat összeadni? Például úgy, hogy kijelöli a számokat, vagy alul összeszummázza?

Nem tart sokáig, hogy rájöjjünk, valójában számok azok, csak Excel barátunk szövegnek értelmezi őket. Csúfos esetben még az is lehet, hogy a cella tulajdonságainál se tudjuk visszaállítani, aztán jöhetnek a koszos hekkelések, pl megszorozzuk a cellákat 1-el, aztán hátha úgy válik belőle szám típus, meg a hasonlók.

Penoff Gábor Excel szakembert hívtuk segítségül, hogy választ adjon erre a kihívásra. Ezt mondja:

“A probléma lehet mondjuk azért, mert a mező értéke string delimiterek, mondjuk idézőjelek közé zárva érkezik, de általában akkor csinál ilyet, ha a ThousandsSeparator vagy esetleg a DecimalSeparator nem egyezik az adatot exportáló és importáló rendszerekben.”

Mi a megoldás?

“Egy kis rutinka, ami annyit csinál, hogy végig megy a mindenkori kijelölés összes celláján, és ha a cella nem üres, megprobálja a tartalmát numerikus értékké konvertálni, illetve a cella formátumát General típusúra Text helyett. A rutin csak azokra az esetekre megoldás, ha a cellában text-ként szereplő számban az ezres és a decimális szeparátor karakterek az OS Regional Setting-jében meghatározott karakterek.”

Hol találom ezt a rutint?

tonumber.png

“Lépjünk ki az Excelből, majd a C:\Program Files\Microsoft Office\OFFICE11\XLSTART mappába tegyük bele ezt a file-t kicsomagolva (ha nem 2003-as Office-t használunk, máshogy nézhet ki ugyanez, de csak keressük meg az XLSTART-ot). Újraindítás után meg fog jelenni a menuben egy Xtras pont, abban pedig a toNumber rutin.”

menu.png

A rutin forrása a törés után olvasható. Penoff Gábornak pedig köszönjük, a szó ismét a stúdióé!


Sub toNumber() ' szamot csinal egy range-bol
    Dim OldASU As Boolean
    Dim C As Range
    Dim cMax As Long

    OldASU = Application.ScreenUpdating
    Application.ScreenUpdating = False

    cMax = Selection.Cells.Count
    On Error Resume Next
    For Each C In Selection.Cells
        Application.StatusBar = "[toNumber] " & cMax & "..."
        If Not IsEmpty(C) Then C.Value = CDbl(C.Value)
        If Err.Number = 0 And C.NumberFormat = "@" Then
C.NumberFormat = "General"
        Err.Clear
        cMax = cMax - 1
    Next C
    On Error GoTo 0

    Application.ScreenUpdating = OldASU
End Sub

21 hozzászólás

Zeusz

Áldom az eget, oh Allah, hogy nem kell ekkora rohadék faszságokkal foglalkoznom, valószínű már régesrég az ereimet vagdosnám, ha ilyen arcpirítóan egyszerű feladathoz ekkora kókányolást kéne végrehajtanom. Ez gusztustalan.

Dob

Hm.. ha ráállsz a cellára, akkor megjelenik felette egy sárga felkiáltóje (ha jól tudom), amira ha rányomsz akkor ott az opció, hogy konvertálás számmá. PErsze ez is csak bizonyos konstellációkban.
A másik megoldás, hogy a cella típusának “általános’-t adsz meg.
A harmadik megoldás, hogy beállasz a cellába, nyomsz f2-t, majd entert.. akkor elvileg átkonvertálja. Nagy mennyiségben ez persze nem jó, de párnál még belefér

fns

Zsombor: a VALUE() meg nem allitja at Text-rol General-ra a cella NumberFormat-jat es tovabbra is text-kent fogja a gyagyas Excel ertelmezni.

Dob:
- a General NumberFormaat onmagaban meg nem oldja meg a string delimiterek eltunteteset
- az utolso mondatban az eszencia – 20000 cellan nem akar a juzer klikkolni.

TillZ

Ha a tizedes elválasztó megfelelő, csak a formátum rossz, akkor 1-et irányított beillesztés/értéket, szorzással számmá alakíthatjuk.

.rewerse.

vicces, hogy még a tizedes elválasztó is ekkora problémát jelent :) )

kiváncsi vagyok akkor mit kezd, ha más típusú az elválasztó.. ugye magyarok , angolom meg . (vessző/pont) ?

csikszem

Józsi, mint az ügyvéded, azt tanácsolom, hogy látogasd meg az ASAP utilities weboldalát és szerezd be az ingyenes add-in gyűjteményt, amely számos egyéb problémára egyszerű és elegáns megoldást nyújt. Jelen esetben a Convert ‘textnumbers’ to number menüpontot javaslom használni.
Ugyanezt tanácsolom mindenkinek, aki excellel dolgozik és professzionális szintre kívánja emelni a munkáját.

Trofimov

Dob megoldását egészíteném ki az alábbi makróval, hogy ne kelljen F2 nyomkodásban kimulni:

Kijelöld a cellákat.
CTRL+F1, A szám fülön szám típust kiválasztod.
Leokézod.

Makro inditás:

Sub konvert()
For Each cel In Selection
SendKeys (“{F2}{ENTER}”)
Next
End

A kijelölt cellákban F2+enter nyom.

Ha nem akarod még a számformát, akkor:

Sub konvert()
Selection.NumberFormat = “0.00″
For Each cel In Selection
SendKeys (“{F2}{ENTER}”)
Next
End

Csak kijelöl, és indit.

fns

.rewerse.: van erre is szolucio (en spec. szivtam mar multinal ilyennel is), de Jozsinak nem volt ilyen problemaja

csikszem: az ASAP Utys asszem 50 USD, 7 mega

trofimov: a SendKeys agyatlanul lassu imho.

CsasZ

Na, mondjuk ez tényleg szánalmas. Mintha a földművelésügyi minisztréium aktakukacai írnák az ekszcellt…
Nem érdekelnek a ThousandsSeparator-ok és egyéb faszságok. Ha van egy 2-3 jegyű egész számokat tartalmazó oszlop, akkor _legrosszabb_ esetben legyen elég, hogy kijelölöm az oszlopot és a formátumot átállítom Numberre.
Ne akarják megmagyarázni, hogy miért nem képes erre, amikor az ekszcel maga is számnak mutatja a cuccot.
Konvertálja át ha szám, ha pedig hegyikecskék vannak a cellákban, akkor mutasson hegyikecskéket. De ne akarják megmagyarázni. Szar.

bb

nekem erre a data-text to columns parancsa szokott nagy sikert hozni hasonló problémánál, csak ki kell jelölni az oszlopot és lelkesen tovább-ot nyomogatni. magyar officeban az adatok-szövegből oszlopok parancs

Dob

még a reaplce szokott segíteni. delimetereket átreplacézod valami értelmesebb (excel számára értelmesebb) karakterré.

klarky

Annyira irigylem a problémáidat! 8-)

Egyébként az excel tényleg nem egy paradicsom a felhasználó számára. Utálom és kerülöm is ha csak tehetem. De erről, más okból már beszéltünk itt, ezen fórumon.

CsasZ

Joe, tudom, hogy nem működik :)

Az adatsorod rántsd be valami adatbázisba, aztán szevasz :)

Dob

klarky: jah .. az excelnek vannak ilyen sajáétosságai, amik nagyon bosszantóak, de sajnos sok funkciójára nincs alternatíva

DnP

CTRL+1 Szam/altalanos aztan OK.. ehez tenyleg script kell bazz… magatol ritkan rakja at szamot szovegge, fokent “.” “,” hibakkal talalkozom..