Keresés

Hirdetés

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

  • Fferi50

    őstag

    válasz TrollBalint #25785 üzenetére

    Szia!

    "ettől lehalt az egész excel"
    Igazad van, szégyellem magam miatta, mert ezzel belekergettem egy végtelen ciklusba a függvényt.
    Ezt most kipróbáltam és működik. Magyarázatokat is fűztem hozzá:
    Function munkanapos(ByVal mettol As Date, Optional hanynap As Integer) As Date
    Dim unnepek As Range, munkanap As Date, napi As Range, napok As Date, napjai As Integer
    Set unnepek = Sheet1.Range("G2:G19") 'itt vannak az ünnepnapok és a dolgozós szombatok
    napjai = 0 'nulláról indul a munkanap számláló
    munkanap = mettol
    napok = mettol 'innen indulunk
    Do While napjai <= hanynap 'addig kell a ciklust csinálni, amíg a munkanapok száma eléri a kívánt értéket
    Set napi = unnepek.Find(what:=napok, LookIn:=xlValues, lookat:=xlWhole) ' benne van-e az ünnep listában a dátumunk
    If Not napi Is Nothing Then ' ha benne van a listában a dátumunk
    If Application.Weekday(napok, vbMonday) = 6 Then ' és az szombat, akkor ez munkanap
    munkanap = napok ' tehát visszatérési érték lehet
    napjai = napjai + 1 'növeljük a munkanap számlálót
    End If
    Else 'ha nincs benne a listában a dátum
    If Application.Weekday(napok, vbMonday) < 6 Then ' és nem szombati nap
    munkanap = napok 'akkor lehet visszatérési érték
    napjai = napjai + 1 ' növeljük a munkanap számlálót
    End If
    End If
    napok = napok + 1 ' növeljük a dátumunkat egy nappal
    Loop 'és folytatjuk a ciklust
    munkanapos = munkanap ' ha vége a ciklusnak, akkor a munkanap változó aktuális értékét kell visszaadni
    End Function

    Nem probléma a kérdés - akkor sem, ha több van. Viszont jónéhányra a VBA help-ben megtalálod a választ.
    Pl. Range.Find paramétereinek a magyarázata (illetve egyáltalán a nevesített paraméterek használata).
    Szerintem nem úszod meg, hogy alaposan átnézd legalább a VBA help átlalános részét.
    Az unnepekben mint írtam, benne vannak a nem munkaszüneti nap szombatok is.
    Ezért kell mindkét ágat használni.
    If not = magyarul "ha nem" (not ugye a logikai tagadás). Tehát az adott helyen, ha nem semmi(üres) a napi változó értéke - azaz talált a keresés egy olyan napot a listában. Keresésnél ezt a formulát érdemes alkalmazni, mert így nem fogsz hibát kapni.
    Ha egyből a keresés eredményével akarnál dolgozni - pl. az abban levő dátumot szeretnéd megtudni, akkor hibaüzenetet kapsz. Van még egy csomó ilyen finomság, amit kb.20 év alatt sikerült összeszednem és még mindig tanulok új dolgokat.
    A Weekday a nap számát adja vissza valóban, de hogy melyik napot tekinti a hét első napjának, az a második paraméterétől (ami itt vbMonday) függ.
    A növelés logikáját szerintem megérted a makróból.

    Üdv.

  • azopi74

    addikt

    válasz TrollBalint #25785 üzenetére

    - Named Ranges::

    Az =mnapok -ért bocs, azt felesleges volt betenni name-be, hiszen nem is használtam tovább a képletet, és még a relatív hivatkozások miatt sincs értelme, hoszen úgyis táblát használtam nem range-et :)
    (mondom, hogy fáradt voltam, meg talán kicsit sok volt a sör is előtte haverokkal, valamit próbáltam, aztán véletlenül úgy marad:)
    De nyugodtan ki lehet szedni, ha visszamásolod az eredeti képletet : =COUNTIFS(DayType[Type],"Workday",DayType[Day],">="&[@KezdoDatum],DayType[Day],"<"&[@ZaroDatum])
    és nyomsz rá egy Entert, akkor is ugyanúgy működni fog, mert tábla, ezért semmi funkciója nincs jelen esetben a named range használatának
    Azt hiszem, azért csinálhattam, mert a második példádat, (az x-edik munkanap visszakeresését) eredetileg tömb függvénnyel és ennek az mnapok dinamikius named range-el akartam visszakeresni, és azért vezettem be a nevet, hogy ne legyen nagyon szofisztikált a képlet, és olvasható maradjon.

    Egyébként fő funkciói a named range-eknek:
    - állandók, változók használata
    - ha valamiért nem használhatsz táblákat, akkor is olvashatóvá és dinamikussá lehet tenni képleteket (dynamic named ranges) Utána bárhol hivatkozhatsz rájuk. Úgy gondolj rájuk, mint egy univerzális jolly joker objektumra, ami lehet akár literál, állandó, változó, tömb, vagy újrafelhasználható, meghívható metódus a programnyelvekben ;>

    Persze annál azért némileg korlátozottabb lehetőségekkel. Bár azért named ranges + iterációk használatával is bámulatos dolgokat lehet művelni mindenféle makró nélkül, Pl :)

    [link]
    [link]

    Ez is jó:

    [link]

    Persze ezek extrém példák, és ez már a másik véglet, de jól mutatják a lehetőségeket. :)

    Néha azért sajnos muszáj VBA-hoz nyúlni. Tudom ezért megköveznek, mert látom elég sok a VBA fan, aki még az összeg függvényt is legszívesebben maga makrózza le, de én annyira nem csipázom a dolgot :) Főleg, hogy sok cég IT policy-ja nem is engedi a makrók használatát. CSak esetleg szigorú validációt követően. Valamennyire érthető módon, mert hát azért elég csúnya dolgokat is lehet művelni vele, :D

    De az igazság az, hogy ma már szinte mindent meg lehet oldani egyéb, sztenderd excel eszközökkel, , csak olyanokat nem, amire amúgy a VBA sem túl optimális megoldás. Ez persze nem mindig volt így, sokáig elengedhetetlen volt a VBA használata komolyabb feladatokhoz, de sokat okosodik az excel verzóról verzióra, ma már az esetek 99%-ban azokat a dolgokat, amikre a vállalatoknál ezer éves makrókat használnak, sokkal egyszerűbben, biztonságosabban, gyorsabban és hatákonyabban meg lehet más módon is oldani. Nem állítom, hogy mindent, de a használatban lévő VBA kódok 99%-át ki lehetne simán kukázni :) Taávlati cél úgyis az, hogy eltávolítják a VBA-t az Office-ból, de azért addig még sok víz lefolyik a Dunán...

    - & jellel mi a gond? Az olyasmi, mint a CONCATENATE. És hol hívtam meg vele, és mit?

    Ja bocs, látom már, mire gondolsz :)

    Az nem meghívás, csak hivatkoztam a mnapkalk tábla (ami egyébként önmaga, tehát, normál esetben nem is kell, főleg, mivel tábláról van szó) különböző mezőire.
    Ha kimásolod a képletet, a mnapkalk mnapok mezőjébe és rányomsz egy entert, láthatod, hogy rögtön el is tűnik a saját tábla hivatkozást automatikusan és ebből:

    =COUNTIFS(DayType[Type],"Workday",DayType[Day],">="&mnapkalk[@KezdoDatum],DayType[Day],"<"&mnapkalk[@ZaroDatum])

    ez lesz

    =COUNTIFS(DayType[Type],"Workday",DayType[Day],">="&[@KezdoDatum],DayType[Day],"<"&[@ZaroDatum])

    Az & jelnek meg ehhez semmi köze, az csak a feltétel megadáshoz kell.

    ">=" és utána & jelt követően mehet tovább

    Te hogy szoktál ilyen feltételeket megadni pl SUMIFS-ben vagy COUNTIFS-ben, meg hasonló függvényekben ?

    [ Szerkesztve ]

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