Elektroda.pl
Elektroda.pl
X

Search our partners

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

(VBA) EXCEL - przenoszenie i łączenie kolumn w nowych skoroszytach według filtru

wozo 20 Jan 2015 09:41 5100 73
  • #31
    wozo
    Level 11  
    @PRL - uważaj na kaczki! :-) . Żartowałem.
    Dobrze zrozumiałeś moje potrzeby , ale niestety w dalszym wyciągu to nie wychodzi do końca tak jak trzeba.
    Tabeli pięknie się kopiują , ale bez obramowania , dane z formuł mają więcej niż dwa miejsca dziesiętne. Zmieniłem nazwę klienta2 na klient000002 a w arkuszu skopiowały się dane klienta20.
    (VBA) EXCEL - przenoszenie i łączenie kolumn w nowych skoroszytach według filtru
    Poza tym strasznie przymula mi kompa.
    Ale nie chcę nadużywać Twojej cierpliwości w tym temacie zwłaszcza że potrzebuję jej jeszcze.
    Proponuję porzucić dopieszczanie tego tematu bo pierwsza wersja , która nam wyszła była bliska ideału. Na niezgodność danych pomiędzy tabelkami "target" a "wykonanie" być może znalazłoby się jakieś makro? Takie , które sprawdzałoby nazwy w poszczególnych kolumnach w obu arkuszach i jeżeli wystąpiła by różnica to ją zaznaczyło? Wtedy bym tabelki dopasował ręcznie.

    Czy mogę zaproponować przejście do pierwszego kroku drugiej części pytania?
  • #32
    PRL
    Level 40  
    Quote:
    Tabeli pięknie się kopiują , ale bez obramowania , dane z formuł mają więcej niż dwa miejsca dziesiętne


    Naprawdę na takiego gotowca oczekujesz?
    Może trochę (dwie linijki w tym przypadku) napisałbyś od siebie?


    Quote:
    Poza tym strasznie przymula mi kompa.


    Może Koledzy, którzy pisali w tym wątku, sprawdzą jak jest u nich?
    U mnie, dla załączonego pliku, makro wykonuje się 2s.

    Markoz, Marku, można Was prosić o pomoc? Chodzi o najmłodszy załącznik.

    P.S. Nie wiem o co Ci chodzi z 'klient00002'. To tylko nazwa. Coś kombinujesz.;)

    (VBA) EXCEL - przenoszenie i łączenie kolumn w nowych skoroszytach według filtru
  • #33
    markoz7874
    Level 31  
    PRL wrote:
    ..
    U mnie, dla załączonego pliku, makro wykonuje się 2s.

    Markoz, Marku, można Was prosić o pomoc? Chodzi o najmłodszy załącznik..


    Na moim leciwym laptopie i excelu 2000, czas wykonania makra wynosi okolo 1s.
  • #34
    PRL
    Level 40  
    Dzięki Markoz.

    A czy u Ciebie arkusze klientów zawierają oczekiwane przez Autora dane?
  • #35
    wozo
    Level 11  
    PRL wrote:

    Naprawdę na takiego gotowca oczekujesz?

    Naprawdę tak to odbierasz? Przecież wydawało mi się że dałem dowody swojego zaangażowania w ostatnim opublikowanym kodzie.
    Te uwagi miały tylko na celu opisanie ewentualnych rozbieżności od założeń początkowych.
    Nazwę klienta na klient000002 zmieniłeś w arkuszu "target" czy "wykonanie"? Bo u mnie jak w "wykonanie" to efekt jak w poście powyżej , a jak w "target" (tym razem w "wykonaniu" jest "klient2" ) to efekty jak poniżej:
    (VBA) EXCEL - przenoszenie i łączenie kolumn w nowych skoroszytach według filtru
    Komp muli i nic nie poradzę chociaż procek to i7 a ramu 16GB. Chociaż nie do końca muli cały komputer. Zawieszają się excel i outlook i trwa to do dwóch minut.
    Zostawmy to , proszę. Podziwiam Twoją ambicję.

    Chciałbym jeszcze prosić o taką pomoc:

    Mam dopasowane makro , które wysyła emaila z tabelką z aktywnego arkusza w treści html. Nie mogę wpaść na trop co zrobić aby maile wysyłały się dla każdego z arkuszy klientów według listy z zakładki "email".
    Nie proszę o gotowca tylko drobne kroczki.
  • #36
    PRL
    Level 40  
    Quote:
    Nazwę klienta na klient000002 zmieniłeś w arkuszu "target" czy "wykonanie"?


    W 'Target'.
    Od samego początku przyjąłem, że bazowym arkuszem jest 'Target', a więc w nim są wszyscy klienci, natomast w 'Wykonaniu' nie muszą być wszscy, którzy są w 'Target' i tak makro jest napisane.

    P.S. Ilu masz klintów i producentów, że u Ciebie muli?
  • #37
    wozo
    Level 11  
    Założenia jak najbardziej słuszne. Ja tym razem nie pomyślałem. Przy takich założeniach efekt jak na drugim obrazku jest jak najbardziej OK.
    Testuję tabelkę z twojego załącznika. Na razie nic na danych końcowych , ale liczba klientów nie będzie początkowo dużo większa.
  • #39
    wozo
    Level 11  
    @PRL - może w międzyczasie podjąłbyś temat wysyłki mailli? Proszę.
  • #40
    PRL
    Level 40  
    Jeżeli nie musi być HTML, a jako załącznik, to proszę.
  • #41
    marek003
    Level 40  
    PRL wrote:
    marek003 Help.;)

    :) Momencik (choć nie wiem czy poradzę) - muszę się wczytać bo nieźle "wam" szło więc się już nie zagłębiałem w temat.
  • #42
    wozo
    Level 11  
    PRL wrote:
    Jeżeli nie musi być HTML, a jako załącznik, to proszę.

    Tu nie chodzi o samo wysyłanie, bo makro , o którym wspominałem spisuje się świetnie. Jego autorem Ron de Bruin - w artykule "Mailing a Single Worksheet in the Body of an E-Mail Message" . Jest tam również podane wysyłanie emaili dla listy w tabeli. Potrzebne by było jakieś makro , lub jego część , które będzie taką listę tworzyć dla tych naszych arkuszy klientów a z arkusza email wybierać adresy (zgodne z nazwą klienta czyli arkusza).
    Mam nadzieję że znowu nie zagmatwałem.
  • #43
    marek003
    Level 40  
    Do końca nie wiem w czym mam pomóc?

    Jeżeli chodzi o czas to u mnie ok.2s (w domu sprawdzę na gorszym sprzęcie :) )

    Co do "pretensji" :) autora, że się pojawia wykonanie innego klienta niż wybrany w danym arkuszu:
    Proponuje zmienić sposób "wyliczenia" zmiennej "kw". Poniżej przykład.
    Dodałem tez informację w arkuszu danego klienta, że dany klient nie ma wykonania (tekst oczywiście można zmienić). Pozbyłem się też wyłączenia błędów bo w tym przypadku nie było to konieczne.

    Moja ingerencja w zielonych "blokach"

    Code: vb
    Log in, to see the code
  • #44
    PRL
    Level 40  
    Dzięki Marku.
    Wg mnie nic to nie zmienia.

    Code: vb
    Log in, to see the code


    Efekt taki sam do:

    Code: vb
    Log in, to see the code



    Chodziło mi bardziej o pomoc ze zrozumieniem #3., gdzie Autor opisał swoje potrzeby, a o których w poście #29 wpomniał, a ja w załączniku z postu #30 myślę, że spełniłem warunki z #3.:)

    Chyba demencja się kłąnia u mnie.:(
  • #45
    wozo
    Level 11  
    Panowie,
    znowu mi wypada zwrócić honor. To raczej mój komp w pracy ma problemy a nie kod makro. W domu na laptopie wszystko wykonuje się szybko i bez problemów. Obydwa kody i kol. PRL i kol.marek003.
    @marek003 - dziękuję za dodanie sprawdzania i informacji o braku wykonania. Super by było (jeżeli można) dodać na końcu wykonywania skryptu Msgbox typu: "brak wykonania dla klienta(ów):..." Nie musiałbym przeglądać wszystkich arkuszy w poszukiwaniu ewentualnych różnic.
    Co do obramowania ramek i zaokrąglania wyników formuł to muszę odrobić zadanie domowe , ale OK - tak jest nawet lepiej.
    Wracając do tematu mailingu to go przemyślałem i mam następujący pomysł:

    Makro aktywuje (w pętli ) poszczególne arkusze. Dla arkuszy "email" , "wyliczenia" , "target" , "wykonanie" nie robi nic - przechodzi dalej. Dla pozostałych
    arkuszy po aktywowaniu wywołuje makro do wysyłki email (które działa dla aktywnego arkusza). W tym wypadku nie jest potrzebne tworzenie jakiejś dodatkowej listy.
    Czy dobrze kombinuję?
    A jeśli tak to czy mogę prosić o takie makro?
    Dziękuję za dotychczasową pomoc i cierpliwość.
  • #46
    PRL
    Level 40  
    Dziękuje i oddaję pałerczkę Markowi.:)
  • Helpful post
    #47
    marek003
    Level 40  
    PRL wrote:
    Dzięki Marku.
    Wg mnie nic to nie zmienia.

    Code: vb
    Log in, to see the code


    Efekt taki sam do:

    Code: vb
    Log in, to see the code



    Efekt nie jest ten sam. Inaczej działa Find a inaczej podaj.pozycję() z zerem jako ostatni parametr.
    W twoim przypadku "Find" szuka ciągu nazwy klienta w innych ciągach. Dlatego dla Klient2 po zamianie w "wykonaniu" nazwy klient2 na klient000 wyszukiwał "Klient22" bo klient2 "mieści się w klient22. I tu powstawał "błąd" przyporządkowania jednego klienta do wykonania innego klienta.
    Przy "moim" kodzie w przypadku takich nazw klientów kw przyjmie wartość 0 , bo nie znajdzie "Klient2" i nie wykona się dalsza procedura po IF.


    :) Dziękuję Ci PRL za "pałeczkę" :) ale jeżeli Ty nie poradziłeś, to co ja biedny żuczek mogę ;)

    :arrow: Wozo widzę, że "zamęczyłeś" kolegę PRL :). Daj mu chwilę odpocząć.

    Ja jestem w stanie pomagać ale dorywczo i jeżeli chodzi o VBA nie jestem ekspertem (czym innym jest sprawdzanie kodu, a czym innym tworzenie).
  • #48
    wozo
    Level 11  
    Wymęczyłem, wymęczyłem.
    Wcale mu się nie dziwię,zwłaszcza że pracował po nocach a ja jeszcze co chwila problemy miałem.
    Podczas analizowania kodu (znalazłem czas na to :-) ) znalazłem jeden nie zamierzony przez twórcę błąd. W przykładowej tabelce w arkuszu "Wyliczenia" wszyscy producenci mieli wartość procentową bonusu 3% , ale to był tylko przykład. W rzeczywistości ten % będzie różny kol. PRL o tym nie wiedział więc napisał "na sztywno" tą wartość w kolumnie F. Tak docelowo być nie może. Czy ten mój początkowy pomysł z kopiowaniem kolumn D-F był zły? Bo nie napisaliście. A jeżeli tak, to dla czego?
    A mała odpowiedź potwierdzająca lub negująca mój pomysł z wysyłką maili? Mogę prosić?
  • #49
    marek003
    Level 40  
    Na co mi przyszło. :not:
    :)
    Poniżej troszeczkę jeszcze zmieniony (uporządkowany) kod kolegi PRL (bez urazy - wiem że łatwiej korygować niż tworzyć). Wyeliminowałem skakanie po arkuszach (select) - może to trochę jeszcze przyśpieszy działanie.
    Dodałem (za autorem topika) okienko z informacją o klientach bez "Wykonania".
    Ponieważ jestem ze "starej" szkoły dodałem jeszcze deklaracje wszystkich zmiennych (to dla działania nic nie daje ale dla zasady powinno być).

    :arrow: Wozo z mailami "jeszcze chwilę", bo to dla mnie nowum (załącz kod o którym mówisz bym mógł się mu przyjrzeć)
    Ty się w międzyczasie zajmij wspomnianą pracą domową :) (byś nie zasypywał nas nowymi pomysłami), a ja spróbuje doszkolić się w tych mailach oraz zrozumieć co "wam" jeszcze brakowało w poprzednich rozwiązaniach (które próbował mi przekazać kolega PRL).

    Kolejna rzecz: piszesz o różnych % które teraz są na stałe ( 3% ).:
    W poniższym kodzie masz opcje z kopiowaniem tej tabeli, a w załączniku przykład działania. Tak lepiej? (będziesz miał mniej zabawy z ramkami i formatem :) )

    Code: vb
    Log in, to see the code


    edit
    ---------------------------------
    Maile:
    Tak jak chciałeś wykorzystać swój pomysł wysyłania w pętli arkuszy, to masz już przecież rozwiązanie.

    Zobacz na funkcję którą pominąłeś na początku tego postu i uważałeś że procedura kolegi PRL nie działa.
    W niej funkcja For Each ... (do next) robi właśnie pętle po wszystkich arkuszach w skoroszycie. Warunek if sprawdza w tym przypadku nazwy wiec ...

    Na jaj podstawie zrób procedurę. W wierszu IF (jeżeli) dodaj "zabezpieczenie" by jak pętla trafi na arkusze o nazwie "target" itp. warunek IF nie wykonał się.

    Poradzisz sobie?
  • #50
    wozo
    Level 11  
    Serdecznie dziękuję!
    Teraz jest idealne!
    Ja co prawda sam wróciłem do kopiowania ostatnich trzech kolumn w ostatnim kodzie poprawionym przez Ciebie bo poległem przy zaokrągleniach , a tak było prościej. Nie mogłem też na razie dojść do tego jak zaznaczyć cały zakres nowo powstałej tabelki aby zrobić "wypasione" obramowanie. Podpowiesz jaki zakres wybrać? Nie chciałem tak "na sztywno" wybrać A1:F38 bo to przecież może ulec zmianie.
    To okienko ilu i jacy klienci są bez wykonania to normalnie bomba!

    Co do maili to tak jak pisałem nie do końca jest problem z samą wysyłką , ale z aktywacją poszczególnych arkuszy bo makro działa dla aktywnego arkusza. Zamieszczam kod poniżej bo może się komuś przydać:
    Code: vb
    Log in, to see the code


    Teraz żeby wysłać emaile do klientów z listy autor dodał dodatkowy kod.
    Jak byś mógł zajrzeć do tego linka: Link . Teraz tak sobie myślę że ten mój pomysł to chyba nie do końca jest dobry bo pewnie makro będzie chciało wysyłać dane z aktywnego skoroszytu do wszystkich klientów z listy w arkuszu "email". Ale na tej stronie jest też takie info:
    "You can use an e-mail address in a cell. You can do the same for the CC, BCC, or subject lines.
    VBA
    .To = ThisWorkbook.Sheets("Sheet1").Range("C1").Value "
    A przecież w komórce
    "C1" mamy nazwę klienta więc możnaby wykorzystać tą metodę. Możnaby nawet
    pokusić się o wysyłkę w polach "CC" i "BCC" dla adresów email z kolumn "C" i "D" arkusza "email"
    Jeżeli chodzi o temat makra , które by aktywowało poszczególne arkusze to próbowałem przerobić znalezione makro , które dla wszystkich arkuszy oprócz tych wymienionych z nazwy cieniuje określony zakres:
    Code: vb
    Log in, to see the code

    Próbowałem zamiast operacji cieniowania wprowadzić " Call Mail_w_HTML " ale niestety otrzymuję komunikat że żadne "Sub" nie jest zdefiniowane. Nie mogę przejść dalej...
    Gdybyś zechciał się temu przyjrzeć , chociaż zdaję sobie sprawę że znowu dużo tego :-) Ty masz milionkrotnie wiedzę większą ode mnie więc może nie będzie tak źle.

    Edit:
    Ja męczyłem się z pisaniem odpowiedzi , a Ty już zdążyłeś swój post edytować :-)
  • #51
    marek003
    Level 40  
    PRL wrote:
    Chodziło mi bardziej o pomoc ze zrozumieniem #3., gdzie Autor opisał swoje potrzeby, a o których w poście #29 wpomniał, a ja w załączniku z postu #30 myślę, że spełniłem warunki z #3.:)

    Też uważam, że wypełniłeś wszystkie warunki stawiane przez autora topiku. Tak samo ja to rozumiem jak i Ty - ja nic innego więcej bym nie wymyślił. Dlatego nie do końca rozumiem wywoływanie mnie do "przejęcia pałeczki", bo to Ty jesteś autorem pomysłu, a ja tylko zwykłym obserwatorem z ewentualnymi sugestiami niewielkich poprawek.
    Co prawda wystąpiła pewna nieścisłość dotycząca "Find", ale to już chyba wyjaśniliśmy. Więc uważam że stworzyłeś rozwiązania dla wszystkich kroków które przedstawił auror topiku.
    Maile to jakaś nowa "abstrakcja" :) z którą walczymy - jakbyś mógł "z góry" (Jako taki "senior" :) ) patrzeć w razie "nieścisłości", bo jak zaznaczyłem w makrach do eksperta mi daleko.

    :arrow: wozo, to jak, poradzisz sobie z tymi mailami po mojej sugestii w poprzednim mailu, czy próbować zrozumieć przedstawiony przez Ciebie kod?
  • #52
    wozo
    Level 11  
    Marku , proszę nie opuszczaj mnie :-) , Czy Ciebie już też wymęczyłem?
    Jeżeli chodzi o opisanie moich potrzeb w poście 3 to opisałem tak jak mogłem ale wyszło, że było to nie precyzyjne.
    Co do maili to jednak przydałaby się jednak pomoc. Z pętlą spróbuję sobie poradzić , a Ty jak byś mógł zerknąłbyś co miałbym pozmieniać w kodzie od maila aby wysyłać tylko do klienta o nazwie z komórki "C1" według adresów z arkusza "email" (plus kolejne adresy w "cc" i "bcc").
    Przecież to już tak blisko i jeszcze trochę a będziecie mieli ze mną spokój :-)
  • #53
    marek003
    Level 40  
    wozo wrote:
    ... będziecie mieli ze mną spokój

    :) Każdy tak mówi :)
    Jutro w wolnym czasie spróbuję zerknąć. :)
  • #54
    PRL
    Level 40  
    Quote:
    Wyeliminowałem skakanie po arkuszach (select) - może to trochę jeszcze przyśpieszy działanie.


    Marek

    Bardzo ładny kod.:)

    Code: vb
    Log in, to see the code


    Pisząc kod nie wiedziałem, że akrusz 'Wyliczenia' ma być wzorem dal poszczególnych producentów. Taka kiszka w nim była.;)
  • #55
    marek003
    Level 40  
    PRL wrote:
    Bardzo ładny kod.

    Wiem że trochę długa linia :), ale bez "nakierowania" na dany arkusz funkcji Cells() funkcja Copy(Destination) zgłaszała błąd. A z samym Range() zamiast Cells'ów nie mogłem sobie jakoś tu poradzić. :) Plus jest taki, że w tym wypadku makro nie otwiera danego arkusza (nie "skacze" do niego) i nie zaznacza kopiowanego obszaru, co wg mnie wpływa trochę na szybkość działania. Ale może się mylę. Trzeba by kiedyś sprawdzić to z funkcją Time jak szybko działa jedna a jak druga procedura. :)
  • #56
    wozo
    Level 11  
    Panowie, wykonaliście kawał dobrej roboty , która wymagała nie tylko umiejętności ale też cierpliwości. Na moje usprawiedliwienie mogę dodać że "zabawę" z VBA zacząłem dwa tygodnie temu. Niestety przeczytanie Walkenbacha nie wiele daje. Dużo lepszym sposobem nauki są wyzwania i analizowanie kodów doświadczonych kolegów. Ile ja się nauczyłem dzięki Wam przez te dwa dni...
    Do końca realizacji pomysłu pozostała wysyłka maili. Nie mam zamiaru namawiać Was do analizowania i przerabiania obcych kodów więc chyba znalazłem najprostsze rozwiązanie. Potrzebna jednak by była modyfikacja Waszego kodu.
    Na stronie , o której pisałem jest takie info:
    "You can use an e-mail address in a cell. You can do the same for the CC, BCC, or subject lines.
    VBA
    .To = ThisWorkbook.Sheets("Sheet1").Range("C1").Value"
    Więc mam pomysł.
    Czy moglibyście dodać do Waszego kodu aby podczas tworzenia arkuszy kopiowane były dane również z arkusza email? W tym arkuszu będą adresy email dla każdego z klientów. (w "B" -"do" , w "C" -"dw" , w "D" -"udw" ). I teraz te adresy email wstawiło by się do każdego z arkuszy , ale w ukrytych komórkach aby nie wysyłały się w treści wiadomości. Jeżeli w komórce "C1" arkusza klienta jest "brak wykonania" to niech nie wstawia adresu mail. Super by było jakby Marek mógł dodać jeszcze jedno okienko z komunikatem o ewentualnym braku adresu email dla danego klienta. Z resztą już sobie na pewno poradzę.
    O tyle jeszcze Was proszę - dużo za dużo?
    Pozdrawiam.
  • #57
    PRL
    Level 40  
    Quote:
    nie "skacze" do niego


    I tak nie skacze, skoro ScreenUpdating jest wyłączony. Tak mi się wydaje.
    Na pewno skraca kod.:)

    Quote:
    O tyle jeszcze Was proszę - dużo za dużo?


    A co jeszcze zostanie? Chyba nic.;)
  • #58
    wozo
    Level 11  
    PRL wrote:

    A co jeszcze zostanie? Chyba nic.;)

    Czyli faktycznie przegiąłem...
    No nic , będę musiał walczyć dalej sam.
    Pętelka , którą mam (makro) pięknie skacze po arkuszach i wywołuje makro do wysyłki email , przerobiłem to makro aby wysyłało na adres z komórki "D1" z aktywnego arkusza - no i ładnie to wysyła.
    Przecież nie pisałem "macie mi to zrobić" tylko "czy można prosić"
    Dzięki.
  • #59
    PRL
    Level 40  
    Quote:
    Przecież nie pisałem "macie mi to zrobić" tylko "czy można prosić"


    A ja zakończyłem zdanie uśmieszkiem.:)

    Co Ci nie działa z wysyłaniem.
    Pokaż proszę makro, które wysyła.
  • #60
    wozo
    Level 11  
    :-) Uff... , ulżyło mi.
    Ja to chyba muszę wrócić do szkoły żeby się nauczyć pisania ze zrozumieniem, bo nic nie pisałem ostatnio, że mam problem z makrem do wysyłki email , a Ty tak to zrozumiałeś. Z resztą, kod do wysyłki już zamieszczałem we wcześniejszych postach.
    Ale do rzeczy:
    Potrzeba jest taka, aby Wasz kod uzupełnić o porównywanie czy nazwa klienta znajduje się w arkuszu "email" i jeśli tak to kopiowane byłyby dane z odpowiadających wierszy (do arkusza tego klienta) zgodnie z kolejnością - komórka z wiersza z kolumny "B" do komórki "D1" arkusza klienta , komórka z wiersza z kolumny "C" do komórki "E1" , i analogicznie z "D" do "F1". Jeśli nie byłoby danych w kolumnie C i D to oczywiście nic nie kopiuje. Te komórki D1:F1 trzeba by ukryć. Tyle zupełnie wystarczy. Jeżeli starczy sił i Waszych chęci to przydałby się końcowy
    komunikat (taki jak zrobił Marek w przypadku "brak wykonania dla klienta...") informujący o braku adresu email dla klienta jeśli by takowe wystąpiło (tylko dla kolumny "B". Ja niestety analizując Wasz kod nie "skumałem" co i gdzie dopisać aby to zrobić, zwłaszcza że klienci w arkuszu "email" są w wierszach a nie w kolumnach.
    Da radę? (proszę).