VBA ZAJĘCIA NR 7! praca z plikami (kontynuacja zajęć 6) Dariusz Aksamit Wydział Fizyki Politechniki Warszawskiej Szkolenie Programowanie w języku Visual Basic for Application (VBA) Semestr letni 2017/2018
0. Pobierz zestaw danych do pracy www.knf.pw.edu.pl/~aksamit/vba/5.dane_do_folderow.rar Folder, w którym jest kilka podfolderów i luźnych różnych plików A w każdym podfolderze jest trochę różnych plików
1. Wypisz nazwy wszystkich plików w katalogu Opcja1: Ścieżka katalogu wpisana ręcznie
DIR Ponowne wywołanie Dir pobiera nazwę kolejnego element w folderze
Ponowne wywołanie wczyta kolejny plik z katalogu
2. Wypisz tylko FOLDERY w katalogu Opcja2: W tym, w którym znajduje się bieżący arkusz
ThisWorkbook.Path Odczytanie ścieżki aktualnego pliku - string
ChDir Zmiana ścieżki
Co różni folder od pliku??
Co różni folder od pliku?? Tak, brak kropki w nazwie, bo nie ma rozszerzenia (plik musi mieć, folder zakładamy, że nie ma) Zatem:
Ta linijka jest zbędna
Jeśli jest różne od zera = funkcja zwróciła położenie kropki = była tam kropka = nie jest to folder = nic nie rób, weź następny plik
Jeśli jest równe zeru = nie ma w nazwie kropki = jest to folder (nasze założenie) = wypisz jego nazwę = i wczytaj następny plik
3. Wczytaj wszystkie EXCELE w wybranym katalogu do kolejnych (nowych) arkuszy
3. Wczytaj wszystkie EXCELE w wybranym katalogu do kolejnych (nowych) arkuszy Czyli: mamy skoroszyt główny, do którego będziemy kopiować wywołujemy funkcję Dir(sciezka) otwieramy wybrany skoroszyt kopiujemy interesującą nas zawartość tworzymy nowy arkusz wklejamy w miejsce docelowe zamykamy kopiowany skoroszyt powtarzamy dla kolejnego skoroszytu ThisWorkbook zmienna = Dir() Workbooks.Open Range().Copy Worksheets.Add ActiveSheet.Paste Workbooks.Close zmienna = Dir
Wybierz któryś z folderów Opcja A: wrzuć excela do folderu wyżej i zrób ThisWorkbook.Path i potem nazwę wybranego folderu Opcja B: wpisz z palca sciezka=( blablabla).../alanina/
A) Jak otworzyć skoroszyt? Workbooks.Open (sciezka & nazwa_pliku) Workbooks.Open Filename:=sciezka & nazwa_pliku Workbooks( nazwa ).Close
Kopiujemy ale co jest w naszych plikach?
Dwie kolumny po 2000 wierszy Pierwsza taka sama w obrębie folderu (tj. jednej serii pomiarowej)
Kopiujemy ale co jest w naszych plikach? Oczywiście powinniśmy sprawdzić z automatu co tam jest (przy użyciu jakiej funkcji?), ale w tym ćwiczeniu skupiamy się na obsłudze plików, więc robimy (na razie) na sztywno.
B) Jak skopiować zawartość? kopiowanie.xlsm
B) Jak skopiować zawartość? kopiowanie.xlsm
B) Jak skopiować zawartość? kopiowanie.xlsm
B) Jak skopiować zawartość? kopiowanie.xlsm
B) Jak skopiować zawartość? kopiowanie.xlsm Przeniesienie kodu do następnej linii
B) Jak skopiować zawartość? kopiowanie.xlsm UWAGA: różnie może być z rozszerzeniem standardowy.xls nie trzeba podać, inne tak (sprawdzić)
C) Jak dodać nowy arkusz? Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = nazwa
C) Jak dodać nowy arkusz? Za każdym razem doda nowy arkusz na samym końcu Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = nazwa
C) Jak dodać nowy arkusz? Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = nazwa Jeśli to będzie w pętli i będzie kod nazwa = Dir To każdy arkusz będzie się nazywać jak plik, który tam skopiowano
C) Jak dodać nowy arkusz? Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = nazwa
C) Jak dodać nowy arkusz? Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = nazwa (tak, ten zapis da się skrócić, korzystając z konstrukcji With End With, ale może nie za dużo rzeczy na raz?)
3. Wczytaj wszystkie EXCELE w wybranym katalogu do kolejnych (nowych) arkuszy Czyli: mamy skoroszyt główny, do którego będziemy kopiować wywołujemy funkcję Dir(sciezka) otwieramy wybrany skoroszyt kopiujemy interesującą nas zawartość wklejamy w miejsce docelowe w nowy arkusz zamykamy kopiowany skoroszyt powtarzamy dla kolejnego skoroszytu ThisWorkbook zmienna = Dir() Workbooks.Open Range().Copy ActiveSheet.Paste Workbooks.Close zmienna = Dir
BRAWO! Działa:) Prawda?
BRAWO! Działa:) Prawda?
Następny slajd zostaje na następne zajęcia:) Czyli na 18.04.2018
Ale jest wkurzający komunikat wiele razy
Ale jest wkurzający komunikat wiele razy 'żeby nie pytał o dane w schowku Application.CutCopyMode = False Workbooks(kolejny_plik).Close
I jeszcze ekran tak mryga przy otwieraniu
Application.ScreenUpdating = False/True Żeby okna nie migotały Ale jeśli zrobicie False i program się przerwie przed ustawieniem True, to nie będziecie mogli nic kliknąć dobrze mieć oddzielne makro robiące True, na wszelki wypadek
4. Wczytaj wszystkie EXCELE w wybranym katalogu do jednej zakładki Wiedząc, że pierwsza kolumna w każdym pliku (w danym folderze) jest identyczna. Czyli kolumnę A jest sens skopiować tylko raz, a potem kolejne kolumny B doklejać do tego co jest.
Taki plan
BRAWO:D
5. Wczytaj wszystkie EXCELE w podkatalogach Wczytaj każdy katalog do oddzielnej zakładki, a wszystkie pliki z katalogu do odpowiadającej mu zakładki
5. Wczytaj wszystkie EXCELE w podkatalogach Wczytaj każdy katalog do oddzielnej zakładki, a wszystkie pliki z katalogu do odpowiadającej mu zakładki 1. '------odczytaj katalogi i utworz zakladki o takich nazwach------------ 2. '------otworz katalog o nazwie jak nazwa zakladki i wez stamtąd pliki-----
5. Wczytaj wszystkie EXCELE w podkatalogach Wczytaj każdy katalog do oddzielnej zakładki, a wszystkie pliki z katalogu do odpowiadającej mu zakładki 1. '------odczytaj katalogi i utworz zakladki o takich nazwach------------ 2. '------otworz katalog o nazwie jak nazwa zakladki i wez stamtąd pliki-----
5. Wczytaj wszystkie EXCELE w podkatalogach Wczytaj każdy katalog do oddzielnej zakładki, a wszystkie pliki z katalogu do odpowiadającej mu zakładki 1. '------odczytaj katalogi i utworz zakladki o takich nazwach------------ 2. '-----otworz katalog o nazwie jak nazwa zakladki i wez stamtąd pliki-----