140 likes | 309 Views
Programowanie w VBA. Rodzaje plików. Obsługa pliku sekwencyjnego. Dodatkowe funkcje tekstowe. Przypomnienie: Left, Right, Mid, Trim, RTrim, LTrim, Len; InStr: InStr (<start>, <tekst>, <wzorzec>)
E N D
Programowaniew VBA Rodzaje plików. Obsługa pliku sekwencyjnego.
Dodatkowe funkcje tekstowe • Przypomnienie: Left, Right, Mid, Trim, RTrim, LTrim, Len; • InStr: InStr (<start>, <tekst>, <wzorzec>) <wzorzec> i <tekst> mogą być zmiennymi tekstowymi, łańcuchami danych, w szczególności jednym znakiem; funkcja InStr zwraca numer znaku od którego w <tekst> pojawia się po raz pierwszy <wzorzec>; <start> ustala od którego znaku <tekst> zaczyna szukać. Aby zagnieździć funkcję InStr w ramach funkcji tnących tekst, należy pamiętać o odjęciu jedynki od wyniku!
Plik sekwencyjny i swobodny Plik sekwencyjny to plik zapisywany liniami o dowolnej zawartości, chociaż w przypadku danych linie powinny zawierać stałą liczbę pól; Odczytywany po linii (tryb Input), zapisywany po linii na końcu pliku (tryb Append), albo kasujący zawartość dotychczasową, o ile takowa istniała (tryb Output); Plik o zapisie swobodnym to plik zawierający następujące po sobie bezpośrednio rekordy, przy czym każdy rekord zawiera stałą liczbę tych samych pól zawierających zawsze taki sam typ danych (ale nie Variant, a String musi mieć ustaloną długość);
Dostęp do pliku sekwencyjnego • Podanie ścieżki jako łańcucha znaków (w formie adresu na dysku, np.: ”C:\Folder\Folder2\plik.txt”) • Uproszczeniem jest użycie metody Application.GetOpenFilename lub Application.GetSaveAsFilename otwierające okienko dialogowe z folderami i ich zawartością oraz przechwytujące ścieżkę wybranego pliku do zmiennej, np.: • sciezka = Application.GetOpenFilename • Obie metody mogą używać filtrów zawężających krąg poszukiwanych plików (z góry nadany przez programistę – wówczas filtry podajemy w nawiasach za metodą);
Zapis i Odczyt • Zapis i odczyt następuje linijkami, komendami Line Input, Input, Print, Write; • Zapis Print jest do dowolnych tekstów, Line Input do odczytu dowolnych (potencjalnie) tekstów; • Zapis Write służy do zapisu danych w stałym formacie (pola), Input do odczytu takich danych (czyta ustalonymi polami, używa parsera); • Pętla czytająca plik musi zawierać limit w postaci rozpoznania końca pliku. • Koniec pliku jest osobnym znakiem, nr 26 (w tabeli ASCII), ale nie trzeba go bezpośrednio czytać, ponieważ w momencie, gdy komendy czytające plik natknął się na niego, funkcja EOF(<nr pliku>) jest ustawiana jako prawdziwa (EOF – End Of File);
Otwarcie pliku Open <ścieżka> For Input As #1 (numerów może być więcej, jeśli czytamy więcej plików naraz) • <ścieżka> to typ String – w cudzysłowach bezpośrednio, albo zmienna typu String gdzie indziej ustalona, albo: Dim sciezka As Variant sciezka = Application.GetOpenFilename(„TextFiles (*.txt), *.txt”) • funkcja GetOpenFilename uruchamia okienko wyboru pliku do odczytu i zwraca ścieżkę zaznaczonego pliku; • Line Input #1, <string> zwraca do zmiennej <string> linijkę z pliku #1; • EOF(1) – zwraca prawdę gdy skończy się plik;
Przykład Sub przyklad() Dim sciezka As Variant Dim linia_pliku As String Dim n As Integer n = 1 sciezka = Application.GetOpenFilename("Text Files (*.txt), *.txt") If sciezka <> False Then Open sciezka For Input As #1 While Not EOF(1) Line Input #1, linia_pliku Cells(n, 1).Value = linia_pliku n = n + 1 Wend Close #1 End If End Sub
Zapis do pliku Open <sciezka> for Output As #1 • (numer może być inny, <sciezka> to String wzięty na przyklad z funkcji Application.GetSaveAsFilename(); Dim sciezka As Variant sciezka = Application.GetSaveAsFilename(, "Text Files (*.txt), *.txt") • funkcja GetSaveAsFilename uruchamia okienko wyboru pliku do odczytu i zwraca ścieżkę zaznaczonego pliku; • Print #1, <String> wpisuje zmienną <String> lub dowolny tekst w cudzysłowach jako kolejną linijkę do pliku #1;
Przykład Sub abc() Dim sciezka As Variant Dim linia_pliku As String Dim n As Integer n = 1 sciezka = Application.GetSaveAsFilename(, "Text Files (*.txt), *.txt") If sciezka <> False Then Open sciezka For Output As #1 While Cells(n, 1).Value <> "" linia_pliku = Cells(n, 1).Value Print #1, linia_pliku n = n + 1 Wend Close #1 Endif End Sub
Przykład • W pliku zaj09.xls zamieszczono program Przyklad wykorzystujący czytanie i zapisywanie pliku (tymczasowym miejscem przechowywania danych jest ListBox1 z zadania 1, a więc najpierw trzeba wykonać zadanie 1);
A co z bazą danych? • Jeśli mamy dane w formie CSV (ang. Comma Separated Values = pol. Dane rozdzielone przecinkami), czyli w jednej linijce mamy wiele różnych rodzajów danych, ale każda linijka ma stały skład, przykładowo: symbol, nazwa, masa pierwiastka Cu,miedź,64 • Wówczas musimy pobierając dane użyć rozdzielania. Możemy napisać do tego oczywiście skomplikowaną funkcję operującą na łańcuchach znaków, ale najczęściej można skorzystać z gotowych narzędzi VBA, tzw. parsera – tu rozdzielającego dane automatycznie, np.: (przepisywanie do drugiego pliku tylko środkowej kolumny źródła): Input #1, symbol, nazwa, masa Write #2, nazwa
Obsługa pliku • Plan działania: Podanie ścieżki dostępu do pliku; Otwarcie pliku; Operacje na pliku; Zamknięcie pliku;
Zadanie 1 • Stworzyć formularz obsługujący bazę danych (uwaga, rozszerzenie .csv, a nie .txt) składającą się z trzech kolumn (symbol pierwiastka, jego nazwa i masa); • Formularz wczytuje do ListBoxa kolejno symbole, nazwy lub masy zależnie od tego, co zostało wybrane w OptionButtonach;
Zadanie 2 • Zmodyfikować program z zadania 1, wzbogacając go o grupę pól opcji (litowce, berylowce, fluorowce, lantanowce, aktynowce, wszystko) a następnie wypisujący wybrany rodzaj danych tylko dla wybranej grupy pierwiastków; • Dodać klawisz, który w wyniku przyciśnięcia uruchomi okno dialogowe zapisu pełnego kompletu danych dla aktualnie wybranej grupy pierwiastków do pliku o podanej przez użytkownika nazwie.