Transcript Wyklad 9

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>)
<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.