Dość często początkujące osoby na różnych grupach zadają pytanie czy można jakoś zmusić Excela do tego, aby odkrycie ukrytej kolumny wymagało podania hasła. Inne często pojawiające się pytanie dotyczy tego czy można jakoś zmusić Excela aby użytkownik musiał podać hasło aby odczytać zawartość jakiegoś arkusza. Niestety Excel nie posiada takich możliwości.
Napisanie makra, które odkrywa kolumny/arkusze po podaniu hasła też nie jest dobrym pomysłem, gdyż zaawansowany użytkownik znajdzie sposób jak samodzielnie odkryć to co przed nim ukryłeś.
Zdaję sobie z tego sprawę, że mając jakiś skoroszyt z danymi pracowników chcesz wysłać innej osobie okrojoną wersję (np. same imiona i nazwiska pracowników wraz z numerami telefonów, ale już bez danych adresowych i numeru PESEL). Jedyne skuteczne rozwiązanie jakie mi przychodzi do głowy to skopiowanie wybranych danych do nowego skoroszytu i wysłanie takiego okrojonego skoroszytu.
Tak na marginesie: power-userzy pewnie powiedzą, że można tak zaprojektować model danych, aby wrażliwe można było pobierać z zewnętrznych baz danych do których dostęp należy uwierzytelnić loginem/hasłem, i odpowiednio ustawić aby pobierane dane nie były przechowywane w skoroszycie, ale to już jest wyższa szkoła jazdy.
W tym artykule opiszę jak dobrać się do danych, które ktoś przed nami ukrył na kilka różnych sposobów.
Pobierz przykładowy plik z ukrytymi arkuszami + „hakerskie” makra
Odkrywanie ukrytych kolumn, wierszy, arkuszy
Załóżmy, że ukryłeś w arkuszu kilka kolumn. Następnie, aby nie można było ich odkryć wpadasz na pomysł że przecież na karcie Recenzja znajduje się fajne polecenie Chroń arkusz. Dzięki temu nie będzie można odkrywać ukrytych kolumn.
Z kolei aby zablokować możliwość odkrywania ukrytych arkuszy można wybrać polecenie Chroń skoroszyt również znajdujące się na karcie Recenzja.

Jeśli nie wiesz jak działają owe polecenia odsyłam do wpisu: Excel – co zrobić, aby użytkownik nie mógł edytować wybranych komórek?
Niestety, ale to rozwiązanie nie jest zbyt dobre, gdyż w bardzo prosty sposób można zdjąć zarówno ochronę arkusza jak i ochronę skoroszytu bez znajomości hasła. A jak zdejmiemy ochronę to hulaj dusza, piekła nie ma! Jak usunąć hasło ochrony arkusza i skoroszytu opisałem w dość obszernej notce: Excel – zdejmowanie ochrony arkusza i skoroszytu bez znajomości hasła.
Odkrywanie arkuszy VeryHidden
No dobra, ale pewnie sobie pomyślisz: mogę przecież arkuszowi ustawić właściwość Visible na VeryHidden. Wtedy taki arkusz nie będzie widoczny po wybraniu polecenia Odkryj. Dodatkowo można założyć hasło na dostęp do projektu w edytorze VBA i z pozoru taki arkusz wydaje się niedostępny dla przeciętnego użytkownika (ten sposób opisałem w notce: Jak ukryć arkusz, aby się nie dało go odkryć?). Nic bardziej mylnego! Opiszę kilka trików:
Hakerskie narzędzie LibreOffice
Pakiet LibreOffice to taki darmowy odpowiednik MS Office. Dla przeciętnego użytkownika jest to świetną darmową alternatywą dla pakietu MS Office, osoby bardziej zaawansowane narzekają, że ten pakiet jest mocno zacofany względem głównego konkurenta. Jednak pewne niedoróbki mogą być zaletą: otóż pakiet LibreOffice totalnie ignoruje fakt, że arkusz jest typu Very Hidden. Już samo otworzenie skoroszytu wystarczy, aby ocenić, że są jakieś ukryte arkusze: na pasku stanu jest napisane: Arkusz 1 z 3 a jest widoczny tylko jeden arkusz. Gdy kliknę prawym przyciskiem myszy na dowolnej nazwie arkusza i wybiorę polecenie Pokaż arkusz…

Pojawi się okienko Pokaż arkusz a w nim są wymienione wszystkie ukryte arkusze (również te typu VeryHidden). I tutaj żadne makro nie da rady na LibreOffice.

Edycja pliku xl\workbook.xml
Już wielokrotnie na blogu wspominałem, że pliki w z rozszerzeniem XLSX (jak również XLSM) to tak naprawdę są to archiwa ZIP zawierające wiele różnych plików XML. Jeśli dany skoroszyt jest zapisany z rozszerzeniem XLS lub XLSB to należy zapisać skoroszyt w formacie: Skoroszyt programu Excel (*.xlsx) lub Skoroszyt programu Excel z obsługą makr (*.xlsm). Zanim przystąpimy do edycji zamknij program Excel. Upewnij się, czy posiadasz kopię pliku, który chcesz edytować. Następnie zmień rozszerzenie pliku na ZIP i go rozpakuj (ja zawsze używam do tego celu WinRara i wybieram opcję aby mi wypakował pliki do osobnego folderu)

Po rozpakowaniu archiwum przejdź do podfolderu o nazwie xl. Znajdziesz tam plik o nazwie workbook.xml, który należy otworzyć w notatniku (najlepszy do tego celu będzie jakiś notatnik dla programistów np. Notepad++, EditPad Pro bądź np. dla MacOS polecam Textmate). Możliwe, że trzeba będzie włączyć zawijanie wierszy, aby plik był czytelniejszy.

W notatniku znajdź ciąg znaków <sheets>. Pomiędzy znacznikami <sheets> a </sheets> będą się znajdowały informacje o arkuszach, jakie posiada ten skoroszyt.

Mój skoroszyt składa się z trzech arkuszy o następujących nazwach: Widoczny, Ukryty i VeryHidden. Nazwy tych arkuszy mówią same za siebie. Przeanalizujmy dokładnie zawartość pliku pomiędzy znacznikami <sheets> a </sheets> (dla zwiększenia czytelności dodałem w odpowiednich miejscach entery):
<sheets>
<sheet name="Widoczny" sheetId="1" r:id="rId1"/>
<sheet name="Ukryty" sheetId="2" state="hidden" r:id="rId2"/>
<sheet name="VeryHidden" sheetId="3" state="veryHidden" r:id="rId3"/>
</sheets>
Jak widzimy, aby ukryty arkusz był z powrotem widoczny należy usunąć ciąg znaków state="hidden" z kolei jeśli dany arkusz jest typu VeryHidden to należy usunąć następujący ciąg znaków: state="veryHidden".
I to wszystko, teraz tylko wystarczy zapisać zmiany w zmodyfikowanym pliku workbook.xml, wyjść o jeden folder wyżej a następnie wszystkie pliki z powrotem skompresować. Następnie należy zmienić rozszerzenie na XLSX (lub XLSM jeśli skoroszyt zawierał makra) i naszym oczom ukaże się piękny skoroszyt, w którym wszystkie arkusze są widoczne.


Odkrywanie wszystkich arkuszy za pomocą makra
Możemy również napisać makro, które spróbuje odkryć wszystkie arkusze w innym skoroszycie (co ciekawe, owe makro może znajdować się w dowolnym skoroszycie). Oto przykładowe makro, które wyświetla nazwy wszystkich arkuszy w skoroszycie o nazwie: ukryte arkusze.xlsx
Sub Podaj_Nazwy_Arkuszy()
Dim WS As Worksheet
For Each WS In Application.Workbooks("ukryte arkusze.xlsx").Sheets
MsgBox WS.Name, vbInformation
Next WS
End Sub
Jeśli chcemy możemy nieco przerobić owe makro, aby w danym skoroszycie odkrywało wszystkie arkusze
Sub Odkryj_Wszystkie_Arkusze()
Dim WS As Worksheet
For Each WS In Application.Workbooks("ukryte arkusze.xlsx").Sheets
WS.Visible = xlSheetVisible
Next WS
End Sub
Niestety, ale owe makro nie zadziała, gdy jest włączona ochrona skoroszytu (którą łatwo można zdjąć). Jednak znając nazwę ukrytego arkusza możemy bez problemu odczytać po kolei każdą komórkę (nawet jeśli jest włączona ochrona arkusza i jest odznaczona opcja Zaznacz odblokowane komórki).
Poniższe makro do arkusza o nazwie dane kopiuje zawartość 100 pierwszych komórek (zakres A1:J10) z arkusza VeryHidden znajdującego się w skoroszycie ukryte arkusze.xlsx
Sub Kradnij_Dane()
Dim F As String, W As Long, K As Long
Dim Dawca As Worksheet
Dim Biorca As Worksheet
On Error Resume Next
ThisWorkbook.Sheets("dane").Cells.Clear
Set Dawca = Workbooks("ukryte arkusze.xlsx").Sheets("VeryHidden")
Set Biorca = ThisWorkbook.Sheets("dane")
For W = 1 To 10
For K = 1 To 10
F = Dawca.Cells(W, K).FormulaR1C1
Biorca.Cells(W, K).FormulaR1C1 = F
Next K
Next W
End Sub
Wyżej wymienione makra znajdziesz w pliku o nazwie haker.xlsm.
Aplikacja Haker v 2.0
Po napisaniu prowizorycznych funkcji postanowiłem nieco rozbudować ową aplikację. Znajduje się ona w pliku haker v 2.0.xlsm. Utworzyłem prosty formularz na którym umieściłem listę rozwijaną (ComboBox) zawierającą wszystkie otwarte skoroszyty. Oprócz tego pod spodem zamieściłem listę (ListBox) zawierającą wszystkie arkusze w wybranym skoroszycie. Jeśli dany arkusz ma suffix [H] do znaczy, że ten arkusz jest ukryty. Gdy dany arkusz ma suffix [V] to oznacza, że jest on „bardzo ukryty”. Dla ukrytych arkuszy mam dwa przyciski: jeden pozwala odkryć wskazany arkusz a drugi kopiuje dane z ukrytego arkusza (aplikacja tutaj nie ogranicza się do zakresu A1:J10, tylko kopiuje tyle danych ile jest w danym arkuszu).

Podsumowanie
Jak widzisz ukrywanie wrażliwych danych nie jest najlepszym pomysłem, gdyż istnieje szereg sposobów na ich odkrycie. Mam nadzieję, że po przeczytaniu tej notki nigdy nie wpadniesz na pomysł wysłania do kogoś skoroszytu z ukrytymi danymi!