Programowanie w VBA Rodzaje plikw Obsuga pliku sekwencyjnego
Programowanie w VBA Rodzaje plików. Obsługa pliku sekwencyjnego.
Dodatkowe funkcje tekstowe • Przypomnienie: Left, Right, Mid, Trim, RTrim, Len; • In. Str: In. Str (<start>, <tekst>, <wzorzec>) <wzorzec> i <tekst> mogą być zmiennymi tekstowymi, łańcuchami danych, w szczególności jednym znakiem; funkcja In. Str 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ę In. Str 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 2plik. txt”) • Uproszczeniem jest użycie metody Application. Get. Open. Filename lub Application. Get. Save. As. Filename otwierające okienko dialogowe z folderami i ich zawartością oraz przechwytujące ścieżkę wybranego pliku do zmiennej, np. : • sciezka = Application. Get. Open. Filename • 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, 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. Get. Open. Filename(„Text. Files (*. txt), *. txt”) • funkcja Get. Open. Filename 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. Get. Open. Filename("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. Get. Save. As. Filename(); Dim sciezka As Variant sciezka = Application. Get. Save. As. Filename(, "Text Files (*. txt), *. txt") • funkcja Get. Save. As. Filename 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. Get. Save. As. Filename(, "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 zaj 09. xls zamieszczono program Przyklad wykorzystujący czytanie i zapisywanie pliku (tymczasowym miejscem przechowywania danych jest List. Box 1 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 List. Boxa kolejno symbole, nazwy lub masy zależnie od tego, co zostało wybrane w Option. Buttonach;
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.
- Slides: 14