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 - Kopiowanie danych z innych plików do pliku zbiorczego-poprawa kodu

10 Sty 2013 21:36 10647 13
  • Poziom 7  
    Witam serdecznie

    Napisałem makro które kopiuje dane z wgranego pliku xls to arkusza zbiorczego. Jednak kod jest mało efektywny (kopiowanie trwa długo) oraz niekiedy nie kopiuje wszystkiego ;( Można jakoś poprawi kod aby działanie makra było szybsze? Z góry dzięki za pomoc

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam
  • Moderator Programowanie
    1. Jeśli nie kopiujesz formatów komórek, to metodę copy-paste zastąp prostym przypisaniem.

    2. Można wszystko zmieścić w jednej pętli. Gdyby jeszcze wystarczyła jedna instrukcja warunkowa... było by dwa razy szybciej.
  • Poziom 40  
    Podstawowa zasada w takich przypadkach: Application.ScreenUpdating = False na początku kodu oraz True - na końcu.
    Niepotrzebnie też wykonujesz tyle kroków: za każdym razem robisz Activate, Select i Copy. Zobacz np. w tym temacie jak można kopiować między arkuszami jednym poleceniem Copy.
  • Poziom 7  
    Z Application.ScreenUpdating dobry pomysł na pewno nie będzie tak skakać pomiedzy plikami.

    Jeśli chodzi o przypisania to nie wiem jak to ugryźć gdy ma to się odbyć pomiędzy dwoma plikami :(
  • Poziom 7  
    Może ktoś da jakąś podpowiedź jak takie przypisanie miałoby wyglądać, bo męczę się już sporo czasu a efektu nie widać :(
  • Pomocny post
    Poziom 40  
    Musisz ustawić zmienne odpowiedzialne za bieżący arkusz oraz arkusz z drugiego pliku, a następnie odpowiednio nimi manipulować przy kopiowaniu. Ja to robię zwykle w ten sposób:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Opcjonalnie można dodać sprawdzanie, czy plik o szukanej nazwie nie jest już otwarty - tylko że to dodatkowy kod.
  • Poziom 7  
    Dzięki za podpowiedź :) Mam tylko problem u mnie nazwa arkusza jest zawsze inna ( różne piliki są otwierane)- jak to obejść? I jest jeszcze problem z zakresami, w pliku docelowym ma on być kopiowany w pierwszy wolny zakres. Wiem że najlepiej byłoby to zrobić w pętli niestety nie wiem zbytnio jak (szczególnie jak mają być zagnieżdżone :( )

    Pozdrawiam
  • Pomocny post
    Poziom 40  
    Apidam napisał:
    Mam tylko problem u mnie nazwa arkusza jest zawsze inna ( różne piliki są otwierane)
    Zamiast
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    możesz podać numer arkusza, np.
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Apidam napisał:
    I jest jeszcze problem z zakresami, w pliku docelowym ma on być kopiowany w pierwszy wolny zakres.

    Więc tam, gdzie teraz jest przykładowo
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    wstaw
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 7  
    Dzięki za wskazówki :) Korzystając z Twoich rad wklepałem kod ale niestety jak wgrywam plik nic się nie dzieje, tj nie są przepisywane żadne wartości i nie mam pojęcia gdzie leży błąd.

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 40  
    Apidam napisał:
    Dzięki za wskazówki :) Korzystając z Twoich rad wklepałem kod ale niestety jak wgrywam plik nic się nie dzieje, tj nie są przepisywane żadne wartości i nie mam pojęcia gdzie leży błąd.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Przypuszczam, że diabeł jak zwykle tkwi w szczegółach...
    Po pierwsze: zrób przypisanie do arkusza tak, jak Ci proponowałem, nie
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    . Mój sposób jest "pewniejszy", ewentualnie upewnij się na 100%, że w zmiennej Dane masz referencję do otwartego pliku (np. zrób MsgBox (Dane.Name))

    Po drugie, przy pracy z dwoma arkuszami musisz być precyzyjny.
    Teraz masz:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    a musisz podać precyzyjniej:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    (wsSrc przy każdym Cells). Bez tego bierze Ci dane z aktywnego arkusza, tj. tego, z którego wykonuje się makro.
    Poza tym zakresy nie są dopasowane: od B do AC nie równa się od C do AB, tylko do AD. To też może mieć znaczenie.

    Po trzecie, zmienna FinalRow - z którego arkusza ustala ostatni wiersz? Jeżeli ma to być wsSrc, zrób wsSrc.Range(...), w tej chwili wydaje mi się, że liczy wiersze w arkuszu docelowym...

    I na końcu - możesz zastosować podaną wcześniej poradę z Application.ScreenUpdating na początku i na końcu makra.
  • Poziom 7  
    Sprecyzowałem kod, ale niestety tak jak wcześniej żadnego rezultatu. Po odpaleniu makra otwierany jest plik, chwila pracy, plik jest zamykany i nic. Nie przypisywane są żadne dane i nie wyskakują żadne błądy.

    Zgodnie z Twoją sugestią próbowałem z Twoim oraz moim sposobem do arkusza (kod poniżej z moim sposobem). Ale w oby przypadkach efekt ten sam :(
    Dla prostoty w kodzie poniżej zakresy kopiowania i przypisania są takie same.

    Nie mam pojęcia co i jak :(


    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 40  
    U mnie ten kod dokładnie taki jak wkleiłeś działa i kopiuje... Wejdź do kodu i wciskając F8 prześledź krok po kroku, czy kod wykonuje się tak, jak trzeba...
    A, jedna uwaga - w tej chwili kopiujesz wszystko do tej samej komórki, bo zmienna ost_w nie jest zwiększana. Przerób na:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Pamiętaj też, że ostatni wiersz w obu arkuszach ustalasz, jako ostatnią niepustą komórkę w kolumnie B.
  • Poziom 7  
    Dziękuje bardzo marcinj12 za pomoc. Okazało się że jak przeklepałem kod do innego pliku wszystko chodzi :) Jeszcze raz dzięki wielkie!

    Pozdawiam