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, kopiowanie do innego pliku

krzewo12 10 Jan 2014 09:08 8841 28
  • #1
    krzewo12
    Level 9  
    Witam,

    Na samym początku chciałbym zaznaczyć, że nie mam wiedzy programistycznej i umiem napisać najprostsze makra (głównie za pomocą opcji "nagraj" :))
    Mam następujący problem, od którego już siwieje, mianowicie...
    Mam całe mnóstwo osobnych plików (ponad 300), które muszę zmodyfikować (tu dam sobie radę z macro), ale później dane z tego pliku muszę przenieść do innego pliku, gdzie mam zbiorczo uśrednione dane z tych 300 plików.

    Mówiąc bardziej obrazowo, chodzi mi o takie macro:
    Mam plik plik A1, plik A2, plik A3, który modyfikuję a następnie chciałbym żeby makro skopiowało mi z pliku A1 zakres A3 do AM3 i zapisało w pliku B. Następnie otwieram plik A2 i to samo, ale makro zapisuje skopiowany wiersz z pliku A2 w nowym wierszu pliku B i... tak dopóki nie dojdę do pliku A300.
    Jeśliby jeszcze makro zamykało i zapisywało zmiany w pliku A to byłoby super, ale i bez tego sobie poradzę.

    Z góry dziękuję za pomoc.

    PS mam excel 2010.
  • #2
    markoz7874
    Level 31  
    Otwórz plik B i nagraj makro dla 4-5 plików a następnie wklej tutaj - zobaczymy jak to wygląda i razem to poprawimy.
  • #3
    krzewo12
    Level 9  
    Wygląda to w ten sposób, że
    1. Otworzyłem plik B
    2. Otworzyłem plik A1
    3. Zaznaczyłem obszar danych i skopiowałem
    4. Wkleiłem do pliku B i kliknąłem kolejną komórkę w wierszu poniżej
    5. Powtórzyłem dla plików A2-A4...

    Code: vbscript
    Log in, to see the code
  • Helpful post
    #4
    markoz7874
    Level 31  
    Przerobiłem makro z innego wątku pobieranie danych z plików autorstwa PRL - sprawdź czy działa
    Umieść makro w plik B"plik B.xlsx"
    Code: vbnet
    Log in, to see the code

    Makro można napisać lepiej ale chciałem abyś zobaczył co jak zostało zmienione pod Twoje potrzeby makro PRL po dodaniu elementów z Twojego nagrywania.
  • #5
    adamas_nt
    Moderator of Programming
    Nie jest oczywiste, że pliki będą otwierane kolejno wg nazwy. Sortowanie w Windowsie nie jest liczbowe, a tekstowe (1, 10, 2, 20, etc)

    Jeśli z nazwy pliku można wyciągnąć adres docelowy (z offsetem), wtedy
    Code: vbscript
    Log in, to see the code
  • #6
    markoz7874
    Level 31  
    adamas_nt wrote:
    Nie jest oczywiste, że pliki będą otwierane kolejno wg nazwy. .

    Autor nigdzie nie napisał, że zależy mu na kolejności ale na wczytaniu 300 pozycji.
  • #7
    adamas_nt
    Moderator of Programming
    No tak. Zrozumiałem, że z plik A20 do Range(A21), Plik A213 do Range(A214), etc...
    Za to teraz ma wybór ;)
  • #8
    markoz7874
    Level 31  
    adamas_nt wrote:
    ..Za to teraz ma wybór ;)

    Inni czytający Twoje kody tez się czegoś uczą :) (przynajmniej ja chętnie przeglądam Twoje rozwiązania problemów)
  • #9
    krzewo12
    Level 9  
    markoz7874, adamas_nt przede wszystkim dzięki za pomoc!
    Właśnie próbowałem uruchomić oba makra i oba działają, ale... no właśnie...

    Po pierwsze:
    a) makro markoz7874 - przy kopiowaniu pomijane są przecinki w niektórych komórkach (nie wszystkich)
    b) makro adamas_nt - przy kopiowaniu wkleja formuły a ja potrzebuje liczby

    Po drugie:
    to na czym do tej pory pracujemy to były "pliki testowe". Całość jest bardziej skomplikowana...
    a) każdy plik A1, A2... muszę wcześniej zmodyfikować. Załóżmy, że chcę wstawić dodatkową komórkę i mam makro
    Code: vbscript
    Log in, to see the code

    Jak to wstawić do dotychczasowego makro żeby wszystko działało.
    b) nazwy plików są nieco inne, np. Czerwone1Ddecon-1, Czerwone1Bdecon-2, Czerwone1Bdecon-3, Zielone1Bdecon-1, Zielone1Bdecon-2, Niebieskie1Bdecon-1... czy z tym da się coś zrobić?

    Dodano po 5 [minuty]:

    PS nazwy plików wyglądają dziwnie, ale zostały zakodowane według określonego schematu:
    Grupa/Numer grupy/dekon/powtórzenie pomiaru, stąd
    Kolor/Cyfra + liczba/dekon (skrót nazwy analizy)/ cyfra
  • #10
    markoz7874
    Level 31  
    krzewo12 wrote:
    .. - przy kopiowaniu pomijane są przecinki w niektórych komórkach (nie wszystkich)
    ..
    to na czym do tej pory pracujemy to były "pliki testowe"..

    Przepraszam, ale brakuje mi cierpliwości. Po raz kolejny ktoś coś wkleja na forum, my rozwiązujemy problem, a następnie się okazuje, że ten ktoś tylko tak sobie robił testy a problem wygląda inaczej. Co stało na przeszkodzie aby od razu podać szczegóły zagadnienia z którym masz problem?
    Nie można było załączyć przykładowych plików abyśmy mogło przetestować czy wszytko działa prawidłowo?
    Skoro kolega robił tylko testy, rozumiem, że jest ambitny i z głównym problemem postanowił sobie samemu poradzić?
    Może kolega adamas_nt przejmie inicjatywę, mi torchę szkoda czasu na takie zabawy.
    pozdrawiam
  • #11
    krzewo12
    Level 9  
    Witaj markoz7874. Prawdę mówiąc nie wiem skąd Twoja irytacja... zamieszczając post nie chciałem nikogo obrazić ani urazić. Postanowiłem przedstawić problem na "plikach testowych", bo wydawało mi się, że wtedy prościej będzie napisać makro a następnie, w miarę "komplikowania całego układu" modyfikować już "powstałą konstrukcję". Ja przynajmniej tak zawsze robię, jak mam jakiś problem. Zaczynam od najprostszego przypadku a potem dodaję kolejne szczegóły.
    Nie jestem programistą i nie wiedziałem, że lepiej jest widzieć cały problem od razu.
    Ponadto pewne rzeczy zauważyłem dopiero teraz. Nie pomyślałem o przecinkach dopóki nie dostrzegłem, że się nie kopiują tak jak trzeba.
    Tak samo wydawało mi się, że poradzę sobie z dodaniem tych wcześniejszych modyfikacji pliku dopóki nie zobaczyłem, że makro działa na zasadzie pętli (o ile dobrze zrozumiałem) i nie wiem, gdzie wsadzić kod żeby nie zepsuć całości.
    Takie rzeczy wychodzą w praniu.
    Ostatnią rzeczą był fakt, że na prostszym przykładzie mi łatwiej będzie zrozumieć zasadę funkcjonowania makra. Najprawdopodobniej nie jest to ostatni problem jaki będę chciał rozwiązać w ten sposób w excel, wobec tego wolałbym następnym razem nie angażować ludzi na forum tylko sam to napisać.
    Tak czy owak, dzięki za dotychczasową pomoc i poświęcony czas oraz życzę mniej irytacji w życiu... :)
  • #12
    adamas_nt
    Moderator of Programming
    krzewo12 wrote:
    Ostatnią rzeczą był fakt, że na prostszym przykładzie mi łatwiej będzie zrozumieć zasadę funkcjonowania makra.
    Ok, masz ich kilka wyżej :)

    Pisanie bardziej złożonych programów to jak budowanie domku z kart. Można dobudować u góry, z prawej, ciut rozebrać i poprawić z lewej. Jeśli jednak okazuje się, że niedobre jest to w środku, nie pozostaje nic innego jak zgarnąć wszystko i zacząć od początku. Lepiej. Trening czyni mistrza (to nie moje).

    Zacznijmy więc od początku ;)
    Co chcesz zrobić (opisz w miarę precyzyjnie) i w jakiej (u licha) kolejności, bo też się pogubiłem :)
  • #13
    markoz7874
    Level 31  
    krzewo12 wrote:
    Zaczynam od najprostszego przypadku a potem dodaję kolejne szczegóły.
    Nie jestem programistą i nie wiedziałem, że lepiej jest widzieć cały problem od razu..
    .. pliku dopóki nie zobaczyłem, że makro działa na zasadzie pętli ..

    :)
    Przepraszam, pewnie miałem dzisiaj zły dzień.
    Nikogo nie obraziłeś.
    Nie mam pojęcia dlaczego masz jakiś problem z przecinkami - kopiowanie które jest w makrze nie jest uzależnione od żadnych przecinków - dlatego prosiłem załącz arkusz, bo skoro Twoja wiedza jest niewystarczająca, to diagnozę powinieneś zostawić innym.
    Nauka na mniejszym wycinku całości jest jak najbardziej właściwa, pod warunkiem, że uczysz się sam.
    Jeżeli masz problem z którym sam sobie nie radzisz, to przedstaw go dokładnie i w całości innym, załączając arkusze na których pracujesz.
    Ktoś Ci pomoże a kiedy będziesz zadowolony z efektów jestem pewien, że znajdą się chętni aby Ci wytłumaczyć jak działają elementy składowe.
    Najbardziej irytująca (przynajmniej dla mnie) jest "niekończąca się historia" - co bym nie odpowiedział ciągle są jakieś pytania o inne zagadnienia i nie wiadomo o co autorowi w końcu chodziło.
    Proponuje więc rozpisz po kolei dokładnie w punktach jaki masz problem? (podaj problem nie sugerując rozwiązania)
    Załącz pliki na których pracujesz.
    Zadawaj pytania o działanie makr kiedy problem już będzie rozwiązany.

    krzewo12 wrote:
    ..
    Nie jestem programistą i nie wiedziałem, że lepiej jest widzieć cały problem od razu..

    Programista też nie jestem - staram się uczyć, a materiału do nauki dostarczają mi koledzy tacy jak Ty natomiast dobrych wzorców koledzy tacy jak adamas_nt:)
    Masz rację, że programista nie musi znać całości zagadnienia, ale aby zlecić pracę programiście potrzebny jest ktoś kto bardzo dobrze zna zagadnienie i potrafi przekazać jakich danych dostarcza, co program ma robić i jakie dane mają być na wyjściu. TY natomiast zlecasz programiście zadanie, sprawdzasz co mu wyszło, po czym przepraszasz, że źle zdefiniowałeś problem bo tak naprawdę chodziło Ci o coś innego. Nie ma problemu jak masz programistów którym płacisz - za swoje pieniądze możesz ich testować ile dusza zapragnie.
    W naszym przypadku nikt nam nie płaci.Dlatego chcemy mieć satysfakcję, że komuś było się pomocnym i rozwiązało jakiś problem.
    A jedyna nagroda to, że ktos po wszytkim kliknie "przycisk pomógł", choć czesto się zdarza, że nawet tego nie uświadczysz :(
  • #14
    krzewo12
    Level 9  
    Postaram się tak wszystko opisać żeby znowu nie oberwać po głowie :)

    WSTĘP. W folderze mam (w kolejności alfabetycznej), jak już pisałem ponad 300 plików o nazwach. Czerwone1Bdekon-1, Czerwone1Bdekon-2 ..., Niebieskie1Adekon-1 ..., Zielone1Adenon-1 itd.
    Na każdym z tych plików muszę dodać kolejne obliczenia (zsumować dane z kilku kolumn), w każdym pliku to samo.
    Jeśli chodzi o tę część to nagrałem sobie następujące makro
    Code: vbscript
    Log in, to see the code


    Może nie jest idealne, ale działa.

    ZASADNICZA CZĘŚĆ PROBLEMU: chciałbym żeby po modyfikacjach makro działało w nastepujący sposób:
    - otwarcie pierwszego pliku "Czerwone1Bdekon-1"
    - wykonanie obliczeń (to co już zrobiłem i wkleiłem powyżej)
    - skopiowanie 3 linii z pliku "Czerwone1Bdekon-1"
    - wklejenie 3 linii pliku "Czerwone1Bdekon-1" do 1 linii pustego pliku o nazwie "Zbiorczo" (wklejenie jako liczby/tekst, a nie formuły)
    - zapisanie zmian w pliku "Czerwone1Bdekon-1" oraz jego zamknięcie
    - otwarcie kolejnego pliku w folderze, czyli "Czerwone1Bdekon-2"
    - wykonanie obliczeń na pliku "Czerwone1Bdekon-2"
    - skopiowanie 3 linii z pliku "Czerwone1Bdekon-2"
    - wklejenie 3 linii pliku "Czerwone1Bdekon-1" do kolejnej wolnej linii pliku "Zbiorczo"
    - zapisanie zmian w pliku "Czerwone1Bdekon-2" oraz jego zamknięcie
    ...
    i tak aż dojdzie do ostatniego pliku w folderze, czyli "Zielone4Ndekon-7"

    To byłaby sytuacja idealna...

    W razie czego załączyłem też plik źródłowy.
  • #15
    adamas_nt
    Moderator of Programming
    Po mojemu, powinno być coś w tym stylu (makro w module pliku "Zbiorcze")
    Code: vbscript
    Log in, to see the code
    Uzupełnij w to, czego brakuje. Źle czyta się makra z rejestratora ;)
  • #16
    krzewo12
    Level 9  
    Przepraszam, że tak późno odpowiadam, ale niestety nie miałem w tym tygodniu za bardzo czasu na zabawy z excel'em.
    Niestety makro nie działa poprawnie - formuły nie pobierają poprawnie danych (pomimo, że w makro wszystko wygląda OK) :( Spróbuję to jutro poprawić, bo świta mi gdzie może leżeć problem. Może mi się uda, jeśli nie... będę dalej prosił o pomoc :).
    Tak czy owak mam jeszcze kilka technicznych pytań na temat samego kodu (ale to może już jak uda się napisać makro tak aby już wszystko działało tak jak należy).
  • #17
    krzewo12
    Level 9  
    Niestety moje pomysły nie podziałały...
    Problem jest w tym, że

    .Columns(14 + i).Insert
    .Cells(2, 14 + i) = teksty(i)
    .Cells(3, 14 + i) = sumy1(i)

    działa normalnie, natomiast

    .Columns(27 + i * 2).Insert
    .Cells(2, 27 + i * 2) = teksty(i)
    .Cells(3, 27 + i * 2) = sumy2(i)

    już nie.
    Makro zamiast wstawiać te formuły

    sumy2 = Array("=SUM(S5:S100)", "=SUM(T5:T100)", "=SUM(Y5:Y100)", "=SUM(Z5:Z100)")

    sumuje wartości z kolumn 'W' oraz 'AA'.
    tak jakby 'widział'
    sumy2 = Array("=SUM(W5:W100)", "=SUM(W5:W100)", "=SUM(AA5:AA100)", "=SUM(AA5:AA100)")

    Jakieś pomysły?
  • #18
    adamas_nt
    Moderator of Programming
    No tak... Po wstawieniu kolejnych kolumn, formuły przesuwają się w prawo i zmieniają argumenty.

    Musisz przeliczyć, lub podstawiać formuły w osobnej pętli.
  • #19
    krzewo12
    Level 9  
    No właśnie problem nie polega na zwykłym przesunięciu kolumn i zmianie argumentów, bo wtedy przesunąłby wszystkie kolumny o n+3, dajmy na to. Natomiast część rzeczy jest przesunięta a część nie.

    Z resztą tak zmyślnie napisałeś to makro, że najpierw sumuje dane z kolumn najbardziej na "prawo", więc dodane kolejnych kolumn z lewej nie powinno już niczego zmienić. Przynajmniej tak normalnie działa Excel, że jeśli wstawisz dodatkową kolumnę to zakres danych formuły jest automatycznie poprawiany o tę wstawioną kolumnę...

    a co masz na myśli mówiąc "...podstawiać formuły w osobnej pętli"?
  • Helpful post
    #20
    adamas_nt
    Moderator of Programming
    krzewo12 wrote:
    a co masz na myśli mówiąc "...podstawiać formuły w osobnej pętli"?
    Wstaw kolumny, wpisz ręcznie formuły sumowania i przepisz argumenty do makra.
    Po zakończeniu pętli wstawiającej kolumny i nagłówki (usuń linię z wstawianiem sum), dopisz następną wpisującą tylko formuły.
  • #21
    krzewo12
    Level 9  
    No cóż jak już pisałem nie znam się na programowaniu, więc Twoja wskazówka nie przydała mi się :)

    tak czy owak zrobiłem to po swojemu i działa!

    ...ale czy możemy podyskutować, bo mam kilka pytań...
  • #22
    adamas_nt
    Moderator of Programming
    Pytaj Waść...
  • #23
    krzewo12
    Level 9  
    aaaaa. doszedłem do wniosku, że już na razie nie będę nikomu zawracał głowy głupimi pytaniami. Po prostu muszę się podszkolić w pisaniu makr :).
    Dzięki jeszcze raz.
  • #24
    grimed
    Level 10  
    Witam - chciałbym dołożyć pytanie do tego wątku.

    Mianowicie, czy można wykorzystać konkretną komórkę (przy użyciu funkcji cells (w, k), do tego by określić lokalizację danego pliku. Pytam, gdyż chciałbym w prosty sposób móc pobierać dane, bez konieczności ich każdorazowego otwierania i kopiowania.

    Code: vbscript
    Log in, to see the code


    Próbowałem różnymi metodami poradzić sobie z tym problemem, jednakże reprezentuję jeszcze eksperymentalny tryb pracy z Excelem, stąd też prośba o pomoc bądź wskazówki. Poniżej widok tabelki skąd przykładowo pobierane będą dane:

    Excel - makro, kopiowanie do innego pliku
  • #26
    JRV
    VBA, Excel specialist
    Witaj
    Jeśli dane są jedna za drugiej, a następnie
    Code: vbscript
    Log in, to see the code
  • #27
    grimed
    Level 10  
    Panie PRL - to jest właśnie to czego potrzebowałem. Dla zainteresowanych przesyłam kod rozwiązujący mój problem

    Code: vbscript
    Log in, to see the code


    Wszystko działa tak jak to było zaplanowane. Jednakże aby nie było zbyt słodko pojawił się problem, którego nie mogę rozwiązać. Mam nadzieję, iż ktoś z was zetknął się z podobną sytuacją.

    Otóż po wykonaniu kopiowania z danych plików zewnętrznych do pliku docelowego większość liczb zostaje przemnożona przez tysiąc bez jakiegokolwiek ingerowania w ich wartości.

    Poniżej pokazuję obraz danych źródłowych oraz obraz po wykonaniu makra

    Excel - makro, kopiowanie do innego pliku Excel - makro, kopiowanie do innego pliku

    Zastanawiam się czy nie jest to czasem wątek na osobny temat.
  • #28
    PRL
    Level 40  
    Spróbuj zamienić:

    Code: vbscript
    Log in, to see the code


    na:

    Code: vbscript
    Log in, to see the code


    Sprawdź również formatowanie komórek.
  • #29
    grimed
    Level 10  
    - Pierwsza opcja - Activesheet.Paste - ustawiłem tak już na samym początku, ale z racji na ten błąd kombinowałem z wklejaniem specjalnym. Niestety żaden z wariantów nie pomógł
    - Druga opcja - formatowanie komórek - świetny pomysł - okazało się że plik źródłowy posiada zapis ogólny - trzeba go było zamienić tylko na liczbowy. jednak przy otwieraniu pliku pojawiały mi się liczby w zupełnie innych wartościach (niektóre liczby od razu przemnożone przez 1000) więc wszystkie moje działania były na marne.

    - Na podstawie tego poszperałem trochę w sieci, trochę też sam zacząłem kombinować i takie oto coś wpadło mi w ręcę co rozwiązało problem do końca:

    Code: vbscript
    Log in, to see the code


    Oczywiście odpowiednio dopasowane do swojego makra dało rozwiązanie problemu. Dzięki za pomoc i pozdrawiam