Keresés

Új hozzászólás Aktív témák

  • Mutt

    senior tag

    válasz m.zmrzlina #17484 üzenetére

    Hello,

    Azt szeretném a makróval, hogy jelezze, hogy a fenti példánál pl febr 23.-a hiányzik...

    Makrós megoldás már jött rá, de hadd mutassak be egy nem makrósat. Persze vannak hátrányai, de okulásra tökéletes lehet.

    A képen látható, hogy a dátumok a B1-től kezdve vannak felsorolva, AB1-ig mennek és csak 1 dátum hiányzik most, mégpedig február 7-e (sárgával jelöltem). Két megoldás is van, az első a SZORZATÖSSZEG jól műkődik, ha csak 1 db nap hiányzik. A CSE már több nap esetén is jó, ilyenkor az első hiányzót adja vissza.

    Nézzük őket:
    =ELTOLÁS(AB1;0;-SZORZATÖSSZEG((NAP(B1:AB1)-(OSZLOP(B1:AB1)-1))))+1
    - Itt a lényeg SZORZATÖSSZEG-ben van, amely úgy múkődik hogy megnézi a cellában (pl Q1) lévő dátum napját (pl. 2013.02.17 -> 17) és hogy ez a cella hanyadik oszlopban van (OSZLOP(Q1) -> 17) és a kettőt kivonja egymásból.
    - Ha a napok egymást követik, akkor a nap száma és az oszlop száma egyezik, különbségük 0 lesz; de ha hiányzik egy nap akkor már 1-et fogunk kapni különbségnek. (Mivel az adatok nem az első oszlopból indulnak (ott most a komment van), ezért 1-et kivonok az oszlopszámából, így kapok B oszlopra 1-et, C-re 2-t stb.)
    - Tehát a SZORZATÖSSZEG((NAP(B1:AB1)-(OSZLOP(B1:AB1)-1))) pl. ilyen eredményt fog adni {0;0;0;0;0;0;1;1;1;1;1....}. Ami azt jelenti hogy az első 6 nap okés, de a 7-nél csúszás van. A SZORZATÖSSZEG ezeket az 1-eket össze fogja adni, és megkapod, hogy hány napnál nem egyezett a napszám és az oszlopszám.
    - Ennek ismeretében már könnyedén ki lehet választani az ELTOLÁS (OFSZET) függvénnyel, hogy melyik nap csúszott el, egyszerűen csak a napok listájának végéről (az AB1 esetemben) a SZORZATÖSSZEG szerint megadottszor kell visszamenni. Ehhez -1-el megszoroztam a SZORZATÖSSZEG eredményét,
    - Így megkapjuk, hogy az utolsó jó nap február 6-a volt vagyis +1 nappal később van a bibi.

    A másik képlet csúnyább, de kezeli azt az esetet ha több nap is hiányzik a listából:
    {=ABS(MIN(HA((NAP(B1:AB1)-(OSZLOP(B1:AB1)-1))*(OSZLOP(B1:AB1)-1)<>0;(NAP(B1:AB1)-(OSZLOP(B1:AB1)-1))*(OSZLOP(B1:AB1)-1))))}
    - Itt a lényeg ugyanaz mint előbb volt, vagyis keressük azokat az eseteket ahol NAP(cella) és OSZLOP(cella) nem egyenlő.
    - Valójában azonban itt a különbséget megszorzom az aktuális nap helyével, tehát nem 0 és 1-ek lesznek, hanem 0 és a megfelelő napok száma, pl. {0;0;0;0;0;0;7;8;9;10; stb}.
    - A végén ebből a listából már csak a 0-nál nagyobb legkisebb számot kell kiválasztani, erre van a HA és a <>0 közötti rész.
    - A képlet eredmény az a nap száma, amelyik hiányzik.
    - Mivel se a NAP, se az OSZLOP, sem az ABS függvények nem kezelnek tartományokat, ezért CSE-ként kell felvinni.

    üdv.

  • Delila_1

    veterán

    válasz m.zmrzlina #17484 üzenetére

    Ehhez nem kell a dátumokat átalakítani.

    Sub Van_e()
    Dim oszlop%

    For oszlop% = 6 To 10
    If Cells(1, oszlop) <> Cells(oszlop + 1) - 1 Then _
    MsgBox "Hiányzik a(z) " & Cells(1, oszlop) + 1 & " dátum."
    Next
    End Sub

Új hozzászólás Aktív témák