Szukając odpowiedni na pytanie jak przechować zmienne po zamknięciu pliku przychodzi mi do głowy szereg pomysłów. Na początek wymienię kilka z nich- wykorzystując komórkę w arkuszu (tylko Excel), korzystając z właściwości dokumentu, korzystając z kolekcji Variables (tylko Word), korzystając z rejestru komputera (tylko lokalnie, nie przenoszone z plikiem).
Relatywnie ciekawą techniką jest jednak wykorzystanie instrukcji Put (dla zapisu) i Get (dla odczytu) z zapisem do pliku tekstowego. Rozwiązanie to mam kilka dodatkowych zalet:
1. można szybko i skutecznie przechować wartości tablic, co nie jest możliwe w rozwiązaniach alternatywnych,
2. utworzony plik tekstowy sprawia wrażenie zaszyfrowanego, nie każdy będzie w stanie odczytać jego zawartość.
Skoro są zalety to i zazwyczaj istnieją wady rozwiązania. Otóż i owszem- ograniczona wielkość zmiennej- dla tablicy będzie to niewiele ponad 3000 rekordów.
Jak działa taki mechanizm? Jak wygląda kod zapisu i odczytu?
Wyobraźmy sobie taką oto sytuację, że obszar tabeli Excela A1:E7 chcemy zapisać w postaci zmiennej tablicowej i przesłać w postaci pliku tekstowego do innej osoby.
W celu zapisu posłużymy się takim poniższym przykładowym kodem. Dodatkowe parametry zostały opisane w postaci komentarzy wewnątrz kodu.
01 | Sub Write_Array_To_File() |
05 | Dim fileNum As Integer |
07 | Dim tblRange() As Variant |
08 | tblRange = Range( "A1:E7" ).Value |
11 | Plik = "Array.To.File.VBA.bin" |
13 | wymagana obsługa błędów na okoliczność gdy plik nie istnieje |
23 | =2 + ilość wymiarów * 8 + _ |
24 | wielkość wymiaru 1 * wielkość wymiaru 2 * ilość wymiarów |
26 | eksperymentalnie została dodana dodatkowa wartość |
28 | arrLen = (2 + 2 * 8) + _ |
29 | (UBound(tblRange, 1) * UBound(tblRange, 2) * 2) + 255 |
32 | Open Plik For Random As #fileNum Len = arrLen |
33 | Put #fileNum, 1, tblRange |
Jeżeli operacja powiodła się w domyślnej lokalizacji znajdziemy plik o nazwie "Array.To.File.VBA.bin". Próba otwarcia tego pliku w prostych edytorach tekstu da nam następujący lub podobny efekt:
Plik jest niewielki i jednocześnie sprawia wrażenie jakoby zawartość była zaszyfrowana. Teraz możemy przesłać plik do odbiorcy.
W jaki sposób możemy odczytać nasz plik. Wystarczy uruchomić poniższą procedurę aby wartość naszej tabeli została wprowadzona do arkusza Excel począwszy od aktywnie zaznaczonej komórki. (Dodatkowe uwagi dot. kodu w postaci komentarzy poniżej)
01 | Sub Read_Array_From_File() |
04 | Dim fileNum As Integer |
05 | Dim tblRange() As Variant |
08 | Plik = "Array.To.File.VBA.bin" |
16 | Open Plik For Random As #fileNum Len = lenAAA |
17 | Get #fileNum, 1, tblRange |
21 | ActiveCell.Resize(UBound(tblRange, 1), UBound(tblRange, 2)) = tblRange |
Przydatne linki referencyjne do strony Microsoft MSDN:
Put Statement
Get Statement