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

Excel raport z wykorzystaniem Visual basic'a

21 Sie 2012 15:51 2478 9
  • Poziom 8  
    Witam

    Mam do rozwiązania zadanie z którym nie daję rady. Trzeba stworzyć w excelu raport sprzedaży dla sieci handlowej. Mam kilka sklepów w których sprzedaje sprzęt rtv/agd. W 1 arkuszu tworzę bazę danych . Model, Producent, moc,cena zakupu, cena sprzedaży, sprzedaż w poszczególnych tygodniach. Produktów jest sporo około 1000 pozycji.
    W osobnym arkuszu umieszczam tabelę z aktualnym stanem magazynowym poszczególnych towarów na poszczególnych sklepach. W pierwszym arkuszu każdy produkt ma swoje zdjęcie oraz przycisk typu command button pod którym kryje się makro wyświetlający stan w poszczególnych sklepach.

    Produkty można skategoryzować np telewizory, lodówki itd. Tutaj pojawia się problem. Chciałbym storzyć osobny arkusz w którym każda kategoria produktów (np. telewizory, lodówki, pralki) będą miały swój przycisk. PO kliknięciu otworzy się arkusz, który "pociągnie" dane dotyczące tylko wybranej grupy towarow z pierwszego arkusza. Problem polega na tym jak zrobić żeby zaimportowało się zdjęcie i przycisk makro wyświetlający stan.

    Dodatkowym utrudnieniem jest fakt że co tydzień do pierwszego arkusza dołączana jest kolumna ze sprzedażą poszczególnych produktów. Pierwszy arkusz posiada makra sortujące wg sprzedaży ogółem, czy wg sprzedaży w ostatnim tygodniu. Jeśli w innym arkuszu otworzą się lodówki (sztywne powiązanie komórek z pierwszym arkuszem ) w momencie sortowania pierwszego arkusza (w arkuszu z lodówkami) pojawią się inne produkty.


    Jeśli ktoś ma pomysł na makro, albo zupełnie inne rozwiązanie spełniające wyganae czynności bardzo proszę dać znać.


    Pozdrawiam
  • Moderator Programowanie
    Trochę mnie zastanawia ilość makr, przycisków.
    Zrobiłbym zupełnie osobny arkusz z wynikami obliczeń, fotkami, etc. Zamiast kombinować z kopiowaniem obiektów zastosowałbym filtr. Stany też pewnie dałoby się wyliczyć formułami.
    Ale to wszystko zależy od układu i organizacji danych w arkuszach. Przydałby się jakiś mały przykład w postaci pliku...
  • Poziom 40  
    Mały arkusz przykładowy masz w załączniku - wykorzystuje proste kopiowanie wierszy w pętli z arkusza źródłowego do docelowego. W pełni zgadzam się z przedmówcą, że tych przycisków coś za dużo - ba, sama idea kopiowania obrazków nie bardzo mi się podoba - wszak masz potem ten sam obrazek w dwóch miejscach... A znając tendencję niektórych ludzi do wklejania zdjęć prosto z aparatu i ich zmniejszania w Excelu (przecież im mniejsze zdjęcie, tym mniej zajmuje miejsca, prawda??)... wiadomo czym to grozi...

    Przykładowe makro kopiuje całe wiersze, obrazki kopiują się "w standardzie". Kopiowania przycisków w przypisanym im kodem brak - bo o ile można to zrobić, to jest to już bardziej skomplikowane. Lepiej inaczej ten problem rozwiązać - może wystarczy ręcznie wstawić po jednym przycisku na stronie, który dokonuje podsumowania, wyświetlania czy co on tam robi aktualnie zaznaczonej komórki? Nie sprawdzałem prędkości działania dla 1000 wierszy, ale jest to na tyle mała liczba rekordów, że nawet przedstawione średnio wydajne (za to proste :)) rozwiązanie powinno się sprawdzić.

    Kod:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Moderator Programowanie
    :arrow: marcinj12 Spróbuj teraz usunąć wiersze z arkusza "LODÓWKI", zakładając że są już nieaktualne...

    Zamiast kopiowania można filtrować, powiększenia zdjęć można dodać jako tło komentarzy, dołożyć sortowania, obliczenia, etc. W załączniku moja "wizja" takiego arkusza-bazy.
  • Poziom 40  
    adamas_nt napisał:
    :arrow: marcinj12 Spróbuj teraz usunąć wiersze z arkusza "LODÓWKI", zakładając że są już nieaktualne.
    Chodzi o to że obrazek zostaje w wierszu po jego usunięciu?? Myślę że autor zdaje sobie z tego sprawę - wszak ten sam problem ma pewnie na swojej głównej stronie z danymi... Najpierw musi usunąć obrazek, potem resztę wiersza. Poza tym do "synchronizacji" z aktualnymi danymi służy przycisk Kopiuj, a on już się troszczy o usunięcie obrazków :)
    Niemniej zgadzam się z powodów nie tylko wspomnianych wcześniej, że trzymanie jakichkolwiek obiektów w Excelu to niezbyt dobra rzecz - ale świat nie jest idealny ;P
  • Moderator Programowanie
    marcinj12 napisał:
    ale świat nie jest idealny
    No nie jest :)
    Poczekajmy może na załącznik autora/autorki. Może jakoś wspólnymi siłami uda się chociaż coś ulepszyć...
  • Poziom 8  
    Na wstępnie dziękuję za zaangażowanie.

    Powinienem na samy początku wrzucić mały przykład. Stworzyłem arkusz na wzór raportu z którym pracuje. Jest kilka makr , proszę przeklikać. Raport sprzedaży składa się z podstawowej tabeli (arkusz sprzedaż wg modeli) o której już pisałem. W tabeli znajdują się dane dotyczące produktu, zdjęcie oraz command button "STAN", który wyświetla stany produktu w poszczególnych sklepach. Z uwagi na fakt, że z raportu korzystają inne osoby, które nie są na co dzień użytkownikami excela do wszystkiego muszą być proste guziki. Zwłaszcza jeśli chodzi o poruszanie się po całym raporcie (powrót do menu, sortowanie, wyświetlanie stanu - stąd tak duża liczba guzików - jest to nieuniknione)

    Z menu głównego można wejść do sprzedaży wg grup. Tutaj znajdują się grupy produktów. Potrzebne mi są guziki które pokazywałyby produkty tylko z danej grupy. Np klikamy w lodówki i otwierają się wszystkie produkty z grupy lodówka. Taki raport musi zawierać wszystkie dane z arkuszu (sprzedaż wg modeli). Potrzebna jest również opcja guzika sortowania w tak wyselekcjonowanej grupie produktów, oraz powrotu do menu. Niestety co znacznie utrudnia sprawę musi wyświetlać się również zdjęcie.

    Arkusz sprzedaż wg modeli oraz stany aktualizowany jest raz w tygodniu więc stamtąd powinny być pociągnięte dane do raportu wg grup.

    W załączniku przykład.

    Pozdrawiam
  • Moderator Programowanie
    Makro z przestawianiem obrazków masz podane na talerzu przez kolegę marcjinj12, więc... tylko zastosować.

    Osobiście dalej obstawiam filtr ;) może być, na przykład, wstawiany makrem z formularza przy wyborze grupy, albo jakoś podobnie. W każdym razie unikałbym kopiowania obiektów...
  • Poziom 8  
    Dołączyłem marko kopiujące dane dla grup . Wszystko działa prawidłowo. Makro nie kopiuje (co jest zrozumiałe) guzików do wyświetlania stanów towaru w poszczególnych salonach. Czy jest jakiś sposób żeby po wyborze grupy np lodówki pokazywały się guziki do wyświetlania stanów.

    Jest jeszcze jeden problem który mnie nurtuje. Co tydzień do tabeli w arkuszu "sprzedaż wg modeli" dołączam kolumnę ze sprzedażą. Koniecznna jest wtedy zmiana kodu w makrach dotyczących np sorotwania. Jak trzeba zmodyfikować makro żeby po dodaniu kolumny z tygodniową sprzedażą np.: marko sorujące wg sprzedaży z ostatniego tygodnia zmieniło zakres. Ten sam problem wystepuje w sytuacji kiedy do głównej tabeli dodam kolejne produkty. Ręcznie w każdym kodzie muszę zmieniać zakres.


    Bedę wdzięczny za podpowiedź.
  • Poziom 40  
    Jeżeli zamiast przycisków ActiveX mogą być zwykłe Excelowe, to możesz tak przerobić makro, które Ci podałem w poprzednim poście:
    1. Przerób usuwanie obrazków na obrazki i przyciski:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    2. Do swojego projektu wstaw moduł (Insert->Module) i w nim umieść funkcję kopiującą uzależnioną od parametru w taki sposób: (i na Boga, dodaj chociaż wyłączanie odświeżania na czas kopiowania!):
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    3. W pętli, gdzie kopiujesz wiersze, dodaj kod TWORZĄCY przyciski i przypisujący im funckję z paramterem:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Sprawdziłem na swoim arkuszu i działał, nie wiem jak się zachowa na Twoim...

    Jeżeli chodzi o dynamiczne ustalanie zakresu, wystarczą te dwa sposoby:
    1. Do ustalenia ostatniego wiersza z danymi w zakresie, coś w stylu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    2. Do ustalenia ostatniej kolumny w zakresie:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Mając w zmiennych numer wiersza i kolumny możesz skleić z nich adres, tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    albo tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    W przykładzie odwołania do aktywnego arkusza, w przypadku nieaktywnych - należy się do nich odwołać przed .Range i .Cells