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 - makro kopiujące kolejno z wielu plików

23 Cze 2010 09:24 6565 5
  • Poziom 9  
    Witam i proszę o pomoc - jeśli jest to możliwe.
    Stworzyłem makro kopiujące dane kolejno z wielu plików do pliku docelowego:
    'kopiowanie z pliku 01 do docelowego w wierszu 5:
    Windows("plik_01.xls").Activate
    Range("P4").Select
    Selection.Copy
    Windows("docelowy.xls").Activate
    Range("$C$5").Select
    Selection.PasteSpecial Paste:=xlPasteValues
    'kopiowanie z pliku 02 do docelowego w wierszu 6:
    Windows("plik_02.xls").Activate
    Range("P4").Select
    Selection.Copy
    Windows("docelowy.xls").Activate
    Range("$C$6").Select
    Selection.PasteSpecial Paste:=xlPasteValues
    'itd.

    Makro działa, ale ponieważ plików będę miał wiele (ok. setki), to muszę kolejne sekwencje kopiować sto razy i za każdym razem zmieniać nazwę pliku wyjsciowego raz poprawiać wiersz docelowy na jeden niżej. Nazwy zmieniają sie co miesiąc, więc roboty co miesiąc sporo.
    Stąd moje pytanie: czy można udoskonalić makro tak, aby nazwy plików wyjściowych brało kolejno np. z tabeli lub listy a pobraną wartość wstawiało w kolejnych wierszach w pliku docelowym - a jeśli tak, to byłbym wdzięczny za wzór.
    Pozdrawiam
  • Poziom 14  
    "Czy można udoskonalić makro" - no jasne że można.
    Zamiast :
    Windows("plik_01.xls").Activate
    Piszesz:
    Windows(s+".xls").Activate
    Gdzie s to zmienna typu string do której podstawiasz dowolny tekst z dowolnego źródła (tabeli, arkusza, bazy danych, pliku tekstowego ... co tylko wyobraźnia podpowie).
  • Poziom 9  
    Niestety, tak biegły to ja nie jestem...
    Jak stworzyć zmienną typu string, do której podstawię swój tekst?
    I jak wtedy zmieniać kolejne wiersze w pliku docelowym?
    Sorry, ale moja wiedza o VBA jest na poziomie rejestratora makr...
    Będę wdzięczny za jakiś przykład...
  • Poziom 20  
    Wygląda na to, że potrzebujesz wartości z pojedynczych komórek:
    Cytat:
    'kopiowanie z pliku 01 do docelowego w wierszu 5:
    Windows("plik_01.xls").Activate
    Range("P4").Select
    Selection.Copy
    Windows("docelowy.xls").Activate
    Range("$C$5").Select
    Selection.PasteSpecial Paste:=xlPasteValues

    A może poprostu pokombinuj z takimi formułami:
    Code:
    =[plik2.xls]Arkusz1!$B$4
    
    =[plik2.xls]Arkusz2!$C$5
    =[plik2.xls]Arkusz3!$B$2
    =[plik3.xls]Arkusz1!$A$3

    Zmiany w arkuszach plik2.xls i plik3.xls będą powodowały zmiany w arkuszu docelowym. W ten sposób zbierałem wiele danych rozproszonych w różnych arkuszach.
  • Poziom 28  
    Rozwiązaniem problemu jest zastosowanie pętli:
    Code:
    For i= ... to ...
    
    ...
    Next

    Biorąc pod uwagę nazewnictwo plików zastosowałbym:
    Code:

    Workbooks.Open FileName:="ścieżka\plik_" & i & ".xls"

    gdzie i będzie kolejnym numerem w nazwie pliku. Zrezygnowałbym tu z poprzedzającego zera. W przypadku tej pętli wszystkie powtarzające się polecenia wystarczy wpisać tylko raz.

    Dodane:
    Odpowiadając na pytania zadane wcześniej wiersz
    Code:
    Range("$C$5").Select 

    zamieniłbym na
    Code:
    Cells(i+4, 3).Activate

    wtedy przy początkowym i=1 pierwsze wklejenie odbędzie się do komórki C5 a następne o wiersz niżej każda.
  • Poziom 9  
    Każda z rad w części mi pomogła - bardzo dziękuję za pomoc!