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.

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

wozo 21 Sty 2015 16:24 4428 73
  • #61
    PRL
    Poziom 35  
    Ja już kończę pracę.
    Jak Marek coś wyklika, to będzie, a jak nie, to obiecuję, że o 3ciej rano siądę do tego.

    Nigdy nie wdawałem się w takie tasiemce. Jedna pętla i się zrobiło już dwie strony na Elektrodzie.
    80% za dużo.
  • #62
    marek003
    Poziom 40  
    :arrow: wozo :) zwolnij troszeczkę. Wiem że jak spojrzysz w lustro to wydaje się, że Ty jesteś najważniejszy na świecie, tylko że każdy tak ma. :) Rzadko się zdarza, by ktoś na forum nie znalazł rozwiązania (ale może się zdarzyć) - trzeba czasami trochę poczekać (co przydaje się i autorowi takiego topiku, bo zaczyna sam myśleć :) ).

    Jak zaznaczyłem wcześniej, pomagam (jak inni na forum) kiedy mam czas - traktuję to jako zabawę (więc bez zobowiązań i terminów).
    Druga rzecz: nie tylko Ty oczekujesz pomocy - spójrz na nowe i stare wątki z excelem - więc ... :) tym bardziej jak zacząłem z kimś "polemikę" - to musi potrwać :)

    Kolejne "rzeczy" które wpływają na czas "reakcji" :) :
    Praca zawodowa (przyznam że dość ważna, bo inaczej ... ),
    Żona (oprócz "innych" rzeczy o których nie wspomnę) :) - akurat musiałem dziś naprawić ładowarkę [przerwę w kablu] do jej archaicznej komórki - dobrze że to tylko kabel :) )
    Dzieci ...
    Egzystencja (czasami trzeba coś zjeść i jak to się mówi załatwić potrzeby)
    Dziś dzień Babci (Jutro Dziadka) [ zadbałeś o swoich ? :) , masz pełny brzuszek? :) ],
    Imieniny Agnieszki,
    ... Jest jeszcze parę innych rzeczy, ale na razie je pominę.

    Wracając do "Twojego" programu:
    W załączeniu przykład z kodem który wysyła emaile - przerobiłem go trochę - procedurę, nie funkcję.
    Ze względu na czas realizacji (choć nie tylko) jest on pod "drugim kodem" (druga procedura) - innymi słowy wysyłanie maili jest "drugim" i oddzielnym krokiem pracy z plikiem.

    Poprawiłem też "pierwszy" kod zabezpieczając się przed pustą nazwą klienta, co powodowało błąd (przy testowaniu wyszedł).
    Ponieważ kod procedur z funkcjami zaczyna być zbyt długi dodaje tylko załącznik z makrem
    Przetestuj czy działa.

    A... jeszcze jedno: W wysyłaniu maila mogą się pojawić dwa komunikaty:
    1. Brak klienta na liści mailingowej
    2. brak adresu głównego dla danego klienta.
    Rozumiesz "niuans" ?
    Trzeba czytać dokładnie komunikaty :)


    Jak coś nie gra to pisz bo ... jestem już po duuuużym piwie. :)

    :arrow: PRL widzę że zmieniłeś awatar (czy jak się to mówi). Też ładny - to ta sama osoba? bo zmieniłeś profil twarzy i nie do końca jestem w stanie porównać z pamięci :)
  • #63
    PRL
    Poziom 35  
    Marek

    Dziewczyna na zdjęciu, to muzyk jazzowy z Hiszpanii - Andrea Motis.
    Bardzo utalentowana. Przepięknie gra i śpiewa. Niedawno ją odnalazłem na Youtube. Polecam zapoznać się z muzyką zespołu, w którym gra, jeżeli jazz Ci się podoba.:)

    Dla przykładu:
    - gdy była dużo młodsza - https://www.youtube.com/watch?v=YmKQOqUgFIM,
    - kilka lat później - https://www.youtube.com/watch?v=MuY4lVH_VLE.

    Resztę sobie wyklikasz.:)

    Poprzednio była Audrey Hepburn.
  • #64
    wozo
    Poziom 10  
    marek003 napisał:
    :arrow: wozo :) zwolnij troszeczkę.


    Zawsze jeżdżę zgodnie z przepisami :-)

    Cytat:
    Wiem że jak spojrzysz w lustro to wydaje się, że Ty jesteś najważniejszy na świecie,


    Nie żartujesz? Nie słyszałem żebym miał sobowtóra :-)

    Cytat:
    ... spójrz na nowe i stare wątki z excelem - więc ...


    Widziałem , widziałem -szacunek.

    Cytat:
    Dziś dzień Babci (Jutro Dziadka) [ zadbałeś o swoich ? :)


    Niestety od ponad ćwierć wieku nie mam możliwości odwiedzenia ich w swoich domach , a tam gdzie Oni obecnie "mieszkają" na razie się nie wybieram...

    Cytat:
    Imieniny Agnieszki,


    Pomyślności życzę!

    Cytat:
    Ze względu na czas realizacji (choć nie tylko) jest on pod "drugim kodem" (druga procedura) - innymi słowy wysyłanie maili jest "drugim" i oddzielnym krokiem pracy z plikiem.


    Tu nie tylko czas realizacji ma znaczenie , ale też oczywiście niewskazane by było aby maille wysyłały się automatycznie od razu po wykonaniu pierwszego kodu.
    Wiadomo , braki trzeba najpierw uzupełnić.

    Cytat:
    Poprawiłem też "pierwszy" kod zabezpieczając się przed pustą nazwą klienta, co powodowało błąd (przy testowaniu wyszedł).
    Ponieważ kod procedur z funkcjami zaczyna być zbyt długi dodaje tylko załącznik z makrem
    Przetestuj czy działa.

    Tu jesteś o krok do przodu (zapobiegawczo skracając długość topiku ;-) ) - kolejny punkt dla Ciebie. Wstyd mi się zrobiło, że o tym nie pomyślałem więc "włączyłem myślenie" i zrobiłem jeszcze inny test. O co chodzi widać na obrazku na dole. Dopisałem jednego producenta pomiędzy nr22 a 23 w "targecie" świadomie nie wypełniając danych no i jak widać skopiowały się dane z producenta23. Ten przykład podałem nie po to, aby prosić o poprawienie (będę musiał ten aspekt kontrolować "ręcznie") ale po to aby uświadomić nam (sobie?) jak jeszcze wiele rzeczy nie przemyślałem. Mam świadomość , że o tym aspekcie nic nie wspominałem.

    Cytat:
    A... jeszcze jedno: W wysyłaniu maila mogą się pojawić dwa komunikaty:
    1. Brak klienta na liści mailingowej
    2. brak adresu głównego dla danego klienta.
    Rozumiesz "niuans" ?
    Trzeba czytać dokładnie komunikaty :)

    I znowu krok przede mną:-). Znowu o tym nie pomyślałem, a Ty tak. Widać że moim problemem musiałem Ci zawalić umysł. "Burza mózgów":-).
    I teraz (prawie :-) ) na koniec - ten kod to istny majstersztyk i naprawdę chciałbym już Wam ostatecznie podziękować , ale...
    (VBA) EXCEL - przenoszenie i łączenie kolumn w nowych skoroszytach według filtru

    Jak widać na załączonym obrazku zagubiło się obramowanie z dwóch pierwszych kolumn. Chciałbym się tym zająć sam , ale jak wcześniej pisałem nie wiem jakie podać parametry aby zaznaczyć obszar do obramowania. "Na sztywno" (czyli wybierając zakres pierwszej i ostatniej aktualnie komórki) nie chcę tego robić bo mogą dojść wiersze.
    Proszę więc o podpowiedź jak podać zakres dla "Borders" , ale od wiersza drugiego bo wiersz pierwszy planuję ukryć. Nazwę klienta dołączę do treści wiadomości. Rozumuję , że ten zakres gdzieś w kodzie został wyliczony?
    Reasumując , nie zdawałem sobie sprawy, że mój pomysł będzie wymagał aż tyle pracy i trzech stron tematu :-). Ale tak to czasem bywa -nie?
    Czyli co , podpowiecie ten zakres abym ostatecznie Wam podziękował i dał już spokój?
  • #65
    marek003
    Poziom 40  
    Aby nie pojawiał się błąd dzielenia przez zero (ponieważ jest to kopiowane) możesz to łatwo poprawić sam.

    Wpisz w arkuszu wyliczenia w komórce D3 zamiast
    =C3/B3*100
    funkcję:
    =JEŻELI(B3="";"";C3/B3*100)
    i skopiuj w dół.

    Ilość wierszy w kolumnie A "przechowuje" zmienna "owt" a dla kolumny B zmienna "oww".
    W twoim przykładzie te ilości są takie same, niemniej jeżeli nastąpi różnica w wierszach między Target a Wykonanie to te ilości się rozjadą Co tez będzie widoczne na arkuszach klientów.

    edit
    ---------------------------------
    Dopiero zrozumiałem o co chodzi z producentem.

    Z jednej strony można ten przypadek szybko sprawdzić porównując właśnie owt z oww że jeżeli się rozjeżdżają to znaczy że coś nie gra.

    Jednak nie da się przewidzieć wszystkiego co może wymyśleć człowiek :)

    To że dodałeś producenta do target a nie do wykonania i rozjechała się tabela to jedno, bo jak zmienisz kolejność (wierszami) między target a wykonanie to też będziesz miał bzdury. Kolejna rzecz inny producent w target i całkowicie inny producent w wykonaniu w tym samym wierszu.
    Żeby się przed tym zabezpieczyć trzeba by było dopisać dodatkowa pętle sprawdzającą każdego klienta dla każdego producenta i zamiast kopiowania blokiem kopiować wierszami.
    Ostatecznie można to zrobić ale ciekawe jak wpłynęło by to na czas wykonania 78 pętli po 40 kroków każda ... Hmm...
  • #66
    PRL
    Poziom 35  
    Cytat:
    Żeby się przed tym zabezpieczyć trzeba by było dopisać dodatkowa pętle sprawdzającą każdego klienta dla każdego producenta


    A potem sprawdzić klienta w 'email', czy itnieje w 'Target' itd...;)
    Następnie przed wysyłką mejla pingnąć serwer, czy w danej chwili jest dostępny.
    Potem...
    Potem nazwać wszystko aplikacją i sprzedawać.;)

    wozo Do dzieła!
  • #67
    wozo
    Poziom 10  
    marek003 napisał:

    Ilość wierszy w kolumnie A "przechowuje" zmienna "owt" a dla kolumny B zmienna "oww".

    Do tego już doszedłem. Ale jak wybrać obszar , który aktualnie ma zakres A2:F38 , a za chwilę może mieć inny? Czyli potrzebuję zmienną dla kolumny F i zaczynam od drugiego wiersza , więc zakres (przyjmijmy że zmienna w kolumnie F to owf) , który mnie interesuje to Cells.(2,owf) - tak?

    Cytat:
    Z jednej strony można ten przypadek szybko sprawdzić porównując właśnie owt z oww że jeżeli się rozjeżdżają to znaczy że coś nie gra.

    Jak to zrobić? Dużo potrzeba do tego kodu?

    Cytat:
    Ostatecznie można to zrobić ale ciekawe jak wpłynęło by to na czas wykonania 78 pętli po 40 kroków każda ... Hmm...

    Dlatego doszedłem do wniosku , że będę to musiał robić "ręcznie". Nie miałem na myśli żeby Cię , albo kogoś innego o to prosić. Chyba że to :
    Cytat:
    ... Hmm...
    mogło oznaczać że podchodzisz do tematu ambicjonalnie i w ramach samodoskonalenia (
    Cytat:
    więc bez zobowiązań i terminów
    ) coś Ci chodzi po głowie. W takim wypadku nie mogę Ci przecież tego zabronić :-).
    No ale wtedy to by już wyszedł z tego prawdziwy kombajn.
    W podsumowaniu proszę więc o wskazanie (konkretnie) jak mam wskazać obszar aby dla całej tabeli od wiersza drugiego ustawić "Borders.LineStyle = xlDouble" , plus ewentualnie kawałek kodu , który porówna ilość owt z oww.

    Wielkie dzięki!

    Edit:

    [quote="PRL"]
    Cytat:
    ...
    Potem nazwać wszystko aplikacją i sprzedawać.;)
    wozo Do dzieła!


    Nie podejrzewasz mnie chyba o to???
    Chociaż faktycznie byłaby z tego wypasiona aplikacja. Niestety temat trzeba kończyć. Jak chcesz to mogę zadać pytanie dotyczące wybrania zakresu tabeli , która może mieć zmienną liczbę wierszy w nowym temacie. A ten ostatecznie zakończyć oczywiście olbrzymimi podziękowaniami.
  • #68
    PRL
    Poziom 35  
    Cytat:

    Cytat:
    Z jednej strony można ten przypadek szybko sprawdzić porównując właśnie owt z oww że jeżeli się rozjeżdżają to znaczy że coś nie gra.

    Jak to zrobić? Dużo potrzeba do tego kodu?


    A mówiłeś, że się uczysz VBA...
  • #69
    wozo
    Poziom 10  
    Analizując kod doświadczonych kolegów w konkretnym problemie. :-)
    Chciałbym się nauczyć , nie chcesz być jednym z nauczycieli? :-)
  • #70
    marek003
    Poziom 40  
    wozo napisał:
    Ale jak wybrać obszar , który aktualnie ma zakres A2:F38 , a za chwilę może mieć inny? Czyli potrzebuję zmienną dla kolumny F i zaczynam od drugiego wiersza , więc zakres (przyjmijmy że zmienna w kolumnie F to owf) , który mnie interesuje to Cells.(2,owf) - tak?

    Jak się zmieni "za chwilę" to i "owt" się zmieni.
    To dla jednej komórki: Cells(nr.wiersza,nr.kolumny)
    Jak chcesz zakres to: Range( Cells(nr.wiersza,nr.kolumny), Cells(nr.wiersza,nr.kolumny))

    Łatwiej? :)

    wozo napisał:
    Cytat:

    Z jednej strony można ten przypadek szybko sprawdzić porównując właśnie owt z oww że jeżeli się rozjeżdżają to znaczy że coś nie gra.

    Jak to zrobić? Dużo potrzeba do tego kodu?


    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Na razie za te pętle się nie biorę :) nie mam czasu.



    PRL napisał:
    Bardzo utalentowana. Przepięknie gra i śpiewa. Niedawno ją odnalazłem na Youtube. Polecam zapoznać się z muzyką zespołu, w którym gra, jeżeli jazz Ci się podoba.

    Powiem tak jazz mi nie przeszkadza :) Jak już to bardziej standardy, niemniej od czasu do czasu coś nowoczesnego w ucho wpadnie. :)
    Co do dziewczyny, bardzo miła barwa głosu nie mówiąc o "efektach wizualnych" :) Nie omieszkam posłuchać paru kawałków - miłe dla ucha i oka. :)
  • #71
    PRL
    Poziom 35  
    Najlepszym nauczycielem jest internet.
    Ale nauczyciel musi mieć ucznia, który chce sięuczyć.:)
    Kiedy ja się uczyłem, to były powielane materiały. Powielane w sensie na powielarce.
    Teraz masz YT i Googla. Może bolączką jest problem wyszukiwania w naszym języku. Łatwiej znaleźć 'VBA Excel How to determine last cell in a column', aniżeli 'jak w excelu znaleźć ostatnią komórkę w kolumnie'.
    Chociaż pisząc ten tekst spawdziłem Googla i już się nieźle indeksuje w j. polskim.
    Jednak programowanie, jak zapewne wiesz, ogranicza sie do j. angielskiego i dlatego łatwiej znaleźć informacje w tym języku.
    A co najważniejsze, jeżli chodzi o Excela - nagrywanie makr.
    Podsumowując używaj internetu i... głowy.;)


    P.S. Z tym ostatnim u Ciebie nienajlepiej ostatnio.

    Czy Ty czasami nie próbujesz trollować?

    Cytat:
    Co raz bardziej tak mi się zdaje...
    Z jednej strony można ten przypadek szybko sprawdzić porównując właśnie owt z oww że jeżeli się rozjeżdżają to znaczy że coś nie gra.

    Jak to zrobić? Dużo potrzeba do tego kodu?
  • #72
    wozo
    Poziom 10  
    PRL napisał:
    ... głowy.;)

    P.S. Z tym ostatnim u Ciebie nienajlepiej ostatnio.

    Czy Ty czasami nie próbujesz trollować?


    Uwierz mi , że dużo czasu spędziłem wczoraj wieczorem czytając właśnie tematy w języku angielskim ,ale ponieważ równocześnie wykonuję inne prace zlecone (nie związane z tematem) brak czasu i być może niezbyt "czysty" jak tą chwilę umysł nie pozwoliły mi do końca tą tematykę zgłębić. Stwierdziłem więc że się Was zapytam - nie poproszę żebyście zrobili - tylko ZAPYTAM.

    Masz rację , być może rzeczywiście w realu moglibyśmy sobie usiąść przy piwie i wtedy być może mogli sobie pogadać. Tak to niepotrzebnie zaśmiecam to zacne forum.

    Dziękuję więc za dotychczasową olbrzymią pomoc i cierpliwość.
    Więcej już Was męczyć nie będę.

    PS. Marku -dziękuję za wskazówki , chociaż wydaje mi się że tak właśnie wczoraj próbowałem , ale być może zmęczenie wprowadziło jakieś błędy.

    Pozdrawiam!
  • #74
    wozo
    Poziom 10  
    Witam po przerwie,
    czas definitywnie zamknąć temat. Trochę czasu potrzebowałem na to aby zgłębić tajniki VBA i dokończyć mój pomysł na "tip top". Dzięki pomocy Marka i kol. PRL połknąłem bakcyla i się trochę podszkoliłem. Dopieściłem trochę kod wyjściowy aby tabelki końcowe ładnie wyglądały i aby dodać paski danych żeby zobrazować postęp wykonania. Niestety paski danych nie chciały się dołączać do tabelki w HTML więc obecnie oprócz tej tabelki wysyłane jest również jej "zdjęcie" , na którym te paski ładnie widać. Dodałem również wysyłanie każdego indywidualnego skoroszytu jako załącznika xls. jak to teraz wygląda pokazuję poniżej.
    (VBA) EXCEL - przenoszenie i łączenie kolumn w nowych skoroszytach według filtru
    Zachęcony postępami postanowiłem zrobić podobne zestawienie dla producentów.
    Przerobiony został oczywiście kod pierwotny , jedynie na początku dodałem import danych wyjściowych z transpozycją , usuwanie niezgodnych wierszy (różnica pomiędzy ilością w "Target" a "Wykonanie" i parę innych drobnych zmian.
    Gdyby nie pomoc na tym forum to pewnie jeszcze bardzo długo bym w tym temacie do niczego nie doszedł a tak analizując kod i podpierając się teorią jakieś postępy są.
    Jeszcze raz dziękuję.
    @PRL - mi już przeszło - a Tobie ? ;-)