Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Losowanie zmiennej ilości wierszy ze zmiennej ilości rekordów

aurora23 15 Sep 2013 16:16 3381 15
SterControl
  • #1
    aurora23
    Level 10  
    Mam plik, który składa się z określonej liczby rekordów. Kolumna B do nazwa jednostki. Mam za zadanie napisać programik, który dla każdej jednostki wylosuje po 5 rekordów (bez powtórzeń) i przepisze je do nowego arkusza.

    Udało mi się zrobić coś takiego:
    Code: vb
    Log in, to see the code


    Ale powyższe nie działa prawidłowo, tzn.
    1. Nie ma ograniczenia, żeby program przestał działać przy ostatnim niepustym wierszu.
    2. liczba, a co za tym idzie wiersz jest losowany zawsze z zakresu 1: licznik, a chcę, żeby losowane było z (licznik- range : licznik) , gdzie range to ostatni zakres z którego losowano (odejmowanie zbiorów).
    3. losuję tylko po 1dnym wierszu dla każdej jednostki, a nie po 5 jak chciałam.

    Serdecznie proszę o wskazówki poprawienia kodu, a jak znam życie i siebie - można zapewne to zrobić dużo prościej :))))


    W załączniku plik na którym pracuję.
  • SterControl
  • #2
    adamas_nt
    Moderator of Programming
    Ojej, jak to kolega e-mega zobaczy... :)

    Zapytam dla pewności:
    1. Chcesz wylosować po 5 unikatów dla każdej jednostki?
    2. Musi być makro?
  • SterControl
  • #3
    aurora23
    Level 10  
    1. tak, pięć unikatów dla każdej jednostki
    2. tak, makro, albo obiekt Command Button z podpiętym kodem :) A jakby w ogóle wynik był generowany do innego arkusza i w sumie otwieranie pliku z danymi wejściowymi też działo się przy użyciu przycisku to też by było super :)
  • Helpful post
    #4
    adamas_nt
    Moderator of Programming
    Bez makr, przy pomocy funkcji LOS oraz kilku kolumn pomocniczych, wychodzi jak na obrazkach. Ze względu na formuły tablicowe, przeliczanie trwa 2-3 sekundy:

    Losowanie zmiennej ilości wierszy ze zmiennej ilości rekordów         Losowanie zmiennej ilości wierszy ze zmiennej ilości rekordów
    przemyśl jeszcze ;)

    Jeśli makro, to () sprawdzanie w pętli wartości z kolumny B, zapisywanie w tablicy aż do zmiany i wylosowanie pięciu z zapisaniem do arkusza. Następnie czyszczenie tablicy, następna jednostka, i tak aż do =""

    Dodano po 1 [godziny] 22 [minuty]:

    Tak mi przyszło do głowy: A może po prostu losować Nr wierszy?
    Code: vb
    Log in, to see the code
  • #5
    aurora23
    Level 10  
    No fajnie :)
    wybacz brak szybkiej reakcji, próbowałam jeszcze robić to samodzielnie :)
    Widzę, że długa droga przede mną zanim to opanuję.
    Moim zadaniem będzie jeszcze stworzenie pojedynczych katalogów na ścieżce dla każdej jednostki znajdującej się w kolumnie nr 2 z arkusza z wylosowanymi danymi oraz wysłanie tych katalogów jako załącznik w Outlooku posiadając bazę mailową.

    Np. jednostka_nr1 -----> tworzę katalog w lokalizacji d:\Pliki\ o nazwie "jednostka_nr1"-----> tworzę w tym katalogu plik exel, do którego kopiuję te wylosowane rekordy, które dotyczą owej jednostki -----> w wyjściowym arkuszu w którym mam cały kod, znajdować się może również baza adresów mailowych na które rozsyłane będą wiadomości z odpowiednim załącznikiem.

    Walczę :)
  • #6
    adamas_nt
    Moderator of Programming
    Z tworzeniem katalogów pewnie już sobie poradziłaś, ale... schemat działania powinien wyglądać mniej-więcej tak
    Code: vb
    Log in, to see the code


    Jesli chodzi o mailowanie via outlook. Zerknij Link oraz Link
  • #7
    aurora23
    Level 10  
    Wstawianie wartości do odp arkuszy:
    (działa, ale to kicha straszna :P):

    Code: vb
    Log in, to see the code
  • #9
    aurora23
    Level 10  
    Próba wypadła pomyślnie, ale...

    1. Nie uwzględniasz sytuacji, w której w danych początkowych jest mniej niż 5 rekordów dla danej jednostki. Wtedy program się zatrzymuje.

    2. Rozumiem o co chodzi z wysyłaniem maili.... i przez chwile wydawało mi się to łatwe dopóki nie zaczęłam tego robić w pętli :( wszystko mi się sypie wtedy.

    W załączniku ten sam plik, tylko w ark2 znajduje się baza mailowa, tzn. do każdej jednostki przypisany jest mail osoby i teraz jeśli w zakresie, z którego losujemy i w ark2 znajdzie się ta sama jednostka (porównywanie właśnie po tym argumencie) to plik z wylosowanymi danymi należy wysłać jako załącznik na przypisany do jednostki mail.

    Oczywiście baza jednostka+mail będzie stała, a co za tym idzie ilość jednostek w niej zawarta będzie zawsze większa niż ilość jednostek w pliku z danymi początkowymi (tak wspominam, żeby wiedzieć co do czego należy porównywać).
  • #10
    User removed account
    User removed account  
  • #11
    aurora23
    Level 10  
    Niestety udało mi się wykrzesać z siebie tylko tyle:

    Code: vb
    Log in, to see the code


    Wybaczcie, że wciąż wklejam tutaj takie coś, ale w ten sposób jedynie działa moja wyobraźnia :P
    A wy rozwalacie problem w tablicach danych, potraficie napisać sprytne odwołania, na które ja w życiu nie wpadnę....
    No i jestem pewna na 100%, że przy większym zbiorze danych szlak by to trafił... :/

    Pozdrawiam
  • #12
    adamas_nt
    Moderator of Programming
    aurora23 wrote:
    Nie uwzględniasz sytuacji, w której w danych początkowych jest mniej niż 5 rekordów dla danej jednostki
    Wystarczy dopisać instrukcję warunkową przecież... No dobra, dopisałem. Przy okazji zmieniłem trochę warunki pętli (źle liczyła)
    e-mega wrote:
    powinna być obsługa błędów bo jeśli dwukrotnie odpali się makro to wyświetli się błąd.
    Oczywiście! Autorka powinna wtedy albo usunąć istniejące katalogi razem z ich zawartością - ręcznie, albo dopisać stosowne zabezpieczenie... No dobra(Nr.2), dopisałem. Jeśli jest, usuń zawartość, jeśli nie, emkadiruj...
    Code: vb
    Log in, to see the code
    Outlooka nie posiadam, metody i właściwości znam tylko teoretycznie, więc się nie wypowiadam. Sporo jest na ten temat w internecie (łącznie z postem kolegi e-mega), więc jest na czym prowadzić doświadczenia.
    aurora23 wrote:
    No i jestem pewna na 100%, że przy większym zbiorze danych szlak by to trafił... :/
    Nie pozostaje nic innego jak:
    1. Zamknij oczy
    2. Odpal makro
    3. Zanuć wszystkie zwrotki "Szła dzieweczka"
    4. Otwórz oczy i popatrz co się narobiło
    A tak serio, zaprzyjaźnij się z klawiszem [F8], [F9], Stop-em, etc ;)
  • Helpful post
    #13
    User removed account
    User removed account  
  • #14
    adamas_nt
    Moderator of Programming
    e-mega wrote:
    Set otl = CreateObject("Outlook.Application")
    To wiązanie powinno działać z poziomu Excela, pod warunkiem istnienia Ms.Outlook w systemie. Przy odwołaniach, po kropce, powinna wyświetlić się lista właściwości i metod. Aurora, jak u Ciebie, działa?
  • Helpful post
    #15
    User removed account
    User removed account  
  • #16
    aurora23
    Level 10  
    Drodzy Panowie,
    serdeczne dzięki za tak burzliwą dyskusję oraz poprawienie mojej marnoty :D

    Dla mnie było to niebagatelne zadanie i tym bardziej jestem wdzięczna za wszelką pomoc :)

    Przynajmniej nie będę pisać już takich dziwnych iteracji i zrozumiałam co się dzieje na każdym etapie działania kodu.

    Ps.
    Przyciski [F8] i [Ctrl+Pasue/Break] nie są mi obce :P