piątek, 17 maja 2013

Blokada własnej funkcji po stronie Excela

Pytanie z jednego z forum wydało mi się na tyle ciekawe, że postanowiłem przedstawić swoją odpowiedź także i w tym miejscu.

Pytanie owo brzmiało: czy da się stworzyć funkcję własną użytkownika tak, aby była dostępna po stronie środowiska VBA/IDE (możliwość wywoływania z okna Immediate lub innych procedur i funkcji) i aby nie była dostępna po stronie komórek w arkuszu. Ponieważ nie da się wykluczyć dostępności funkcji po stronie Excela możemy jedynie zwrócić inny jej wynik jeżeli wywołana zostanie właśnie w dowolnej komórce arkusza. Do tego zmierzać będzie więc rozwiązanie.

Pierwsza myśl to zastosowanie słowa kluczowego Private przed deklaracją funkcji. Otóż słowo to sprawia, że funkcja nie jest wyświetlana w podpowiedzi natomiast nie sprawia, że funkcja nie jest dostępna. Innymi słowy- jeżeli ktoś zna nazwę naszej funkcji może z niej skorzystać w dowolnej komórce Excela.

Rozwiązanie, które zaproponuję opiera się o sprawdzenie skąd pochodzi wywołanie funkcji (Application.Caller). Jeżeli wynik zwraca wartość Range to znaczy to, że funkcja wywołana jest z aplikacji Excel. Rozwiązanie to nie jest jednak wystarczające. Okazuje się, że jeżeli nasza funkcja jest wykorzystywana w obliczeniach pośrednich innej funkcji wywołanej z Excela to również otrzymamy informację jakoby wywołanie pochodziło z komórkek Excela. Dlatego też niezbędna jest dodatkowa weryfikacja, czy w wywołaniu użyto nazwy naszej funkcji.

Aby nie przedłużać teorii przedstawię kod, który powinien wyjaśnić wszystkie wątpliwości:

Brak komentarzy:

Prześlij komentarz