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

Excel - wybór danych i sortowanie

Lempik 17 Lis 2011 10:42 3372 8
  • #1 17 Lis 2011 10:42
    Lempik
    Poziom 10  

    Pierwsze to nie wiem, czy temat jest odpowiedni do problemu.

    Potrzebowałbym pomocy przy zrobieniu pewnej rzeczy.
    Opiszę to na przykładzie koszyka z owocami.

    Mam dane w paru kolumnach. Kol. A nieistotna, kolumna B opisuje owoce (jabłko, cytryna, kiwi itp.), w kol. C jest unikatowy numer (dla każdego owocu, np. j1, j2, jx, ct1 ...), a kolejna (D) podaje ich wagę (0,21 kg, 0,03 kg), (reszta kolumn mało istotna).

    W jakiejś komórce na początku arkusza jest liczba(y), która opisuje pojemność koszyka w kilogramach (wersje o jednakowej pojemność wszystkich i/lub o różnych pojemnościach).

    W jaki sposób można wypełnić koszyk dostępnymi owocami, żeby zostało w nim jak najmniej wolnego miejsca?
    A czy daną ilość owoców (wybrany przedział komórek) można podzielić na parę koszyków, ale z tym samym warunkiem, żeby koszyki zostały uzupełnione ('prawie') do pełna?
    I teraz w użyciu jest numer unikatowy, który zostanie wypisany przez podziale, tzn. koszyk 1 (o poj. 5 kg) zawiera: j3, j5, ct2, ctx ... - zostało wolnego miejsca 0,004 kg. Koszyk 2 (o poj. 5 kg.): j1, j2, j4, ct1 ... - zostało 0,01 kg.
    W wersji rozszerzonej (z różnymi pojemnościami) koszyk 3 (poj. 8 kg): kw1, kw2, j6 ... - zostało 1 kg.

    Prosiłbym o jakieś propozycje wykonania tego.
    Czy można to załatwić na funkcjach i warunkach, czy potrzebne jest makro?

    0 8
  • #2 17 Lis 2011 12:32
    adamas_nt
    Moderator Programowanie

    Należałoby wykonać sumowanie wszystkich kombinacji i wybrać tę najbliższą lub równą liczbie określającej wagę koszyka. Niestety, arkusz jest dwuwymiarowy i trudno wyobrazić sobie tablicę dla 20 różnych pozycji.
    Dla przykładu: tabliczka mnożenia działa na dwóch liczbach (od 1 do 9). Wyobraź sobie lub spróbuj zapisać "tabliczkę mnożenia" dla trzech liczb!
    Pozostaje VBA i tablica wielowymiarowa. Maksymalna ilość to 60 (dla VB6). Oczywiście każdą pętlę można ograniczyć na kilka sposobów w celu ograniczenia czasu działania makra. W każdym wymiarze szukasz sumy >wagi koszyka i zapisujesz w kolejnej tablicy (jednowymiarowej) poprzedni wynik. Po posortowaniu tablicy wynikowej, pierwsza pozycja będzie tym, czego szukasz...

    0
  • #3 17 Lis 2011 14:01
    Lempik
    Poziom 10  

    A czy przy zmniejszeniu wymogów, np. wzięciu pod uwagę tylko jednej poj. koszyka nie można tego uprościć do dwóch wymiarów? Albo jak bardzo należałoby uprościć, żeby skorzystać z funkcji.

    Nie mam pojęcia w VBA, więc próby robienia czegoś w tym nie udadzą mi się.

    0
  • #4 17 Lis 2011 14:26
    marek003
    Poziom 40  

    Jeżeli ręcznie przedstawisz wszystkie kombinacje można to zrobić i w excelu formułami. Istnieje tylko bardzo duże prawdopodobieństwo że się pomylisz (zapomnisz jakiejś kombinacji.

    Im więcej masz j1,j2,... kw1,kw2... itd tym więcej kombinacji.

    W załączeniu przykład dla czterech owoców (dla większej ilości to naprawdę dość żmudna robota)

    0
  • #5 17 Lis 2011 16:53
    Lempik
    Poziom 10  

    To fakt, jest to średnio wykonalne, tym bardziej, że chciałem to zrobić nie dla "jednego talerza z owocami', a dla małego warzywniaka.
    A możecie mnie trochę nakierować, jak zabrać się za obsługę tego za pomocą VBA.

    0
  • #6 17 Lis 2011 19:02
    adamas_nt
    Moderator Programowanie

    :arrow: marek003 Brakuje jeszcze czterech "pojedynczych" kombinacji. Każdy sort może ważyć tyle co koszyk zmieści. Przynajmniej w teorii...
    Excel - wybór danych i sortowanie

    Może zadziałać metodą zapisu ostatniej dopasowanej. Do tablicy zapisywana byłaby ostatnia pasująca liczba i odpowiadająca jej kombinacja symboli. Tzn:

    Sprawdzam pierwszą liczbę j1. Jeśli >koszyk next, Jeśli =koszyk zapisuję (wagę i "kombinację", pojedynczą w tym przypadku), dodaję 1 do indeksu tablicy i next, jeśli <koszyk, zapisuję bez zmiany indeksu, wchodzę w następną pętlę i dodaję j2, sprawdzam metodą j.w. Jeśli > dodaję 1 do indeksu (mam już zapisane <), jeśli = zapisuję i indeks+1 i tak dalej aż do końca zakresu we wszystkich pętlach.

    W wyniku mam tablicę, w której wystarczy znaleźć najlepszą kombinację lub te, które są =koszyk. Lub wyniki zapisywać w arkuszu i wykorzystać formuły kolegi marek003.

    0
  • #7 17 Lis 2011 19:52
    marek003
    Poziom 40  

    adamas_nt napisał:

    marek003 Brakuje jeszcze czterech "pojedynczych" kombinacji. Każdy sort może ważyć tyle co koszyk zmieści. Przynajmniej w teorii...

    Jak wracałem do domu to też sobie to uświadomiłem ale dopiero teraz mogłem przysiąść przy kompie. Potwierdza to jednak fakt że łatwo się można w zestawieniu wszystkich możliwości obliczeń przy większej ilości danych pogubić.

    Co do głównego założenia jeżeli miałby to być warzywniak to nie wiem czy nawet te 60 wymiarów by wystarczyło. A jeżeli już to ile by trwały obliczenia.

    :arrow: adamas_nt niby taki zapis pętli mógłby być ... ale to też pewien "jeden" wymiar bo w podobny sposób trzeba by było zrobić drugą tabele (drugi wymiar) zaczynając identyczną procedurę ale od j2. itd.
    Chyba że coś źle zrozumiałem.
    Jeżeli pamiętasz dawno na forum było podobne zadanie by zrobić programik który po podaniu liczby znajdzie ze zbioru różnych liczb te liczby których suma da szukaną liczbę (Taka pomoc dla księgowych gdy różnią się salda na koncie a różnica nie jest pojedynczą liczbą). Pamiętam że dodanie kolejnej liczby do sumy (czyli że suma może się składać z trzech liczb, następnie z czterech itd.) bardzo mocno komplikowało procedurę.


    Lempik napisał:
    A możecie mnie trochę nakierować, jak zabrać się za obsługę tego za pomocą VBA

    Sama wiedza o VBA to jedna rzecz (ważna ale nie najważniejsza) trzeba się jeszcze trochę orientować w jakimkolwiek programowaniu. Chodzi mi o pętle, warunki, tablice [i to wielowymiarowe], zmienne. Nie chcę cię zniechęcać ale początek nauki z VBA zaczął bym od prostszych przykładów a nie tak jak w tym przypadku.

    A może ograniczyć że w koszyku nie może być więcej niż np pięć sztuk warzyw. Ograniczy to ilość możliwych rozwiązań zmniejszy czas obliczeń a co najważniejsze procedura będzie jeszcze w miarę czytelna (pętla w pętli będącej w kolejnej pętli itd)

    0
  • #8 17 Lis 2011 19:59
    adamas_nt
    Moderator Programowanie

    Hmm, to może zamiast pamiętać wszystkie sumy zapisywać ostatnią pasującą? Myślę o czymś takim (załącznik). To z wspomnianego tematu (jakieś kody z promocji), też mi się przypomniało...

    Edit: konieczna była jednak "drobna" przeróbka. Zmieniłem załącznik.

    0
  • #9 31 Sty 2012 10:01
    Lempik
    Poziom 10  

    Trochę późno odpowiadam, ale myślę, że temat może zostać zamknięty.
    Podane rozwiązania sprawdzały się, ale niestety tylko dla niewielu kombinacji.

    0