Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel VBA Wariacja bez powtórzeń na tablicach

pd4 14 Maj 2015 12:40 990 12
  • #1 14 Maj 2015 12:40
    pd4
    Poziom 8  

    Jakis czas temu prosiłem o pomoc przy stworzeniu wariacji bez powtórzeń
    wszystko działa pięknie jednak zbyt wolno, postanowiłem stworzyć coś podobnego jednak przy pomocy tablic

    wiec aby sobie to łatwo wyobrazić przyłóżmy że wiersze to nieznana dla nas liczba lat, a kolumny to hmm 5 rodzajów owoców, natomiast poszczególne komórki to zbiory danego owocu w danym roku, chce stworzyć makro które znajdzie 5 lat dla których suma zbiorów każdego z rodzaju owoców będzie równe 15

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    w pewnym momencie podczas pisania nieco sie potraciłem i nie jestem pewny czy trzyma sie to kupy, na pewno mam problem z stworzeniem tablicy której liczba wierszy jest liczba niepustych, możliwe że pokopałem też coś w kodzie, prosiłbym o sprawdzenie i ewentualne uproszczenie w celu przyspieszenia kodu, z góry dzięki :)

    0 12
  • #2 14 Maj 2015 19:59
    pd4
    Poziom 8  

    Widzę że droga na łatwiznę mi nie wyjdzie xD no nic, trzeba było spróbować :P
    to może po kolei, czy jest ktoś w stanie pomóc mi stworzyć tablice której liczba wierszy to liczba niepustych komórek a liczba kolumn jest równa 5? na moje oko to będzie tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    szkopuł w tym że Excel ma odmienne zdanie xD

    0
  • #3 14 Maj 2015 20:30
    NAXIN
    Poziom 22  

    Cytat:
    czy jest ktoś w stanie pomóc mi stworzyć tablice której liczba wierszy to liczba niepustych komórek a liczba kolumn jest równa 5?

    Tak.
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    option base 1 -> liczy elementy tablicy od 1 a nie od 0 (bardziej czytelne w Twoim przypadku to będzie)

    0
  • #4 14 Maj 2015 20:36
    marek003
    Poziom 40  

    Źle definiujesz tablicę - tak nie można.

    Na początku tylko ją zadeklaruj:
    Dim tablica() As Double

    Następnie jak już makro przypisze wartość do zmiennej "wiersz" (wiersz musi mieć jakąś wartość) to dopiero wtedy ją przedefiniuj:
    ReDim tablica(1 To wiersz, 1 To 5)

    I dopiero wtedy z niej korzystaj - patrz przypisanie wartości do AA itd.

    I jeszcze jedna rzecz :
    w twoim przypadku zmienna ws jest niepotrzebna i niepotrzebnie zajmuje pamięć (tym bardziej że na koniec procedury jej nie zerujesz.
    od razu dla wiersz wpisz:

    wiersz = Worksheets("sheet").Cells(Rows.Count, 1).End(xlUp).Row



    ---------------
    Widzę że się trochę spóźniłem :) aczkolwiek ja piszę trochę o czymś innym (podstawy deklaracji zmiennych).

    0
  • #5 15 Maj 2015 14:01
    pd4
    Poziom 8  

    Dzięki, naniosłem poprawki i makro wygląda w ten sposób:

    1 czesc:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Do tego miejsca wydaje sie byc wszystko OK


    2 czesc, czyli pętle z którymi nie mogę sie uporać
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    bez ostatniej pętli zmienne a-e nie zmieniają swoich początkowych wartości, nie moge zlokalizować przyczyny, pewnie znow bedzie nia jakis glupi blad

    no i 3 czesc, która zapisuje 5 naszych wyników
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    jest ktoś w stanie zobaczyć i ewentualnie poprawić '2 część' makra?

    0
  • #6 15 Maj 2015 15:18
    marek003
    Poziom 40  

    Wiesz co wziąłeś się za makro nie do końca chyba rozumiejąc zasady.
    Pierwsza część:

    Po co to, jak jeszcze nie wprowadziłeś żadnych danych do tablicy:
    AA = tablica(a, f)
    BB = tablica(b, f)
    CC = tablica(c, f)
    DD = tablica(d, f)
    EE = tablica(e, f)

    Wszystkie wartości tych zmiennych (AA BB itd.) będą puste.


    Druga rzecz

    Wydaje mi się że nie te pętle zastosowałeś bo jak będzie wierszy więcej niż 5 makro w ogóle nic nie zrobi a jak mniej to się wykrzaczy na definicji tabeli.

    a biorąc pod uwagę część pierwszą (załóżmy że były by inne pętle)



    If AA + BB + CC + DD + EE = 15 Then tu zawsze będzie 0 więc nie wejdzie w warunek tylko w else nadając kolejne wartości zmiennym tyle razy ile jest wierszy.
    I tak w kółko zmieniając co chwila nie wiadomo po co parametry a, b, c, d, e



    A właściwie tylko po to by spróbować wyjść z głównej pętli Do ale żeby to przeanalizować kiedy na raz ten warunek jest spełniony no to trochę trzeba posiedzieć.

    I ostatnia część
    Może i dobrze będzie działać jak już wyjdzie z pętli ale nie mamy pliku jakie dane są kopiowane i właściwie nie wiadomo po co więc ciężko doradzić.

    Może zrób na razie wszystko tylko dla jednego roku. Jak zadziała wprowadź następne pętle - tak po kolei aż dojdziesz do ostatniego roku.
    To jest metoda małych kroków a w twoim przypadku warto to rozważyć.

    0
  • #7 15 Maj 2015 16:23
    pd4
    Poziom 8  

    Oczywiście że dane są wpisane, jednak nie zależy mi tyle na rozwiązaniu konkretnego przykładu, co na uzyskaniu makra do rozwiązywania podobnych problemów, już załączam plik: Owoce

    0
  • #8 15 Maj 2015 19:58
    marek003
    Poziom 40  

    Na przyszłość załączaj pliki tutaj pakując je zipem lub rarem.
    "Wariacje bez powtórzeń" i inne miałem ok 20 lat temu.
    Powiedz po polsku jaki ma być wynik - co ma robić makro na podstawie tego przykładu co przedstawiłeś.

    0
  • #9 16 Maj 2015 14:50
    pd4
    Poziom 8  

    Ok, dzięki za pomoc, problem rozwiązany :)

    0
  • #10 16 Maj 2015 15:39
    marek003
    Poziom 40  

    Nie no, już się myślowo zaangażowałem :) ale może i lepiej bo muszę uciekać.

    Pokaż jak żeś to rozwiązał bo powiem że (wg twojego wcześniejszego opisu) nie było to zbyt proste. Między kolumnami też trzeba było się tak "bawić" jak w samej kolumnie A?

    0
  • #11 16 Maj 2015 16:38
    pd4
    Poziom 8  

    Byłem pewny że po zmianie wartości zmiennej a z automatu zmieni się tez wartość zmiennej AA która zawiera zmienną a, a okazało się że nie do końca i to był jeden z moich największych błędów

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Zgaduje że nie jest to najlepsze rozwiązanie ale o dziwo działa, do pełni szczęścia potrzebuje zmienić równanie na nieco bardziej skomplikowane, zawierające między innymi odchylenia standardowe i kilka innych zmiennych ale to już powinno być z górki, jeśli ktoś byłby w stanie nieco przyśpieszyć działanie tego makra to byłbym bardzo wdzięczny :)

    0
  • #12 16 Maj 2015 16:49
    NAXIN
    Poziom 22  

    Kawał kodu. Serio to szybciej działa niż na zwykłym arkuszu bez makr? Masz jakieś porównanie wydajnościowe?

    0
  • #13 16 Maj 2015 17:30
    pd4
    Poziom 8  

    Nie mogę jeszcze porównać szybkości, ale wcześniejsze makro które działało na podobnej zasadzie z tym, że wplecione w nim było bardzo dużo działań na arkuszach, w sensie kopiowania wartości komórek z jednego arkusza, wklejanie do innego, sprawdzanie czy pasuje i tak w koło, co podobno brało bardzo dużo mocy obliczeniowej, było w stanie przerobić około 30tys kombinacji na minute, co dla mnie było nie wystarczające bo w momencie kiedy chcesz wybrać z 10 tylko 5 pozycji wówczas arkusz jest w stanie przerobić nawet do 100 000 kombinacji, a wyobraźmy sobie że pula z której chcemy wybierać jest większa lub liczba pozycji które chcemy znaleźć jest większa, wówczas liczba kombinacji diametralnie wzrasta, mam nadzieje że liczba kombinacji które to makro jest w stanie przerobić będzie większe chociaż kilkukrotnie

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo