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

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

15 Wrz 2013 16:16 3246 15
  • Poziom 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:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    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ę.
  • SterControlSterControl
  • Moderator Programowanie
    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?
  • SterControlSterControl
  • Poziom 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 :)
  • Pomocny post
    Moderator Programowanie
    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?
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 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ę :)
  • Moderator Programowanie
    Z tworzeniem katalogów pewnie już sobie poradziłaś, ale... schemat działania powinien wyglądać mniej-więcej tak
    Kod: vb
    Zaloguj się, aby zobaczyć kod


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

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 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ć).
  • Użytkownik usunął konto  
  • Poziom 10  
    Niestety udało mi się wykrzesać z siebie tylko tyle:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    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
  • Moderator Programowanie
    aurora23 napisał:
    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 napisał:
    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...
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    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 napisał:
    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 ;)
  • Pomocny post
    Użytkownik usunął konto  
  • Moderator Programowanie
    e-mega napisał:
    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?
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 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