piątek, 4 października 2013

Przechowywanie wartości zmiennych po zamknięciu pliku

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.

01Sub Write_Array_To_File()
02 
03    Dim Plik As String
04   
05    Dim fileNum As Integer
06   
07    Dim tblRange() As Variant
08        tblRange = Range("A1:E7").Value
09         
10'nasz plik wynikowy
11    Plik = "Array.To.File.VBA.bin"
12'gdy plik istnieje to uprzednio go skasujemy _
13wymagana obsługa błędów na okoliczność gdy plik nie istnieje
14    On Error Resume Next
15        Kill Plik
16    On Error GoTo 0
17     
18'procedura tworzenia pliku
19    fileNum = FreeFile
20   
21    Dim arrLen As Long
22'parametr długości wg pomocy z MSDN: _
23=2 + ilość wymiarów * 8 + _
24    wielkość wymiaru 1 * wielkość wymiaru 2 * ilość wymiarów
25'w praktyce wartość ta jest za mała i zwraca błąd, dlatego _
26    eksperymentalnie została dodana dodatkowa wartość
27'opcjonalnie można ustawić wartość na poziom max = 32767
28    arrLen = (2 + 2 * 8) + _
29            (UBound(tblRange, 1) * UBound(tblRange, 2) * 2) + 255
30     
31'otwieramy plik do zapisu i wywołujemy instrukcję Put
32    Open Plik For Random As #fileNum Len = arrLen
33        Put #fileNum, 1, tblRange
34    Close #fileNum
35 
36End Sub

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)

01Sub Read_Array_From_File()
02    
03    Dim Plik As String
04    Dim fileNum As Integer
05    Dim tblRange() As Variant
06 
07'plik musi znajdować się w domyślnej lokalizacji
08    Plik = "Array.To.File.VBA.bin"
09    fileNum = FreeFile
10 
11    Dim lenAAA As Integer
12'nie znamy wielkości tabeli- ustawiamy max wartość parametru
13        lenAAA = 32767
14     
15'otwarcie pliku i odczyt zwaratości do zmiennej
16    Open Plik For Random As #fileNum Len = lenAAA
17        Get #fileNum, 1, tblRange
18    Close #fileNum
19  
20'przeniesienie tabeli do arkusza względem aktywnej komórki
21    ActiveCell.Resize(UBound(tblRange, 1), UBound(tblRange, 2)) = tblRange
22End Sub

Przydatne linki referencyjne do strony Microsoft MSDN:

Put Statement
Get Statement

Brak komentarzy:

Prześlij komentarz