Pchełki VBA – Odcinek 12: Schowek

https://xpil.eu/WcZAQ

Jako wieloletni Bazyl, z odchyłami w kierunku hurtowni danych, muszę czasem pobawić się w tychże danych modelowanie. Modele danych dzielą się, w najszerszym ujęciu, na logiczne i fizyczne.

Modele logiczne próbują opisać dane w sposób przyjazny dla użytkowników końcowych: opisywane tam obiekty odnoszą się do elementów świata rzeczywistego (takich jak bank, kartofel czy komin), używa się tam też zwyczajowo oryginalnych, "ludzkich" nazw, a więc bulwa kartofla nazywać się będzie w modelu logicznym po prostu "Bulwa kartofla".

W odróżnieniu od modelu logicznego, model fizyczny odnosi się już do konkretnych obiektów w bazie danych - a więc trzeba się tu już trzymać pewnych konwencji nazewniczych. W szczególności, spacje w nazwach obiektów są zabronione. Dodatkowo, na ogół używa się wyłącznie wielkich liter (albo wyłącznie małych, w zależności od upodobań danej firmy). Tak więc bulwa kartofla w modelu fizycznym będzie się najprawdopodobniej nazywać "BULWA_KARTOFLA".

Proces modelowania zaczyna się od modelu logicznego, który jest następnie weryfikowany (w pocie, trudzie i znoju) z użytkownikami biznesowymi, a na koniec generuje się z niego model fizyczny. W najprostszym przypadku model fizyczny będzie dokładnym odwzorowaniem modelu logicznego, z uwzględnieniem nazw, które trzeba ubezspacjowić oraz zwielkoliterzyć.

Zaawansowane narzędzia do modelowania danych zazwyczaj wspierają generowanie modeli fizycznych z ich logicznych odpowiedników, poprzez zastępowanie spacji znakami podkreślenia oraz kapitalizację (czyli ww. zwielkoliterzanie) liter w nazwach obiektów. Niestety, czasem trafi się użytkownik nader sprytny, który zamiast z takiej automatyzacji skorzystać, po prostu skontrolcekontrofałuje model logiczny do modelu fizycznego, pozostawiając spacje i małe litery w nazwach obiektów fizycznych.

Pół biedy, jeżeli taki model trafi od razu do nas - wówczas możemy go bez większego żalu wykopać na orbitę i wygenerować jeszcze raz, porządnie, z modelu logicznego. Jednak w większych firmach nad takim modelem pracuje czasem kilka osób, i może się przydarzyć, że do nas trafi wersja modelu fizycznego już zmodyfikowana przez innych ludków. Na przykład, pani Krysia z sekretariatu najpierw skopiowała model fizyczny z logicznego (pozostawiając spacje i inne etcetery), następnie pan Kazimierz z działu Pozyskiwania Stolca dorzucił swoje trzy grosze, następnie pan Zygmunt z działu Pisuarów coś pozmieniał i tak dalej, i tak dalej. Wreszcie taki model trafia do nas, a naszym zadaniem jest upewnienie się, że jest on jadalny dla serwerów. Najbardziej czasochłonnym zajęciem jest tutaj na ogół ręczne przepisywanie nazw tabel / kolumn w taki sposób, żeby nie pozostawić żadnej spacji ani małej litery.

I tu oto pojawia się nasza pchełka VBA. A konkretniej mówiąc, kawałeczek kodu, który zmodyfikuje tekst w schowku systemowym na taki bez spacji i bez małych liter.

Tradycyjnie, najpierw kod:

Sub Clp1()
 Dim o As New DataObject
 o.GetFromClipboard
 o.SetText Replace(UCase(o.GetText), " ", "_")
 o.PutInClipboard
 End Sub

Pchełka tym razem jest naprawdę maleńka. Przyjrzyjmy się teraz poszczególnym liniom kodu:

Sub Clp1()

tworzymy nową procedurę i nazywamy ją Clp1. Procedura nie ma argumentów, więc w nawiasie nic nie ma.

Dim o As New DataObject

Deklarujemy zmienną o nazwie o, klasy DataObject (klasa DataObject jest dostępna w bibliotece Microsoft Forms 2.0 - proszę ją sobie dodać do referencji, w menu Tools => References), i w tej samej linii tworzymy instancję tej zmiennej (za pomocą słówka New).

Jeżeli ktoś nie do końca rozumie różnicę między klasą, deklaracją zmiennej danej klasy a utworzeniem instancji tej klasy, niech sobie pogmera, na przykład tutaj: http://pl.wikipedia.org/wiki/Klasa_(programowanie_obiektowe)

Krótko mówiąc, mamy teraz zadeklarowaną i utworzoną pustą zmienną o klasy DataObject.

o.GetFromClipboard

Metoda GetFromClipboard klasy DataObject pobiera zawartość schowka i wstawia ją do zmiennej o.

o.SetText Replace(UCase(o.GetText), " ", "_")

W tej linii dzieje się kilka rzeczy na raz. Takie zagnieżdżone formuły, w odróżnieniu od cebuli, trzeba analizować od środka. Po pierwsze więc, używamy metody GetText w celu odczytania zawartości zmiennej o. Następnie na tejże odczytanej zawartości wykonujemy funkcję UCase (zmiana wielkości liter na wielkie), której wynik z kolei przesyłamy do funkcji Replace, która podmienia fragmenty tekstu na inne. Funkcja ta wymaga trzech parametrów (gdzie szukać?, czego szukać?, na co zamienić?), tutaj parametrami tymi są: wynik funkcji UCase (czyli nasz zwielkoliterzony tekst), spacja (czego szukać?) oraz podkreślnik (na co zamienić?). Wreszcie końcowy wynik jest przekazywany do metody SetText klasy DataObject, która nadpisuje zawartość obiektu nową treścią.

Ostatnia linijka procedury to

o.PutInClipboard

Metoda PutInClipboard klasy DataObject wstawia zawartość obiektu do schowka systemowego (usuwając zeń poprzednią wartość).

Wreszcie

End Sub

kończy procedurę.

Jeżeli ktoś będzie próbował przerobić tę pchełkę w praktyce, może sie natknąć na ścianę nie do przeskoczenia - mianowicie, nie znajdzie na liście referencji biblioteki MS Forms 2.0, która jest niezbędna do używania klasy DataObject. Rozwiązanie jest trywialne, acz znalezienie go zajęło mi sporo czasu: otóż należy wstawić do naszego projektu VBA pusty formularz (prawomysz => Insert => User Form) a następne go usunąć. To spowoduje automatyczne dodanie referencji do MS Forms 2.0 do naszego projektu.

Voila!

https://xpil.eu/WcZAQ

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.