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.

zmienna opisująca położenie komórki VBS

elwis_85 20 Sty 2011 17:46 1572 10
  • #1 20 Sty 2011 17:46
    elwis_85
    Poziom 9  

    witam Was serdecznie ;)
    Mam problem ze zrealizowanej pewnego makra. Postaram sie opisać w jaki sposób program ma działać na bardzo uproszczonych danych. Poniżej zamieściłem również prezentacje graficzną tego co ma zrobić makro.

    Na wstępie jedno podstawowe pytanie: skąd Wy bierzecie różnego rodzaju wymyślne funkcje, z jakich materiałów korzystacie? ja jako początkujący mam sporo pomysłów jakie zadanie powinien realizować program ale nie potrafie je nazwać funkcją (tak szczerze to swobodnie czuje się tylko w prostych pętelkach które są porostu logiczne)

    Program domyślnie ma działać na znacznie bardziej rozbudowanej bazie danych ( jednocześnie kilka arkuszy, poza datami jeszcze godziny itd.)
    Chce aby z wyjściowej bazy danych powstawało zestawienie (patrz foto), "informacje" uszeregowane względem dat w których "informacja" ma miejsce" z podziałem na GRUPY i do tego właśnie będzie mi potrzebne sczytanie wiersza w jakim znajduje się napis "grupa B" patrz zdjęcie.

    ZDJĘCIE NAJPROŚCIEJ PREZENTUJE DZIAŁANIE PROGRAMU
    zmienna opisująca położenie komórki VBS

    teraz może przedstawię swoją wizje programu

    1. wyszukanie komórki o wartości = "grupa B" i i sczytanie wiersza w jakim ta wartość występuje ( dzięki temu wiem do jakiego wiersza jest "grupa A"), nazwijmy ta zmienna "wiersz"
    2 wyszukanie wartości minimalnej w zakresie dat "grupy A" (zakres ustalony z wykorzystaniem zmiennej "wiersz"
    3 kopiowanie wartości komórek z "informacjami" zgodnie z datami i przynależnością do grupy A i B

    Nie oczekuje że ktoś napisze mi to od początku do końca, ale będę wdzięczny za wszelkie sugestie, każdą linijkę programu ;)
    Pozdrawiam

    0 10
  • Pomocny post
    #2 20 Sty 2011 18:37
    marcinj12
    Poziom 40  

    Dlaczego nie dasz informacji o grupie w osobnej kolumnie, np. A, dla każdego wiersza? Wtedy bardziej by to przypominało "bazę danych". Chcesz potem wyrzucić harmonogram wszystkich dat czy tylko od jakiegoś dnia, np. od dzisiaj?

    0
  • #3 26 Sty 2011 16:03
    elwis_85
    Poziom 9  

    Na wstępie przepraszam, że tak długo nie odpisałem ale wypadł mi nieplanowany pobyt w szpitalu :/

    marcinj12 napisał:
    Dlaczego nie dasz informacji o grupie w osobnej kolumnie, np. A, dla każdego wiersza? Wtedy bardziej by to przypominało "bazę danych".

    Dane otrzymuje już w takiej formie, na pierwotnym etapie są one robione bardziej pod wydruk niż w stylu bazy danych stąd taka forma zapisu, gdyby przy każdym wierszy była informacja o przynależności do grupy niewątpliwie byłoby łatwiej no ale na takie dobrodziejstwo nie mam co liczyć.

    marcinj12 napisał:
    Chcesz potem wyrzucić harmonogram wszystkich dat czy tylko od jakiegoś dnia, np. od dzisiaj?".

    Harmonogram ma się zaczynać od minimalnej daty znajdującej się w bazie danych i kończyć na maksymalnej. Czyli wszystkie daty trzeba uwzględnić. Ps. dzięki za zainteresowanie tematem ;)

    Najklarowniej działanie programu prezentuje zdjęcie (patrz 1 post), postaram się jednak opisać mój zamysł:
    zarys programu napisał:
    dim wierszgrupy as integer ' powyżej tego wiersza jest grupa A a poniej grupa B
    dim wiersz as integer ' wiersz który w danej pętli będzie kopiowany
    dim data as date ' data wykorzystywana w aktualnej pętli
    dim datamin as date ' najmniejsza data występująca w bazie danych
    dim datamax as date ' największa data występująca w bazie danych


    datamin= MIN(C:B)
    datamax= MAX(C:B)
    data= datamin ' później ta zmienna będzie się zwieszała o jeden przy każdej kolejnej pętli

    wiersz = 3 ' od tego wiersza zaczynają sie jakiekolwiek "informacje"

    Columns("A:A").Find(What:="grupa B", After:=ActiveCell).Activate

    sczytanie zmiennej która będzie wierszem odnalezionej komórki
    (zmienna "wierszgrupy") - nie mam pojęcia jaka funkcja to realizuje


    do while data <= datamax

    if data >= wsArkusz1.Cells(wiersz, 2).Value and data <= wsArkusz1.Cells(wiersz, 3).Value then

    wpisanie wartości zmeinnej "data" do komórki w arkuszu2

    kopiowanie "INFORMACJI" z wiersza zgodnego ze zmniennną "wiersz" do arkusza2


    if wiersz < wierszgrupy then
    w arkuszu 2 obok wpisanej daty wpisana zostaje treść "grupa A"
    else

    if wiersz > wierszgrupy then
    w arkuszu 2 obok wpisanej daty wpisana zostaje treść "grupa B"
    end if


    end if

    wiersz= wiersz +1
    data= data +1 ' i tu coś w swoim rozumowaniu skopałem bo pierw dla jednej daty pętle powinny przejść przez wszystkie wypisane wiersze arkusza i dopiero potem przejść na kolejną datę, hmm znaczy się powinna być jeszcze jakaś dodatkowa pętla ale szczerze mówiąc nie wiem jaka
    loop
    end sub


    Za wszelkie rady będę wdzięczny

    0
  • Pomocny post
    #4 26 Sty 2011 21:58
    marcinj12
    Poziom 40  

    Zobacz plik z załącznika. Nieco inne podejście, ale generalnie zasada działania taka sama :)

    0
  • #5 08 Lut 2011 18:40
    elwis_85
    Poziom 9  

    Witam
    Takie podejście do programu jest genialne. Przeanalizowałem linijkę po linijce i jestem naprawdę znacznie bogatszy o wiedzę. W własnym zakresie rozbudowywałem sobie ten programik o rożne funkcje ale w dwóch kwestiach napotkałem na problem i nie potrafię go obejść mimo, że przesiedziałem nad tym sporo czasu
    O wspomniane problemy rozbudowałem przykładowy plik z załącznika

    Zmiany w stosunku do pierwotnego przykładu:
    1. dodałem kolejną bazę danych (w kolejnej zakładce Excela) (problem przy sortowaniu)
    2. jedna z baz danych oprócz dat ma jeszcze godziny obowiązywania "informacji"

    Ad. 1
    Załóżmy ze w jednaj bazie są "ważne informacje" w drugiej bazie "informacje podrzędne". Informacje do zakładki "wyniki" kopiowane są wiersz po wierszu, następnie następuje sortowanie 1) po dacie , następnie 2) po grupie i 3) po przynależności od bazy danych (informacja ważna lub podrzędna - przy każdym kopiowanym wierszu umieszczana była informacja z jakiej bazy pochodzi )
    I problem pojawia się już w samym sortowaniu (Patrz załącznik zakładka "błąd w sortowaniu"). Nie mam pojęcia w czym tkwi bład i jak można to rozwiązać.

    Ad. 2
    Chciałbym aby w "wynikach" byłą informacja odnośnie skrajnych godzin w jakich obowiązują "informacje podgrzędne" dla określonej daty i grupy. Nawet nie mam jakiegoś zamysłu jak to zrealizować. (patrz załącznik)

    Moje problemy najlepiej zilustruje przykład w załączniku.

    Będę wdzięczny za jakiekolwiek sugestie bo ręce już mi opadają i nie widzę szans na wybrnięcie z tych zagadnień o własnych siłach.
    Pozdrawiam ;)

    0
  • Pomocny post
    #6 08 Lut 2011 19:59
    marcinj12
    Poziom 40  

    Faktycznie, w moim poprzednim poście z załącznikiem wkradł się błąd, który potem niechcący powieliłeś :) - w komendzie sortowania wpisałem dwa razy Key1=..., podczas gdy powinno być Key1=... i Key2=.... poprawiłem tamten załącznik.

    Natomiast teraz problem z sortowaniem wynika z tego, że jest:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    ,
    a powinno być:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    To rozwiąże problem sortowania.

    Jeżeli chodzi o efekt, który chcesz uzyskać, powinna pomóc zmiana tego, co jest w sekcji With... na to co jest poniżej, dodatkowo, ponieważ informacja z bazy 2 jest ważniejsza niż z bazy 1, sortowanie po kolumnie D musi być malejąco, co uwzględnia pierwsza linijka kodu... Poprawki oznaczyłem komentarzem "poprawka"

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Na wszelki wypadek załączam poprawiony załącznik :)

    0
  • #7 09 Lut 2011 20:01
    elwis_85
    Poziom 9  

    dziękuję za pomoc;)
    Z tymi numerkami przy sortowaniu to powinienem na to wpaść. :P
    Jestem pod wrażeniem tego , że zręcznie upakowałeś w jednej pętelce "If..then" to co ja miałem w dwóch osobnych, widać że teraz trzyma się to kupy.

    Odnośnie godzin to najwyraźniej nie do końca dobrze wytłumaczyłem o jaki efekt mi chodzi. w sumie to ciekawy pomysł z wywaleniem kolumn i przesunięciem kolumn z godzinami w lewo, ja nie wpadłbym na to i kopiowałbym te godziny w ten sam sposób jak przypisywana jest data i grupa.

    Odnośnie godzin to zależy mi na tym aby obok nagłówka o treści "spis podrzędnych informacji" znajdowały się skrajne godziny obowiązywania informacji znajdujących się pod tym nagłówkiem.
    Opisze to na przykładzie "spisu informacji podrzędnych" dla "grupy A" i daty 15-stycznia (patrz na dole zdjęcia w załączniku")
    1. najwcześniej zaczynają się "jakas informacja1" i "jakas informacja3" bo o godzinie 7:00, tak wiec pierwszą skrajną godziną jest 7:00
    2 Najbardziej skrajną godzina końca obowiązywania informacji w tym nagłówku jest godzina 16:00 charakterystyczna dla "jakas informacja3"
    3. obok nagłówka "spis podrzędnych informacji" pojawia się informacja o tych skrajnych godzinach.

    Najlepiej powyższy opis obrazuje poniższe zdjęcie.

    Myślałem o wykorzystaniu komendy sortowania. Najpierw sortowałbym rosnąco godziny początku obowiązywania informacji, wtedy w górnym wierszy miałbym minimalną godzinę; spisanie wartości tej godziny; następnie kolejne sortowanie dla godziny końca obowiązywania "informacjii" tak aby w pierwszym wierszu pod nagłówkiem "spis podrzędnych informacji" znajdowała się najpóźniejsza godzina zakończenia obowiązywania informacji. W praktyce jednak takie sortowanie jest chyba nie realne, w każdym bądź razie nie ma mowy o posortowaniu całego arkusza gdy cześć jest już przebudowana.

    A może dodać jakąś zmienną zliczającą ilość wierszy pod nagłówkiem i w tym zakresie wyszukiwać maks i min godziny...
    zmienna opisująca położenie komórki VBS

    0
  • Pomocny post
    #8 09 Lut 2011 23:49
    marcinj12
    Poziom 40  

    Aha, rozumiem...
    W takim razie musimy ustalić min. i max. godzinę dla każdej "grupy". Poniżej "dopiski" do istniejącego kodu.

    Najpierw kolejny błąd który znalazłem :) Dla grupy B pomija jeden dzień z zapisu, brakuje +1 we 2 miejscach we fragmencie:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    W grupie A jest OK :)


    Zastosujemy w gruncie rzeczy prosty algorytm ustalania minimum i maksimum w serii elementów.

    Zdefiniujmy i zainicjujmy 3 zmienne, które będą przechowywały info o godzinie min, max oraz pozycji (wierszu), w którym będzie wstawiony wynik:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Godzina 00:00:00 jest liczbą = 0, a 23.59.59 jest liczbą = 0,99999...

    I teraz tak:
    1. za każdym razem, kiedy wstawiamy typ informacji, ustawiamy też pozycję wiersza, gdzie potem zapiszemy godziny.
    W tych dwóch miejscach dostawmy 1 linijkę kodu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    ,

    2. Następnie zmodyfikujmy pętlę do..while tak, żeby dla każdego wiersza po którym się porusza, ustalała min/max. godzinę. Na samym początku wstawmy:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    3. w końcu, zaraz pod tym, kiedy wstawiamy "wiersz rozdzielający", tzn. tworzymy nową sekcję, wstawmy godzinę min/max do poprzedniej sekcji oraz wyzerujmy zmienne:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    4. Last and least ;), żeby nie usunąć sobie godziny, nie możemy już czyścić starych informacji "skanując" po kolumnie C, tylko po D. Godziny w każdym wierszu też nam nie będą potrzebne, czyli poprawiamy fragment:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Spróbuj wstawić kod w odpowiednie miejsca samemu, w razie problemów - pisz :)
    PS. Zdjęcia które wstawiasz dużo ułatwiają, inni powinni brać przykład jak pytać na forum ;)

    0
  • #9 10 Lut 2011 20:34
    elwis_85
    Poziom 9  

    Programik śmiga aż miło :) dodałem jeszce funkcje wpisywania godzin w komórki dla warunku :

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    tak w ramach kombinowania próbowałem ustalić zakres za pomocą zmiennych i mi nie wychodziło
    Próbowałem coś takiego:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    zapisać z wykorzystaniem zmiennych "a" , "b" (takich hipotetycznych zmiennych)
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    W sumie to pytań jako początkujący mam sporo, i kolejne napisze już w nowym wątku. Bardzo dziękuję Ci za pomoc, wiele ciekawych funkcji zapadło mi w pamięć, jak np. przypisywanie zmiennym wartości "empty" (a kiedyś tego potrzebowałem na mus i kombinowałem jak koń pod górkę).
    Jeszce raz dziękuje, gdybyś poprawił mnie odnoście zapisu zakresu "range" przy pomocy zmiennych również będę wdzięczny

    0
  • #10 10 Lut 2011 20:49
    marcinj12
    Poziom 40  

    Zakres możesz ustalić przynajmniej na dwa sposoby:
    1. Jeżeli znasz dokładną kolumnę i chcesz mieć bardziej "czytelny" zapis (np. kolumna D od wiersza a do wiersza b):

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    2. Jeżeli kolumna jest zmienna (znasz jej numer, ale nie, literę: zakres od komórki (a, b) do (c, d) ):
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Czy o to chodzi?
    PS. Zawsze lepiej jest dokładnie identyfikować komórkę do której się odwołujesz, np. jak na początku kodu wskazujesz Worksheet:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    ,
    to potem przy podawaniu zakresów zawsze odwołuj się tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #11 17 Lut 2011 09:53
    elwis_85
    Poziom 9  

    Jeszce raz bardzo Ci dziękuję ;)

    0