środa, 27 listopada 2013

Dynamiczne wymiary tablicy wielowymiarowej

Zgodnie z definicją dynamiczna tablica wielowymiarowa może zmienić swój rozmiar (ilość elementów) tylko w zakresie ostatniego jej wymiaru. Jeżeli więc zdefiniujemy naszą tablicę następująco:


to redefinicja wymiaru dotyczyć może tylko drugiego wymiaru, pierwszy wymiar zawsze pozostanie o stałej wielkości równej 1. Możliwe będą więc następujące dalsze procesy:


Możemy jednak stworzyć tablicę wielowymiarową jako złożenie dwóch tablic. W sytuacji tej każdy element tablicy głównej zawierał będzie tablicę podrzędną. Tak mógłby wyglądać zapis takiego rozwiązania:


Jak widać w powyższym przypadku wymiar tablicy głównej można swobodnie zmieniać jak również elementy tablicowe w jej wnętrzu mogą również posiadać różne wymiary. Rozwiązanie to posiada jednak swoje wady, z których części można zaradzić, o czym w dalszej części wpisu.

Wadą pierwszą jest to, że o ile w przypadku pierwszej tablicy dany element pobieramy korzystając z zapisu:


o tyle w drugim przypadku zapis ten jest następujący:


O ile z powyższym w większości przypadków radzimy sobie bez problemu, o tyle problem zasadniczy pojawia się w sytuacji, gdy próbujemy przenieść tablicę do komórek Excela. Dla powyższych przypadków (indeks wymiaru tablic to 2) zapisy te będą następujące:


Chcąc rozwiązać problem dot. tablicy myArrayB i skutecznie przenieść jej wartości do zakresu komórek arkusza wystarczy tablicę tą dwukrotnie transponować. Poniższa instrukcja umożliwia prawidłowe wykonanie tej operacji:

czwartek, 21 listopada 2013

Funkcja MID w roli operatora

Znana i powszechnie stosowana funkcja MID języka VBA jest nie tylko poleceniem zwracającym fragment tekstu, ale także operatorem, którego zadaniem jest podmiana fragmentu tekstu dla określonej zmiennej.

Wyobraźmy sobie taki tekst:"Uzupełnienie k..... przez f...... MID", w którym w miejsce kropek chcemy wstawić odpowiednie rozwinięcie wyrazów aby uzyskać tekst: "Uzupełnienie kropek przez funkcję MID".

Poniżej przedstawiam dwie proste procedury realizujące to zadanie, pierwsza z nich wykorzystuje funkcję MID w nowej roli. Druga z procedur da dokładnie ten sam efekt. Co jednak ciekawe- pierwsza procedura wykona się około 2-3 razy krócej niż druga.


Źródło powyższego działania funkcji MID zaczerpnąłem z tego pytania na StackOverflow.Com. Zainteresowane osoby zachęcam do zapoznania się z innym ciekawostkami zawartymi w odpowiedziach.  O niektórych z tych ciekawostek wspominałem już w swoich wpisach. O innych z pewnością kiedyś wspomnę w strefie wiedzy. Wiele z tych tematów poruszane podczas kursów VBA, które prowadzimy w Warszawie, Krakowie i Wrocławiu.

wtorek, 12 listopada 2013

TypeName i TypeOf- przydatne funkcje i operatory

Muszę przyznać, że prowadząc szkolenie z zakresu VBA zazwyczaj brakuje czasu aby zaprezentować i omówić dwie ważne instrukcje języka VBA: funkcję TypeName i operator TypeOf. Cel stosowania obu instrukcji jest podobny- określić rodzaj obiektu lub zmiennej. Sposób stosowania i wynik mogą być zgoła odmienne.

Spójrzmy na różnice i podobieństwa pomiędzy prezentowanymi instrukcjami przez pryzmat przykładów.

1. Sprawdzamy czy bieżące zaznaczenie odpowiada obiektowi określonego typu, tu: obiektowi Range
 


choć w obu wypadkach uzyskamy wyniku True proszę zwrócić uwagę, że wynikiem pracy funkcji TypeName jest ciąg tekstowy. TypeOf można użyć tylko w relacji do obiektu.


Oczywiście możemy dokonać podobnego sprawdzenia w relacji do zmiennej:

Nie mniej tylko instrukcja TypeName pozwala nam określić jakiego typu jest dana zmienna:

2. Jeżeli badana zmienna przyjmuje wartość Nothing operator TypeOf zwróci błąd a funkcja TypeName tekst Nothing:

3. Operator TypeOf zwraca wartości Prawda/Fałsz, funkcja TypeName zwraca ciąg tekstowy z nazwą typu zmiennej:

4. Operator TypeOf działa szybciej niż funkcja TypeName.

Dodatkowe informacje dot. w/w instrukcji można znaleźć tutaj:
TypeName
TypeOf

wtorek, 5 listopada 2013

Ograniczona ilość znaków w linii (MS Word)

Wyobraźmy sobie sytuację, że określonym dokumencie MS Word chcemy dokonać takiego podziału tekstu, aby w żadnej linii nie było więcej niż 30 znaków. Przykładowy paragraf, który pierwotnie wygląda następująco: 

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna. Nunc viverra imperdiet enim. Fusce est. 

chcemy automatycznie podzielić na następujące linie, z których żadna nie ma więcej niż 30 znaków: 

Lorem ipsum dolor sit amet,
consectetuer adipiscing elit.
Maecenas porttitor congue
massa. Fusce posuere, magna
sed pulvinar ultricies, purus
lectus malesuada libero, sit
amet commodo magna eros quis
urna. Nunc viverra imperdiet
enim. Fusce est.


Poniższe makro wykona za nas tą operację dla wszystkich paragrafów aktywnego dokumentu. Tym razem wszystkie uwagi, ciekawostki i założenia zostały omówione w postaci komentarzy wewnątrz kodu.