Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel - Dodawanie dniówki na podstawie przepracowanego czasu pracy

JaroFon 18 Sty 2015 16:54 1389 14
  • Poziom 23  
    Witam. Mam prośbę o pomoc w stworzeniu odpowiedniej formuły lub kodu VBA który doda mi (w moim pliku do kolumny G) odpowiednią dniówkę na podstawie przepracowanego czasu pracy. Zasady dodawania dniówek napisałem w pliku który jest w załączniku. W moim macierzystym pliku w arkuszu w który chcę dodawać te dniówki pracuje poniższy kod. Kod dział jak najbardziej poprawnie. Czy taką funkcję dodawania dniówek można by wpisać do tego kodu? Jak to zrobić bo ja nie mam pojęcie. W kolumnie G ręcznie dopisałem dniówki jakie miały by prawidłowo się dodać. Bardzo proszę o pomoc.
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 40  
    Powiem Ci że nie rozumiem systemu nadawania dniówek.
    Czas danej dniówki (cały) ma się zawrzeć w czasie pracy pracownika?
    Jaką dniówkę dostanie gość o czasach:
    14:10-20:15 ?
    12:10 - 22:05 ?
    Wytłumacz to, bo to dość zawiłe dla obcego.

    "Kod" dniówek jest na stałe w arkuszu czy ma być tylko w makrze?

    A co do samego makro - to jak już się wymyśli formułę to będzie się o tym, myśleć.
  • Poziom 23  
    14:10-20:15 - w tej sytuacji nie mam możliwości nadania dniówki
    12:10-22:05 (mieści się w zakresie 14:00 do 21:45 zmiana 2) - w tej sytuacji powinna być nadana dniówka 2
    Kod zakresu dniówek może być nadany w makro.
    Jeszcze raz podam jaka jest zasada nadawania dniówki. Danej dniówce odpowiada czas pracy w zakresie godzin jak poniżej który obowiązuje w zakładzie pracy. Oczywiści pracownicy przychodzą wcześniej i wychodzą później jak jest w poniższej tabeli, byle tylko ich pobyt w zakładzie pracy zmieści się w zakresie godzinowym jak poniżej. Jeśli makro nie będzie umiało przydzielić dniówkę bo zakres przyjścia i wyjścia nie mieści się w odpowiednim zakresie z poniższej tabeli lub brakuje godziny przyjścia lub wyjścia (puste pole) wówczas pole dniówki (G) powinno zostać puste, wtedy ja w takiej sytuacji sprawdzę w systemie co było powodem nieprawidłowości i ewentualnie ręcznie dodam dniówkę. Ogólnie w zakładzie pracy obowiązuje czas pracy 7,5 godziny.

    TABELA:

    06:00 do 13:45 zmiana 1
    14:00 do 21:45 zmiana 2
    22:00 do 05:45 zmiana 3
    12:00 do 19:45 zmiana 4
    18:00 do 01:45 zmiana 5
    00:00 do 07:45 zmiana 6

    Ps. teraz zauważyłem że w pliku podałem błędnie czasy pracy. Te powyżej są prawidłowe

    Dodano po 14 [minuty]:

    Podam jeszcze inny przykład. Niech to będę ja. Dziś przyszedłem do pracy o 3:50 a wyszedłem o 15:10. Według tych godzin spędziłem w pracy 11 godzin i 20 minut, ale to nieważne, makro ma nadać mi 1 dniówkę bo mój czas pracy mieści się w zakresie 06:00 do 13:45 odpowiadający dla 1 zmiany. Nadliczbowe godziny to już inna bajka
  • Pomocny post
    Poziom 40  
    W załączeniu rozwiązanie.
    Warunek aby działało to tabela dniówek ma być ustawiona rosnącą (tak jak u mnie)
    Konieczność dodania (powtórzenia) dniówki zaczynającej się od 00:00

    (Jakbym nie zmienił formatowania to byś nie zauważył ale pierwsza komórka z 00:00 ma liczbową wartość 0 natomiast ostatnia ma liczbową wartość 1 - zrobiłem formatowanie na [gg]:mm dlatego widzisz 24:00 a nie 00:00)

    Połowa z tego kodu, który przedstawiłeś jest niepotrzebna. Może kiedyś miała sens ale teraz więcej szkodzi niż pomaga. Wykasowałem i trochę poprawiłem - ale dziwię się że po Twoim "funkcjonowaniu" na forum nie wiesz jeszcze jaki kod VBA za co odpowiada.
  • Poziom 23  
    Wielkie dzięki. O coś takiego właśnie chodziło. Teraz część mojej pracy wykona właśnie ta formuła.

    Dodano po 3 [godziny] 8 [minuty]:

    Troszkę udoskonaliłem formułę i teraz wygląda tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    ...w tej formie formuła pokazuje na jaką dniówkę przyszedł pracownik, a w przypadku jeśli pracownik wyszedł szybciej jak przewiduje tabela to przeliczy mi ile pracownik spędził godzin w pracy i na jaką zmianę. Jednak formuła troszkę źle oblicza godziny pobytu bo oblicza od momentu przyjścia do pracy a nie może tak liczyć bo pracownik nie ma obowiązku przychodzić wcześniej do pracy np. 1, 2 lub 3 godziny przed rozpoczęciem pracy, dlatego teraz jak poprawić formułę aby policzyła czas pobytu ale od godziny wymaganej z tabeli? Dla mojego przykładu: Przyszedłem do pracy o 3:00 a wyszedłem o 14:00. Powyższa formuła pokaże że byłem na 1 zmianę i to jest ok. Ale jeśli przyszedłem do pracy o 3:00 a wyszedłem o 13:00 (wcześniej jak wymaga tabela) to formuła pokaże że byłem na 1 zmianę 10 godzin (1/10 godz), a to jest źle. Ja chcę aby formuła obliczyła godziny od wymaganego przybycia z tabeli czyli aby obliczyło godziny od 6:00 (i tak odpowiednio dla każdej zmiany). W tym wypadku miało by obliczyć 13:00 - 6:00 niezależnie od tego o ile wcześniej przyszedłem do pracy na swoją zmianę, czyli prawidłowym wynikiem miało by być 1/7 godz
  • Poziom 40  
    Nie jest to takie proste jakby się mogło wydawać.
    Kłopotem jest przejście godzin pracy na kolejny dzień.
    Człowiek wizualnie zauważy a excelowi trzeba wskazać.
    Nie chcąc by ktoś kto wpisuje godziny dodawał do niej "kolejny dzień" rozbuduję tą funkcje strasznie, ale może ruszy.
    Ale na to musze mieć czas a na razie jestem zajęty.
  • Poziom 23  
    Udało mi się to opanować. Poniższa formuła prawidłowo oblicza czas od momentu prawidłowego rozpoczęcia pracy. Jedynie pokazuje błąd w przypadku jak pracownik przyjdzie przed prawidłowym rozpoczęciem pracy i wyjdzięki również przed tym czasem ale to nie szkodzi bo to oznacza że pracownik był w pracy tylko przez chwilę aby coś załatwić.
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 40  
    Nie do końca jest to prawidłowe. (Już przez to przechodziłem :) )

    Trochę niepotrzebnie zagmatwałeś funkcje niemniej zobacz, że ci nie będzie działać przy niepełnej dniówce która kończy się w kolejnym dniu rano.

    Poniżej kod który to "załatwia" ( ja mam inne kolumny - przesuniecie ? )
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Jednak jest jeszcze jeden "błąd" który trzeba by było rozwiązać i dotyczy nawet wcześniejszego rozwiązania, bo pierwszego jeżeli()
    Mianowicie wpisz np. początek 22:30 a koniec 23:30 gość był tylko godzinę a wyrzuca całą zmianę. Trzeba to poprawić. I jak mówie błąd dotyczy pierwszego jeżeli()


    edit
    ------------------------------------------
    Aleś mnie wymęczył z tą formułą. Sprawdź powinno być już dobrze.
    (Trochę się rozbudowała ale wydaje mi się że już uwzględnia wszystko.

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 23  
    Aleś rozbudował ten wzorzec :) Wzorze jest wspaniały ale źle pokazuje 3, 5 i 6 zmianę. Niestety formuła jest już tak rozbudowana że ja sam się w niej nie mogę połapać. Zamiast pokazać pełną zmianę (czasy są prawidłowe) to pokazuje zmianę przez godziny czyli np. dla pełnej zmiany 3 pokazuje 3/8 godz. Wygląda na to że źle pokazuje te zmiany które mają przejście z jednego dnia na drugi Załączam nowy plik jak to wygląda w moim macierzystym pliku.
  • Pomocny post
    Poziom 40  
    Wiesz co, za daleko to poszło tu pojawiają się jeszcze inne błędy. Musze to przemyśleć od początku.

    edit
    -----------------------------------------
    Trzeba było tak zrobić od początku - nie było by tylu problemów.

    Skróciłem formułę ale dodałem "zamianę" danych co jest logiczne:

    Jeżeli godzina końca jest mniejsza od godziny początku to znaczy, że godzina "końca" dotyczy już drugiego dnia więc należy do niej dodać 24 godziny. (Nie widać tego w formacie "gg:mm" ale jak się najedzie na taką komórkę to widać w środku trochę inny zapis.
    Jeżeli "ręcznie" poprawisz datę pocztku lub końca to pamiętaj o tej zasadzie robiąc to ręcznie lub po zmianie wciśnij przycisk to makro samo to sprawdzi i ewentualnie poprawi.



    Tak samo spójrz na słownik. Dla dobra formuły musi być kolejny dzień dlatego widać to 48 godzin (jak inaczej sformatujesz będzie 00:00 ale to muszą być w rzeczywistości dwa dni). dwie dodatkowe komórki po jej prawej stronie są dla zasady i nie muszą występować ale żeby to jakoś wyglądało to dodałem.

    Kolumna "do" też jest stworzona poprzez dodawanie 7,44 godziny (bo dla godzin rannych w rzeczywistości jest to drugi dzień (jak inaczej sformatujesz "[gg]:mm" to zobaczysz dokładną ilość godzin).

    Powinno już pracować bez błędów. :)
  • Poziom 23  
    Dzięki wielkie. Teraz jest już ok. Chociaż poprzednie wersje formuł uwzględniały to jak w czasach tych z 3 i 6 zmiany zamiast godziny wyjścia była kropka to mimo to pokazywało na jaką zmianę jest pracownik. Jak przychodzę do pracy to pracownicy z 3 i 6 zmiany są jeszcze w pracy i w godzinach odejścia z pracy jest kropka bo pracownicy są jeszcze w pracy. Ale to już jest szczegół bo najwyżej te dniówki dodam sobie ręcznie
  • Poziom 40  
    A jak kropka to co ma pokazać
  • Poziom 23  
    To jest szczegół. Wiem ze kropka nie jest czasem więc nie można się do niej odnieść. W takiej postaci wzorzec jest ok. Dniówki z 3 i 6 zmiany pracowników któż jeszcze są w pracy dopiszę sobie ręcznie. Wielkie dzięki za pomoc.
  • Poziom 40  
    Wiesz co, kropka to już jest pikuś przy wcześniejszym :)
    Nie lubię (gdy się już czegoś podejmę) jak klient nie jest w pełni usatysfakcjonowany :) No chyba że zapomnę. :)
    Tak że zawsze trzeba "chwilę" poczekać , " ale będziesz Pan zadowoloooony, będziesz Pan zadowoloooony " :)
  • Poziom 23  
    Dzięki wielkie za pomoc. Myślę że to już będzie tyle. Wzorzec wszystko pokazuje co chciałem. Jeszcze raz dzięki za pomoc