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

Excel - losuj (kilka warunków) wyższa szkoła jazdy

21 Sty 2012 17:36 4694 17
  • Poziom 13  
    mam taką zagwozdkę wiem że w excelu są funkcje LOS i RANDBETWEEN za pomocą których można użyć funkcji losowych natomiast co w przypadku kiedy trzeba spełnić kilka warunków czy jest to wogóle możliwe do zrealizowania

    chcę przeprowadzić takie oto losowanie które spełniało by pewne warunki zarówno w pionie jak i w poziomie tj. wartości w kolumnach i wierszach

    mam przedział 0 - 9 oraz litery "X";"U";"A"- gdzie litera "A" jest traktowana jako 10
    ma losować w wierszach liczby rosnące, pomiędzy jeśli jest X lub u w wierszu to nie może wylosować pewnych liczb

    natomiast w kolumnach liczba wylosowanych cyfr liczonych zawsze jako 1 da nam zakres pomiędzy (srednia "-";"+" jakaś liczba)

    czy to jest wogóle możliwe do zrealizowania
    w załączniku plik
  • Poziom 28  
    Jakoś z Twojego opisu nie mogę pojąć zasady losowania.
    Cytat:
    ma losować w wierszach liczby rosnące, pomiędzy

    pomiędzy czym?
    Cytat:
    nie może wylosować pewnych liczb

    ile i jakich?
    Zachowanie warunków z pliku jest może i proste ale...
    dla autora.
    Cytat:
    czy to jest wogóle możliwe do zrealizowania

    z dotychczasową wiedzą nt. założeń...
    nie wiem.

    Edit:
    A tak na marginesie, to chcesz wypełniać całą tabelę (wygląda jak grafik)? Jeżeli tak to stawiam na VBA. Będzie łatwiej.
  • Poziom 13  
    dobrze wydedukowałeś jest to grafik :

    teraz zrobiłem kilka arkuszy pomocniczych które mi sprawdzają założone warunki tj.
    czy zmiana jest rosnąca 0,1,2,3,4,5,6,7,9,A
    pomiędzy X-wolne lub U-urlop jest zachowana zmiana z przerwa 35h + sprawdza w zadanym okresie czy jest przerwa 35h
    czy co najmniej co 4 ND jest wolna
    i jeszcze kilka innych kryteriów ale to wszystko sprawdza się po wpisaniu zmian, a gdyby tak się udało wylosować te zmiany przy założeniu pewnych parametrów byłoby cudownie i tutaj ponieważ leże jeśli chodzi o VBA założyłem ten wątek może drogą krokową udałoby się pośrednio coś takiego stworzyć.

    zrealizowałem pomysł na spradzanie tych parametrów natomiast nie potrafię odwrócić niejako sytuacji i wdrożyć to do funkcji losuj po pewnych kryteriach.
  • Poziom 28  
    Wrzuć przykład z rozszerzeniem .xls :D
  • Poziom 13  
    plik w pierwszym poście powinien częściowo wyjaśnić moje założenia
    może krokowo to rozwiązać nie wiem

    1 przedział do losowania to (0,1,2,3,4,5,6,7,8,9,A,X)
    warunki:
    każda kolejno wylosowana cyfra lub litera musi być równa lub większa od poprzedniej
    w 7 kolejnych wierszach musi pojawić się X - który da nam 35h przerwy jeśli jest X w którymś wierszu to losując kolejny wiersz musi sprawdzić jaka jest cyfra lub litera przed X i wtedy może wylosować też tylko kilka z nich to pokazuję tabelka na niebiesko czyli jaka cyfra jest przed X taka może pojawić się po X żeby dało to 35h przerwę

    to takie pierwsze założenia.

    co do mojego rozwiązania które przedstawiałem to było sprawdzanie za pomocą funkcji jeżeli i tworzenie dodatkowych tabelek ale to tylko sprawdzało grafik pod kątem błędów a nie LOSOWAŁO w jakikolwiek sposób zmian, ten plik gdzie była w.w weryfikacja mam go w pracy niestety.
  • Poziom 28  
    A tak trochę wolniej, bo mój starczy umysł nie nadąża i powoduje przeciążenia. :D Po kolei to co pojąłem:
    - że grafik - wiem (sukces) :D
    - w kolumnach dni miesiąca
    - w wierszach człowieki
    - na skrzyżowaniach praca/wolne (ale błyskam) :D
    - X dzień wolny
    - U urlop
    - C L4 (się znaczy leń czterokrotnie potwierdzony przez lekarza) :D
    - A nie kumam (nie pojawiło się nawet raz w całym grafiku)
    - poszczególne cyferki nie kumam (godziny czy cóś)
    Nijak nie kumam z:
    Cytat:
    w 7 kolejnych wierszach musi pojawić się X

    chodzi o wiersze czy kolumny?
  • Moderator Programowanie
    Hmm, już się wystraszyłem że jakiś ciemnawy jestem...
    Żaden problem z napisaniem funkcji użytkownika czy cóś, ale... o co chodzi?
  • Poziom 28  
    :arrow: adamas_nt
    To jest nas dwóch. :D (ale ja przyznałem się pierwszy)
    Obstawiam, że funkcja (nawet osobiście napisana) działająca na jednej komórce traci tu sens istnienia. Myślę, że trzeba zadziałać w VBA na całym zakresie grafiku, czyli na 31 dniach. Zawsze w przypadku krótszego miesiąca końcówkę można obciąć. Patrząc na rzeczony plik wnioskuję, że przy ustalaniu zmian dzień tygodnia nie ma znaczenia. Jednym z problemów, który już widzę (a wcale nie musi być problemem) to właściwe ustalenie zmian na początku miesiąca (coby grały z tymi z końca poprzedniego).

    :arrow: nao1
    Potrafisz Ty zagmatwać opis. :D
  • Poziom 13  
    C = A złe oznaczenia w grafiku
    zagmatwać chyba tak ale to z racji złożoności problemu może tu jest pies pogrzebany.
    może spróbuję jeszcze raz od początku z podaniem tylko założeń jakie musi spełniać grafik z pominięciem nazewnictwa i mojej osobistej kombinatoryki

    więc tak co następuję

    aby nieco ułatwić i wykluczyć wpisywanie pewnych założeń do ewentualnego kodu VBA.
    wpisuję ręcznie do grafiku
    - urlopy
    -dni wolne
    - wolną niedzielę ( w/g kryteriów że co 4 maks. musi być wolna)

    co pozostaję wypełnić grafik odpowiednimi zmianami ( zmian w grafiku 10 ) z tym że tu są pewne kryteria i tak :
    1. zmiany są rosnące (przykład zmiana 1 (12-20) zmiana 2 (13-21)), więc pracownik nie może przyjść ze zmiany 2 na 1

    2. w każdym m-cu są tzw. okresy (7 dniowe)( czyli musimy gdzieś definiować te 7 dniowe okresy ) w których pracownik musi mieć przerwę 35h pomiędzy zmianami w prosty sposób można otrzymać dając mu dwa X -offy ale nie zawsze tak można gdyż szybko wyczerpała by się pula ilości dni wolnych dla danego miesiąca więc proste kryterium w którym mając zmianę
    np: 4.( 15-23 ) - dnia 02.01 | X - dnia 03.01 | 04.01 może przyjść najwcześniej na zmianę godz 10:00

    3. ilość zmian jest ograniczona i powinna być rozłożona równomiernie z dominującymi 2 czy 3 zmianami to kryterium musiałoby być liczone skolei nie dla pracownika(wiersz) tylko dla danego dnia tj. po kolumnie

    domyślam się że jest mocno skomplikowana sprawa, i nie jestem w stanie do końca uwierzyć w możliwość jej realizacji gdyż sam definiując sprawdzanie tych kilku parametrów tworząc tabelki pomocnicze z użyciem funkcji jeżeli miałem nie lada zagwozdkę a tu stworzenie funkcji losuj dając kilka parametrów komplikuję się sprawa b.mocno

    pozdrawiam
  • Poziom 28  
    Rozwiewając dalej swoje wątpliwości:
    - C=A=10
    Cytat:
    w 7 kolejnych wierszach musi pojawić się X

    - to jednak kolumny
    - podaj przypisanie godzin do numerków (trochę to ułatwi myślenie)
    Cytat:
    przykład zmiana 1 (12-20) zmiana 2 (13-21)), więc pracownik nie może przyjść ze zmiany 2 na 1

    - myślę, że może, ale nie chcesz płacić za jedną nadgodzinę (durny przepis mam to samo z kierowcami) :D
    Cytat:
    nie jestem w stanie do końca uwierzyć w możliwość jej realizacji

    Nie poddawaj się tak łatwo. Uwierz w siebie i siłę Excel-a. VBA czyni cuda (z grami i oglądaniem filmów w arkuszach włącznie) więc co to dla niego zwykłe cyferki do obróbki których został stworzony? Przy zaprojektowaniu dobrze działającej zabawki niezbędna jest jednak szersza znajomość zagadnienia, co (tylko nie próbuj więcej gmatwać :D) zależy tylko i wyłącznie od Twoich tutaj zeznań. Jestem pewien, że kilka tęgich głów przewijających się ciągle przez to forum (nie wymienię nikogo :cry:) będzie na tyle zainteresowane, że rozwiązanie się znajdzie. Ze swej strony mogę obiecać, że jak tylko zrozumiem w 100% ideę postaram się pomóc w miarę swych niewielkich (czytaj podpis nad moją fotką) umiejętności.
  • Poziom 28  
    To tak na wstęp do Twojego projektu. Czas mi nie bardzo pozwala na poważniejsze zagłębienie się w zabawę. Losowanie odbywa się na Arkusz1 dla Pracownik_1. Makro w Moduł1. Nie jest to całkowite rozwiązanie problemu a tylko początek. Trzeba trochę pokombinować ze sprawdzaniem zmian. Później trzeba też będzie dorobić warunek sprawdzający wystąpienie zmiany w kolumnie. Niewiele, ale od czegoś trzeba zacząć. :D
  • Poziom 13  
    Witam

    Dziękuję przede wszystkim za odzew w tej sprawie.
    niestety jeśli chodzi o VBA to jak już w którymś z postów wspominałem jestem praktycznie rzecz biorąc zupełnym laikiem i nie udźwignę tego tematu.

    niemniej jednak liczę na wyrozumiałość i pomoc forumowiczów w tejże sprawie mając nadzieję że ktoś podejmie się kontynuowania zagadnienia podjętego przez walek33

    pozdrawiam serdecznie.
  • Poziom 40  
    Tematowi już parę razy się się przyglądałem jednak "zawiłość" tematu wpływa na czas jaki można temu poświęcić - a nie mam go za dużo.

    Wbrew pozorom wcale nie kierował bym się w tym przypadku żadnym losowaniem tylko normalną kolejnością zmian przy spełnieniu określonych warunków (kolejna wyższa - najbliższa z możliwych - jak nie ma możliwości wyższej zmiany to wolne. i od nowa. Oczywiście przy każdym wstawieniu liczby sprawdzenie kolumny i ewentualna jej wymiana na kolejną. (wiem że łatwo się mówi ... )

    Jak widzę jest też paru pracowników "uprzywilejowanych" którzy mają prawie cały czas tą samą zmianę -pracownik 8 i 22. (Czy to może przypadek). W takim przypadku z ręki wstawiasz wcześniej zmiany?.

    Mógłbyś zamieścić jeszcze plik z tymi tabelkami które sprawdzają grafik z jakimś "spokojnym" ich wyjaśnieniem, co dana rzecz sprawdza i w jakiej kolejności sprawdza. To może dużo pomóc w rozwiązaniu problemu.


    I jak byś mógł opisać jak to robisz do tej pory ręcznie.
    To też może pomóc w automatyzacji, a przynajmniej usystematyzuje problem. (No chyba że to czysty chaos: przypadkowe wybieranie zmiany i sprawdzanie w tabelkach/warunkach sprawdzających czy pasuje)

    1. Rozumiem że najpierw wstawiasz urlopy U (na to program ma nie mieć wpływu)
    2. potem wstawiasz co czwartą niedzielę X
    3a wstawiasz zmiany dla pracowników "uprzywilejowanych"
    i tu podaj prawidłową kolejność:
    3b. ustawiasz dla każdego pracownika 35H wolnego w tygodniu
    4. wstawiasz losowo (?) trzy "0" od pierwszej do ostatniej kolumny (z ewentualnym uwzględnieniem zmiany 0 jeżeli była przyznana pracownikowi "uprzywilejowanemu")
    5. wstawiasz losowo (?) cztery "9" od pierwszej do ostatniej kolumny (z ewentualnym uwzględnieniem zmiany 9 jeżeli była przyznana pracownikowi "uprzywilejowanemu")
    6. wstawiasz losowo (?) dwa "A" od pierwszej do ostatniej kolumny (z ewentualnym uwzględnieniem zmiany A jeżeli była przyznana pracownikowi "uprzywilejowanemu")
    7. wstawiasz losowo (?) po jednej od "1" do "8" od pierwszej do ostatniej kolumny(z ewentualnym uwzględnieniem zmian 1-8 jeżeli były przyznane pracownikowi "uprzywilejowanemu")
    8. wstawiasz losowo (?) "X" od pierwszej do ostatniej kolumny by dobić do średniej ilości pracowników w dniu (od czego zależy ta średnia? czy to w miarę stała liczba? bo nie koniecznie to z przedstawionego grafiku wynika.)
    9. zaczynasz sprawdzać poszczególnych pracowników (w wierszach) i w pustych miejscach (gdzie nie ma zmian wstawiasz co pasuje z zakresu 1-8 ostatecznie 9

    Dokonujesz ostatecznego sprawdzenia (które masz załączyć)

    Coś jeszcze? Inaczej?
    Możesz się rozwinąć w opisie. Nie żałuj sobie. Forum przyjmie wszystko - choć może nie wszyscy będą chcieli czytać :)
  • Poziom 28  
    Cytat:
    Forum przyjmie wszystko - choć może nie wszyscy będą chcieli czytać

    Ci, którzy nie będą chcieli pomóc nie muszą czytać. Wydaje mi się, że podejście w poście powyżej jest rozsądniejsze niż losowanie. Rnd() zwraca liczby "losowe" z tym, że ustawienie warunków sprawdzających jest w Twoim przypadku naprawdę skomplikowane. Kiedyś bawiłem się w losowanie cyferek do Sudoku. Prawie ładnie mi to wyszło, ale podkreślam prawie. Poddałem się i zastosowałem inną metodę doboru cyferek. Powodem było... "never ending macro" przy losowaniu końcówki (wcale nie znaczy, że chodziło o ostatnią) cyfr. Co do grafików, to metoda losowa nie powinna być w nich stosowana. Moim zdaniem (a także co niektórych mądrzejszych głów) zmiany powinny odbywać się cyklicznie. Wtedy pracownik ma możliwość nawet nie patrząc w grafik policzyć kiedy w jakich godzinach pracuje, kiedy ma dzień wolny i zaplanować sobie prywatne życie z lekkim wyprzedzeniem. Myślę, że (sam tak robię) jednorazowe zaplanowanie jakiegoś okresu (to wymaga trochę nakładu pracy) a potem tylko kopiowanie i tym sposobem tworzenie następnych powtórzeń nie jest wcale najgorsze. Pozostaje kwestia urlopów, ale one mają to do siebie, że zastępują dni robocze, więc wcale nie muszą zmieniać cyklu pracy.
  • Poziom 13  
    Witam
    byłem nieco zapracowany umieszczam plik w którym korzystałem z pomocniczych tabelek do sprawdzania 35h przerwy, co 4 niedzieli wolnej, zmian rosnących itd
    może to naświetli jeszcze dokładniej bolączki z którymi muszę się zmagać

    Pozdrawiam zainteresowanych i ewentualnych inicjatorów wszelkiej udzielonej pomocy w tej materii

    Dodano po 2 [minuty]:

    tu załącznik :)
  • Poziom 40  
    Ok. mniej więcej wiemy jak sprawdzasz ale dalej nie wiemy jak tworzysz ten "NEW". Zerknij na wypunktowania w moim poprzednim poście.
  • Poziom 13  
    Jak tworzę new

    Dla jednego pracownika ( patrząc po wierszach )

    1. U - wprowadzam urlopy
    2. X - wprowadzam wolne ( wprowadzając dwa X w tygodniowym okresie rozliczeniowym mam pewność ze ma 35h wolnego ) wprowadzając 1 X korzystam z tabelki na dole (arkusz NEW ) która tez daje 35 h wolnego.
    3. po wpisaniu X i U uzupełniam puste miejsca zmianami z zachowaniem zmian rosnących

    Dla danego dnia ( patrząc po kolumnach )

    1. równoważę ilość X tak by frekwencja w jednym dniu nie dała mi zbyt dużej liczby pracowników lub zbyt małej
    2.wprowadzam zmiany trzymając się klucza 3x0 ; 4x9; 2xC pozostałe zmiany uzupełniam tak by wyczerpać wszystkie pozostałe zmiany, jeśli nadal są puste miejsca uzupełniam dowolną zmianą spoza zmian (0 ; 9 ; C )

    Pozdrawiam