Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel - Makro zamiana wartości

steelek56 23 Sep 2012 17:34 1704 4
  • #1
    steelek56
    Level 12  
    Witam.

    Przeglądałem kilka tematów tu na forum które dotyczyły mojego problemu niestety żaden nie tyczył dokładnie tego co mnie interesuje.

    Pracuje jako specjalista ds. transportu w niewielkiej sieci marketów i tworząc plan transportowy dla samochodów musze po skończeniu wpisać tzw zwroty (puste palety, kartony, kosze z butelkami etc). Sklepy zgłaszają te zwroty poprzez platformę internetową dedykowaną dla naszych sklepów wpisując po prostu liczbę miejsc paletowych, które będą potrzebne w samochodzie. My to generujemy w postaci arkusza excel, ktorego potem drukujemy bądź po prostu przenosimy wartosci do ogólnych sklepów. Plan końcowy jest sciśniety praktycznie do 3 komorek tak aby ułatwić magazynowi i kierowcom w ogarnięcie go. I tak. W pierwszej kolumnie jest godzina załadunku w drugiej nazwa samochodu ktory pojedzie w dana trase i w trzeciej sama trasa wypisana w formacie:

    sklep_xxx-sklep_yyy-sklep_zzz

    Wszystko w jednej komorce. Teraz problemem jest przeniesienie wartosci z raportu ktory w jednej kolumnie ma nazwe sklepu a w kolumnie obok liczbę zgloszonych zwrotow do faktycznego planu. Jest tam kilka reguł jak np wiekszy priorytet w odbiorach niektorych sklepów (niektore musza byc wziete bez wzgledu na to czy pasuje czy nie, a niektore mozna "olac" i wziac w inny dzien), ale to sprawa którą można pominąć i nie będzie to zbytnim problemem.

    Probowalem wykombinowac cos z dodatkowym arkuszem i wklejeniem tam tego i skorzystaniu z funkcji Wyszukaj.pionowo z doswiadczenia wiem ze dobre polaczenie funkcji jezeli i wyszukaj.pionowo dziala w takiej sytuacji dosc dobrze. Jest tylko jedno ale... taki sposob działalby dobrze jezeli kazdy sklep byłby w oddzielnej komórce, a na to sobie pozwolić nie mogę. Wiec aktualnie musze kazdy sklep wyszukac w planie wciskajac ctrl+F wpisując tam nazwe sklepu z raportu zwrotow i przy sklepie wpisać liczbę zwrotów. Po skończeniu wygląda to mniej więcej tak:

    sklep_xxx(zwrx)-sklep_yyy(zwrx)-sklep_zzz(zwrx)

    gdzie x to liczba miejsc paletowych potrzebnych na zwroty.

    Zeby to szło z automatu makro powinno znajdowywać wartość w pliku raportów ewentualnie w innym arkuszu gdzie bym zawartosc pliku raportów wkleił do tego arkusza. Normalnie zrobiłbym to z funkcji wyszukaj pionowo, ale jak jest ta skladnia kilku sklepow w jednej komorce to caly moj plan lezy.

    Jako, że moja znajomość VB do najlepszych nie należy skorzystałem z narzedzia do "nagrywania" makr offica. Utworzyłem cos takiego:

    Sub Makro1()
    '
    ' Makro1 Makro
    '
    ' Klawisz skrótu: Ctrl+d
    '
        Selection.Copy
        Range("C3").Select
        Application.CutCopyMode = False
        Selection.Copy
        Sheets("Arkusz1").Select
        Cells.Replace What:="sklep_xxx", Replacement:="sklep_xxx(zwr5)", _
            LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
            False, ReplaceFormat:=False
    End Sub
    


    Szczerze mówiąc robi on to co ma robić. Problem w tym, że nie wiem jak zamienic te:

    Cells.Replace What:="sklep_xxx", Replacement:="sklep_xxx(zwr5)" na cos w stylu Cells.Replace What:="A1", Replacement:="A1(zwrA2)"

    gdzie A1 to nazwa sklepu z raportu zwrotów a A2 to komórka z odpowiadającym temu sklepowi ilością zgłoszonych zwrotów.

    ... a potem zapętlić to aby skrypt wykonał się też dla komórek B1:B2, C1:C2, D1:D2 itd.

    Dodatkowo nawet jezeli zrobilbym ten plan w oddzielnych komorkach a potem chcial go scalic do jednej komorki to nie znam narzedzia w office, które scalałoby komórki z róznymi wartościami dodatkowo wstawiając między wartosciami z poszczególnych komórek rozdzielnik w postaci np myślnika

    Będę wdzięczny za wszelkie sugestie i wskazówki.
  • Helpful post
    #2
    adamas_nt
    Moderator of Programming
    steelek56 wrote:
    w trzeciej sama trasa wypisana w formacie:

    sklep_xxx-sklep_yyy-sklep_zzz
    Jeśli dobrze zrozumiałem, to myślnik jest znakiem rozdzielającym nazwy sklepów, których trzeba wyszukać? Jeśli tak, to najprościej rozbić ciąg funkcją Split i zapisać w tablicy. Następnie wyszukać kolejne wartości w pętli For, gdzie licznikiem będzie rozmiar tablicy. Wynik można zapisać w dowolnej postaci: jako sumę, jako wspomniany ciąg "sklep_xxx(zwrx)-sklep_yyy(zwrx)-sklep_zzz(zwrx)", lub jakkolwiek...
  • #3
    steelek56
    Level 12  
    Może troche to pokrętnie opisałem.

    Ciężko mi cokolwiek z tego zrozumieć co napisałeś. VB chwytam w mocno okrojonym stopniu.

    Wrzuciłem do załącznika przykładowy plik. Arkusz Plan pokazuje jak wygląda przykładowy plan. Arkusz Raport to po prostu raport zwrotów wygenerowany z platformy internetowej. Arkusz Plan Wynik to to, co otrzymuję po wpisaniu zwrotów sposobem ręcznym (należy zwrócić uwage, że powtarzający się sklep3 nie został wpisany dwa razy, bo skoro odbierzemy zwroty wcześniej, to później logicznym jest że nie ma czego odbierać). Dodatkowo sklepy które w raporcie mają wpisane 0 albo pustą komórkę traktowane są jako brak zgłoszonych miejsc i nie trzeba ich wpisywać czy wyszukiwać.

    Myślę, że zrobienie tego w sposób gdzie każdy sklep byłby w innej komórce byłoby o wiele łatwiejsze przy użyciu kombinacji funcji wyszukaj.pionowo i jeżeli. Niestety narzucone odgórnie mam, że plan dla magazynu i kierowców ma być w takiej a nie innej postaci (co oczywiście jako absolwent logistyki uważam za idiotyzm, ale nie mam stanowiska menadżerskiego, aby mieć okazje zaproponować rozwiązania oparte o profesjonalne programy do tego typu rzeczy).

    Dużej filozofii tu nie ma, ale wpisanie zwrotów dla kilkuset pozycji + fakt, że wciąż pojawiają się nowe sklepy sprawia że czynność która dla jednego sklepu trwa kilkanaście sekund dla wszystkich robi się ponad godzina.
  • #5
    steelek56
    Level 12  
    Mhm... na takiej zasadzie. Dziękuję za pomoc. Przynajmniej na czymś stoję.

    Przekopie jakies poradniki o VB postaram się coś to pociągnąć dalej.

    Jeszcze raz wielkie dzieki za pomoc.