Strona 1 z 1

Comiesięczny losowy grafik wyjść

: pt paź 31, 2025 9:09 pm
autor: puter
Cześć, przychodzę z takim pytanie i prośbą o pomoc.

Czy w calc da radę stworzyć arkusz który w wyznaczonych polach będzie losowo wypełniał się podanymi danymi (w tym przypadku konkretnymi numerami pokoi)??

Cel jest taki żeby zautomatyzować i przyśpieszyć tworzenie grafiku zajęć sportowych dla poszczególnych pokoi. Grafik ma być tworzony na miesiąc i w każdym tygodniu pokój może wyjść tylko raz na zajęcia. Ponad to w kolejnych tygodniach wyjścia dla każdego pokoju muszą nastąpić w innych dniach i godzinach. W każdym z dni tygodnia jest kilka pól w które nie może być wpisany żaden pokój. Opis może być skomplikowany ale załączam plik w którym do tej pory rozpisywałem to na piechotę co zajmowało sporo czasu. Calc to potężne narzędzie a z Waszą pomocą może uda się to jakoś uprościć i przyśpieszyć.

Z góry dzięki za pomoc.

Re: Comiesięczny losowy grafik wyjść

: pn lis 03, 2025 11:51 pm
autor: Jermor
Sądzę, że udało mi się (przynajmniej częściowo) rozwiązać twój problem. Ze względu na wykorzystanie nowych funkcji programu Calc skorzystać należy z wersji nie starszej niż 24.8 (LibreOffice).
Logika tego rozwiązania jest następująca:
Tworzę ciąg tekstowy złożony z wszystkich występujących numerów pokoi. Ponieważ jeden z numerów jest przedstawiony jako 7-znakowy ciąg (126-132) zastępuję go trzy znakowym kodem „xxx”. Ponadto, aby zapewnić jednoznaczność zakodowanych numerów, każdy z nich jest poprzedzony znakiem „#”. W ten sposób powstaje ciąg tekstowy o długości 88 znaków (22 pokoje x 4).
Losowania odbywają się na tym ciągu dla wszystkich dni w tygodniu i grup w tych dniach.
Do losowania numerów wykorzystałem funkcję LOS.ZAKR.NIEUL() [ang. RANDBETWEEN.NV()]. Ta funkcja generuje losową liczbę całkowitą z podanego zakresu i nie zmienia się ona w arkuszu, jeśli wykonywane są w nim działania na komórkach niepowiązanych.
Pierwsze losowanie w każdym tygodniu zaczyna się na wszystkich elementach ciągu głównego. Górny zakres liczby losowej wynika z długości ciągu (DŁ(ciąg)/4), więc w pierwszym wierszu losowana jest liczba z zakresu 1 do 22.
W kolejnych wierszach ciąg jest skracany poprzez usunięcie z niego uprzednio wylosowanych elementów. Dzięki temu żaden numer pokoju nie może się powtórzyć w tym samym tygodniu.
Z ciągu są także usuwane te numery pokojów, które zostały wylosowane na takiej samej pozycji w tygodniach poprzedzających.
Tutaj pojawia się problem tygodnia. Norma ISO 8601:2004 mówi, że tydzień zaczyna się od poniedziałku i kończy w niedzielę. Pierwszy dzień miesiąca może jednak wypaść w dowolnym dniu tygodnia, a to oznacza, że miesiąc może nakładać się na 4, 5 lub nawet sześć tak rozumianych tygodni. Dlatego w swoim rozwiązaniu utworzyłem generator losujący numery dla sześciu kolejnych tygodni. Znajdują się one w arkuszu „Układ”.
Arkusz „Miesiąc” (zmieniłem oryginalną nazwę), zawiera grafik, który pobiera właściwe numery z tabeli w arkuszu „Układ”. Podczas pobierania usuwane są znaki „#” oraz zamieniany jest kod „xxx” na 126-132
Pod grafikiem znajdują się dodatkowe liczby pomocnicze (można je ukryć), które wyznaczają numer tygodnia, z którego będą pobierane dane w danej kolumnie grafiku,
W obszarze grafiku zdefiniowane są dwa formatowania warunkowe. Pierwsze, w zależności od miesiąca i układu dni, koloruje te pozycje grafiku, które nie są wykorzystane.
Drugie wyświetla czerwone tło w sytuacji, kiedy pole grafiku zawiera błąd. Tak się może zdarzyć, gdyż przy działaniu na liczbach losowo generowanych może się okazać, że nie można wylosować numeru pokoju.
Aby wylosować ponownie numery, należy skorzystać ze skrótu klawiaturowego CTRL+SHIFT+F9 i ewentualnie powtarzać to do aż do uzyskania pożądanego rezultatu.
Robiłem różne podejścia do tematu, dlatego załącznikiem jest wersja 5.