[SOLVED]Losowanie osób będących w pracy

Użytkowanie arkusza kalkulacyjnego
Lejtos
Posty: 8
Rejestracja: pn cze 05, 2023 4:09 pm

[SOLVED]Losowanie osób będących w pracy

Post autor: Lejtos »

Cześć,

Mam pytanie odnośnie funkcji jakiej użyć do losowania osób które są aktualnie w pracy. Chodzi mi głownie o 2 grupy. Grupa X składa się z 2 osób i jest losowanie miedzy nimi jeśli są w pracy. Jeżeli znajdzie się dzień, w którym ani jednej z tych osób nie ma, żeby losowało z grupy Y 3 osobowej - obecnych w pracy. Napisałem sobie takiego tasiemca jak poniżej. Nie jest od do końca dobrze napisany bo mam w nim błąd ale nie istotne.
Ciekawi mnie czy jest jakaś funkcja którą mogę użyć by była prostsza i szybka w pisaniu.

TASIEMIEC wybierający osoby z grupy Y:
=JEŻELI(D65=0;JEŻELI(E65=0;F61;JEŻELI(F65=0;E61;INDEKS(E61:F61;LOS.ZAKR(1;2))));JEŻELI(E65=0;INDEKS(D74:E74;LOS.ZAKR(1;2));INDEKS(D61:E61;LOS.ZAKR(1;2))))

TASIEMIEC wybierający z X, a gdy nie ma Y:
=JEŻELI(B64=0;JEŻELI(C64=0;JEŻELI(D64=0;JEŻELI(E64=0;F61;E61);D61);C61);INDEKS(B61:C61;LOS.ZAKR(1;2)))

Gdzie 0 oznacza że nie ma kogoś w pracy

część z grafiku załączam w pliku
Załączniki
grafik.png
grafik.png (7.55 KiB) Przejrzano 502 razy
Ostatnio zmieniony pt cze 09, 2023 1:15 pm przez Lejtos, łącznie zmieniany 1 raz.
OpenOffice 7.1.1.2 na Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Losowanie osób będących w pracy

Post autor: Rafkus »

A na jakiej podstawie stwierdzasz ile osób jest w pracy? Ja na skrzyżowaniu x datą widzę widzę 9 lub nic...
A może chodzi o grupę zieloną/niebieską??
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Losowanie osób będących w pracy

Post autor: Jermor »

Możesz zastosować taką formułę:

Kod: Zaznacz cały

=WARUNKI(I(B2;C2);LOS.ZAKR(5;6);LUB(B2;C2);0;LICZ.JEŻELI(D2:F2;0)=3;0;1;LOS.ZAKR(1;3-LICZ.JEŻELI(D2:F2;0)))
Działa tak:
Jeśli X i Y są w pracy — jest losowanie. Gdy choćby jeden z nich był w pracy — nie ma losowania, jeśli żadnego nie ma w pracy następuje sprawdzenie, czy w pracy jest choć jeden z Y, jeśli nie ma, nie ma losowania. Jeśli ktoś jest to jest losowanie od 1 do liczby obecnych.
Wpisałem X-om liczby 5,6, żebyś mógł sprawdzić działanie kto jest losowany.
Uwaga: komórki muszą zawierać 0, komórki puste zafałszują działanie formuły.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Losowanie osób będących w pracy

Post autor: Jermor »

Zmodyfikowałem formułę tak, żeby uwzględniała komórki puste. Oto ona:

Kod: Zaznacz cały

=JEŻELI(B2+C2=0;JEŻELI(SUMA(D2:F2)=0;0;LOS.ZAKR(1;LICZ.JEŻELI(D2:F2;">0")));LOS.ZAKR(1;LICZ.JEŻELI(B2:C2;">0"))+10)
Ta 10 na końcu dodawana jest gdy losowany jest X (żeby się przekonać, co jest losowane X, czy Y).
Pierwsze JEŻELI() sprawdza, czy X jest zerowe (puste), jeśli tak wywołuje drugie JEŻELI(). To drugie sprawdza, czy Y jest zerowe (puste) jeśli tak to wynikiem jest 0, w przeciwnym razie losowana jest liczba od 1 do liczby komórek większych od 0. Gdy w X choćby jedna komórka jest większa od 0, losowana jest liczba od 1 do liczby komórek większych od 0.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Lejtos
Posty: 8
Rejestracja: pn cze 05, 2023 4:09 pm

Re: Losowanie osób będących w pracy

Post autor: Lejtos »

Dziękuję za odpowiedzi. Będę testował w środę co i jak jeśli znajdę czas w pracy. Dam znać co mi z tego wyszło :)
OpenOffice 7.1.1.2 na Windows 10
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Losowanie osób będących w pracy

Post autor: Jermor »

Jeszcze raz zmodyfikowałem formułę. Teraz wyświetla wynik losowania poprzedzając go literą losowanej grupy.
Formuła wygląda tak:

Kod: Zaznacz cały

=JEŻELI(B2+C2=0;JEŻELI(SUMA(D2:F2)=0;0;"Y"&LOS.ZAKR(1;LICZ.JEŻELI(D2:F2;">0")));"X"&LOS.ZAKR(1;LICZ.JEŻELI(B2:C2;">0")))
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Lejtos
Posty: 8
Rejestracja: pn cze 05, 2023 4:09 pm

Re: Losowanie osób będących w pracy

Post autor: Lejtos »

Sprawdziłem to co napisałeś i nie do końca o to mi chodziło. Mogłem trochę lepiej sprecyzować. Poniżej wstawię screena z "imionami" i gotowymi tabelkami które obecnie mi to wylicza oraz opiszę zaraz co dokładnie potrzebuje. Chodziło mi o to czy mogę prościej jakoś zrobić ten kod który:
1) wyznaczy w pierwszej kolejności osobę z zarządu która jest w pracy (losowo jak są dwie), a gdy nie ma ani jednej z tych osób, wyznaczy losowo osobę z "działu Y" która jest w pracy. W pierwszej wersji zrobiłem to na zasadzie : Jeżeli() nie ma pierwszej, sprawdź czy jest druga, jeżeli() jej nie ma, sprawdź grupę Y pod tym samym kątem. Jeśli jest pierwsza osoba z zarządu, sprawdź czy jest druga, jak tak - losuj miedzy nimi itd.
2)Wyznaczenie osoby z "działu Y". Zazwyczaj są po 2 osoby, nigdy nie ma sytuacji, że kogoś nie ma.

Używam INDEKS( X:Y ;LOS.ZAKR(1;2)) by wrzucić od razu imię i nazwisko pracownika.

Dopiero się uczę w zasadzie Libre Calc i po poznaniu JEŻELI robię wszystko na tym :D

Zapomniałem dopowiedzieć, że te dwie tabelki poniżej z pracownikiem 3 oraz 5 są po to, by nie losowało podczas nieobecności pracownika 4
Załączniki
Grafik 1.png
Grafik 1.png (7.19 KiB) Przejrzano 437 razy
Grafik 2.png
Grafik 2.png (9.59 KiB) Przejrzano 437 razy
OpenOffice 7.1.1.2 na Windows 10
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Losowanie osób będących w pracy

Post autor: Jermor »

Podsyłam nowe rozwiązanie. Jest ono oparte dokładnie na tym co pokazałeś w poście, to znaczy, że w zarządzie występują dwie osoby, których nazwiska są wpisane w wierszu 2 a w dziale Y trzy osoby i ich nazwiska także są wpisane do wiersza 2. Piszę o tym, bo nazwiska z wiersza 2 są pobierane do wyniku.
Teraz o formule.
Wykorzystałem funkcję WARUNKI(), WYBIERZ(), INDEKS(), LOS.ZAKR() i LICZ.JEŻELI(). Dwóm komórkom z nazwiskami zarządu nadałem nazwę X a trzem z działu Y właśnie Y. Do tych nazw się odwołuję w funkcji INDEKS().
Funkcja WARUNKI() to rozbudowany wariant JEŻELI(). Funkcja może mieć 127 par argumentów w układzie "warunek — działanie". Pierwszy, licząc od lewego nawiasu, spełniony warunek decyduje jakie działanie zostanie wykonane. Dalsze warunki nie są już sprawdzane. Dlatego ważne jest, aby były ułożone we właściwej kolejności.
Funkcja WYBIERZ() na podstawie wartości pierwszego argumentu (musi to być liczba całkowita od 1 do n) decyduje, który z następnych jej argumentów zostanie wykorzystany. Pierwszy argument nie może być większy niż liczba pozostałych wymienionych w funkcji argumentów.
W celu wyboru pracownika z działu Y wykorzystałem "przekształcenie" trzyosobowego stanu działu Y w liczbę binarną. Na zasadzie: pierwszy pracownik ma wagę 1, drugi 2 a trzeci 4, dzięki temu stan osobowy da się przedstawić liczbą od 0 (nikogo nie ma) do 7 (są wszyscy). I ta liczba, powiększona o 1,bo pierwszy argument funkcji WYBIERZ() musi być większy od 0, jest właśnie indeksem tej funkcji. Pewną sztuczkę trzeba było zastosować przy wartości 5 (w pracy jest pierwszy i trzeci pracownik), gdyż przy losowaniu zakresu nie można pomijać jakichś liczb. Obszedłem to wybierając losowo indeks 1 lub 3 w wewnętrznej funkcji INDEKS().
Załączniki
Lejtos.ods
(9.35 KiB) Pobrany 39 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Losowanie osób będących w pracy

Post autor: Jermor »

Jednak jeszcze raz zmieniłem sposób realizacji problemu. Uprościłem go, chociaż sama formuła jest bardziej skomplikowana.
W tym rozwiązaniu zarówno grupa X jak i grupa Y może składać się z dowolnej liczby osób. Zrezygnowałem z funkcji INDEKS() na rzecz funkcji REGEX(), więc to rozwiązanie zadziała tylko w Calc-u LibreOffice, gdyż tylko w nim ta funkcja jest wbudowana. Zresztą funkcja POŁĄCZ.TEKSTY() także użyta w formule, też jest dostępna tylko w LibreOffice.
Działa to tak:
Jeśli nikogo nie ma w grupie X, przechodzimy do rozwiązania problemu w grupie Y.
Grupa Y.
Jeśli nikogo nie ma w grupie Y wyświetlany jest wynik "Brak osób" w przeciwnym razie przy pomocy funkcji POŁĄCZ.TEKSTY() łączę w jeden tekst te nazwiska osób należących do grupy Y, które są w pracy. Następnie przy pomocy funkcji REGEX() wybieram ten w kolejności ciąg znakowy, który zostanie wylosowany przez funkcję LOS.ZAKR.NIEUL(). Górny zakres losowania wynika z liczby obecnych osób. Funkcja LOS.ZAKR.NIEUL() nie zmienia się przy każdym przeliczeniu arkusza. Losuje nowe wartości tylko wtedy, gdy zostanie coś wprowadzone do zakresu, którego dotyczy. Nazwiska personelu muszą składać się z liter i ewentualnie spacji, znaku dywizu (może pojawić się nazwisko dwuczłonowe) lub apostrofu (może się trafić jakiś Irlandczyk na przykład).
Grupa X.
Jeśli jest ktoś w grupie X, to tak, jak powyżej w grupie Y, wykonywana jest analogiczna procedura w grupie X.
Cała formuła jest formułą macierzową, więc musi być zatwierdzana skrótem CTRL+SHIFT+ENTER i nie może być kopiowana poprzez zwykłe przeciągnięcie narożnika komórki.
Załączniki
Lejtos2.ods
(10.7 KiB) Pobrany 41 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Lejtos
Posty: 8
Rejestracja: pn cze 05, 2023 4:09 pm

Re: Losowanie osób będących w pracy

Post autor: Lejtos »

Dzięki bardzo. Prawdę mówiąc nie do końca rozumiem jak to działa, ale fakt jest taki, że o coś takiego mi chodziło. Teraz zostaje mi się nauczyć zasady działania poszczególnych funkcji na przyszłość :) Dzięki jeszcze raz :)
OpenOffice 7.1.1.2 na Windows 10
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: [SOLVED]Losowanie osób będących w pracy

Post autor: Jermor »

Jak napisałeś, dopiero się uczysz i poznałeś już funkcję JEŻELI(), więc ten problem pomijamy.
To, co musisz tu zrozumieć to istota formuł macierzowych (w niektórych opracowaniach nazywanych też tablicowymi). Są to takie formuły, które zamiast pojedynczego adresu zawierają zakresy komórek. Takie formuły, a właściwie funkcje, już poznałeś, np. SUMA(). Przy tej formule w sposób naturalny rozumiemy znaczenie zakresu komórek, a i Calc nie wymaga od nas specjalnego informowania go, że ma ją traktować jako formułę macierzową. Inaczej ma się to z innymi konstrukcjami formuł.
W formule wynikowej znajduje się następujący fragment:
JEŻELI(D3:G3>0;Y;"")
Funkcję JEŻELI() poznałeś, ale nie w takim zapisie. Jest to zapis macierzowy mówiący, że funkcja ma się wykonać dla każdego warunku sprawdzanego względem komórek od D3 do G3, i dla każdego przypadku gdy wynikiem jest PRAWDA ma zostać pobrany odpowiedni element z obszaru Y, a gdy wynikiem jest FAŁSZ ma zostać wstawiony pusty ciąg znakowy. W efekcie ta formuła wygeneruje 4 wyniki i żeby je pokazać, wstawi je do czterech kolejnych komórek. Możesz tę formułę, poprzedzoną znakiem = wstawić do testowego arkusza i zobaczyć co się stanie.
Gdy ją wpiszesz i naciśniesz ENTER otrzymasz wynik #ARG!, gdyż Calc nie zrozumiał w tym zapisie wstawionych zakresów, czyli D3:G3 i Y (Y jest w rzeczywistości zakresem D2:G2). By poinformować Calc-a, że ma potraktować tę formułę jako macierzową, musisz ją zatwierdzić skrótem klawiaturowym CTRL+SHIFT+ENTER. Zobaczysz wtedy czterokomórkowy wynik.
Teraz funkcja POŁĄCZ.TEKSTY().
Łączy ona w jeden ciąg znakowy zawartości trzeciego i ewentualnie dalszych argumentów. Te argumenty mogą być zakresami. Pierwszy argument tej funkcji określa jakimi znakami, tu wybrałem tylko jeden znak, średnik, mają być rozdzielone te połączone elementy, a drugi argument mówi co zrobić jeśli dołączany element jest pusty, Wartość 1 oznacza, że pusty element nie ma być uwzględniany. Trzecim argumentem tej funkcji jest omówiona powyżej formuła macierzowa, a to oznacza, że funkcja POŁĄCZ.TEKSTY() "dostaje" do połączenia cztery elementy, a wynikiem funkcji będzie ciąg zawierający od jednego do czterech elementów (puste są pomijane).
Funkcja REGEX()
Pozwala m.in. "wyciągnąć" z ciągu znakowego konkretne wystąpienie poszukiwanego wzorca. Ponieważ wiemy ile elementów zostało połączonych, to możemy wygenerować liczbę losową od 1 do liczby elementów, i ten właśnie element wyodrębnić z ciągu wejściowego. W przypadku tej funkcji potrzebna jest wiedza o zasadach budowania wrażeń regularnych. O funkcji REGEX() napisałem tutaj: viewtopic.php?t=5513
O formułach macierzowych możesz poczytać np. tu: https://yestok.pl/gen/y44.php
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
ODPOWIEDZ