Pokazywanie postów oznaczonych etykietą optymalizacja. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą optymalizacja. Pokaż wszystkie posty
piątek, 29 stycznia 2016
Konwersja typu Integer na Long
Ze względu na ograniczoną ilość czasu jaką obecnie dysponuję i jaką chciałbym poświęcać na publikację opisów zagadnień i problemów z zakresu VBA od czasu do czasu będę dodawał linki do ciekawych zagadnień z poświęconych programowaniu w VBA. Jako aktywny programista i trener bardzo często spotykam się z problemami, ciekawymi pomysłami oraz informacjami, które nie zawsze są powszechnie znane i wykorzystywane.
Zaczynam od informacji związanej z automatyczną konwersją zmiennych typu Integer (uważanych za przestarzały typ zmiennych) na zmienną typu Long. Co ważne, automatyczna konwersja działa tylko w systemach 32bit'owych. Dodatkowe informację znaleźć można pod tymi linkami:
MSDN: The Integer Data Types
StackOverflow: Why Use Integere Instead Of Long?
piątek, 8 maja 2015
Konwersja tablicy Array na Recordset
Tablice Array są istotnym elementem wielu rozwiązań tworzonych w VBA. Co zrobić jednak w sytuacji gdy określoną tablicę (jedno- lub wielowymiarową) chcemy przefiltrować ze względu na określone zmienne kryteria? W Excelu rozwiązanie to wydaje się być proste - przenieść tablicę do komórek Excela i zastosować filtrowanie. Co jednak zrobić w kodzie VBA stworzonym w innych aplikacjach z pakietu Office? Odpowiedź jest relatywnie prosta- należy przekonwertować tablicę Array na obiekt ADODB.Recordset aby następnie zyskać możliwość filtrowania danych zgodnie z zasadami języka SQL. Myślę więc, że każdy kto spotkał się z podobnym problemem może uznać niniejsze zagadnienie za interesujące.
Krok 1- tworzymy referencję do biblioteki ADODB z poziomu edytora VBA (Menu >> Tools >> References... >> zaznaczamy Microsoft ActiveX Data Objects 2.8 Library)
Krok 2- tworzymy tablicę array przenosząc komórki Excela do tablicy lub tworząc ją na poziomie kodu. Krok 3- tworzymy obiek ADODB.Recordset i konfigurujemy pola tego obiektu Krok 4- przenosimy dane z tablicy do obiektu Recordset Krok 5- tak utworzony obiekt możemy swobodnie filtrować korzystając z właściwości .Filter obiektu Recordset. W poniższym kodzie efekt filtrowania testujemy przenosząc wybrane wartości obiektu Recordset do komórek arkusza Excel.
Krok 1- tworzymy referencję do biblioteki ADODB z poziomu edytora VBA (Menu >> Tools >> References... >> zaznaczamy Microsoft ActiveX Data Objects 2.8 Library)
Krok 2- tworzymy tablicę array przenosząc komórki Excela do tablicy lub tworząc ją na poziomie kodu. Krok 3- tworzymy obiek ADODB.Recordset i konfigurujemy pola tego obiektu Krok 4- przenosimy dane z tablicy do obiektu Recordset Krok 5- tak utworzony obiekt możemy swobodnie filtrować korzystając z właściwości .Filter obiektu Recordset. W poniższym kodzie efekt filtrowania testujemy przenosząc wybrane wartości obiektu Recordset do komórek arkusza Excel.
poniedziałek, 24 lutego 2014
Kompilacja warunkowa #If...#End If
Tworząc określoną rozbudowaną aplikację w VBA naszym celem może być stworzenie jej w taki sposób, aby zależnie od zdefiniowanych parametrów jej przebieg był odmienny. Możliwe przykłady takich działań:
a) wersja testowa i ostateczna
b) wersja uruchamiana przez administratora i pozostałych użytkowników
c) wersja dla nowszych i starszych wersji aplikacji MS Excel/MS Office
W w/w i podobnych sytuacjach zasadne może się okazać wykorzystanie narzędzia kompilacji warunkowej.
Pierwszym krokiem będzie wskazanie elementów, parametrów kompilacji.
W tym celu w edytorze VBA należy uruchomić poniższe okno znajdujące się w Menu >> Tools >> VBAProject Properties... >> zakładka General. Następnie w ostatniej pozycji tego okna, "Conditional Compilation Arguments:", należy zdefiniować wszystkie niezbędne zmienne/warunki rozdzielając je symbolem dwukropka. Co ważne- nasze zmienne warunkowe mogą przyjmować tylko wartości liczbowe, tekst nie jest dopuszczalny.
Kolejny krok to umiejętne wykorzystanie stworzonych zmiennych warunkowych w naszym kodzie.
Kluczowe w tym momencie będzie wykorzystanie znaku # (sharp/hash), który musi wystąpić przed każdą linią instrukcji warunkowej #If...#ElseIf...#Else...#End If.
Przykład A) Zmienna warunkowa compVersion ma za zadanie wskazywać ten fragment kodu, który zostanie wykonany zależnie od zadeklarowanej wersji aplikacji.
Przykład B) W przypadku kompilacji wykonywanej przez administratora należy w powyższym oknie ustawić wartość compAdmin =1, kompilacja warunkowa przypisze zmiennej Pass hasło na hasło administratora, w innym wariancie poprosi użytkownika o podanie hasła
Przykład C) niepoprawny. Proszę zwrócić uwagę, że poniższy kod nie jest poprawny ze względu na brak symboli # na początku każdej linii instrukcji warunkowej. Przy próbie wywołania poniższego kodu uzyskamy informację o braku zadeklarowanej zmiennej compUser. Samo zdefiniowanie tej zmiennej w pierwszym kroku nie jest więc wystarczające.
Wskazówka! Stałe, parametry kompilacji można również zdefiniować wewnątrz kodu VBA zamiast w oknie VBAProject Properties zaprezentowanym w pierwszym kroku powyżej. W tym celu również niezbędne będzie wykorzystanie znaku # w celu utworzenia np. takiego fragmentu kodu:
a) wersja testowa i ostateczna
b) wersja uruchamiana przez administratora i pozostałych użytkowników
c) wersja dla nowszych i starszych wersji aplikacji MS Excel/MS Office
W w/w i podobnych sytuacjach zasadne może się okazać wykorzystanie narzędzia kompilacji warunkowej.
Pierwszym krokiem będzie wskazanie elementów, parametrów kompilacji.
W tym celu w edytorze VBA należy uruchomić poniższe okno znajdujące się w Menu >> Tools >> VBAProject Properties... >> zakładka General. Następnie w ostatniej pozycji tego okna, "Conditional Compilation Arguments:", należy zdefiniować wszystkie niezbędne zmienne/warunki rozdzielając je symbolem dwukropka. Co ważne- nasze zmienne warunkowe mogą przyjmować tylko wartości liczbowe, tekst nie jest dopuszczalny.
Kolejny krok to umiejętne wykorzystanie stworzonych zmiennych warunkowych w naszym kodzie.
Kluczowe w tym momencie będzie wykorzystanie znaku # (sharp/hash), który musi wystąpić przed każdą linią instrukcji warunkowej #If...#ElseIf...#Else...#End If.
Przykład A) Zmienna warunkowa compVersion ma za zadanie wskazywać ten fragment kodu, który zostanie wykonany zależnie od zadeklarowanej wersji aplikacji.
Przykład B) W przypadku kompilacji wykonywanej przez administratora należy w powyższym oknie ustawić wartość compAdmin =1, kompilacja warunkowa przypisze zmiennej Pass hasło na hasło administratora, w innym wariancie poprosi użytkownika o podanie hasła
Przykład C) niepoprawny. Proszę zwrócić uwagę, że poniższy kod nie jest poprawny ze względu na brak symboli # na początku każdej linii instrukcji warunkowej. Przy próbie wywołania poniższego kodu uzyskamy informację o braku zadeklarowanej zmiennej compUser. Samo zdefiniowanie tej zmiennej w pierwszym kroku nie jest więc wystarczające.
Wskazówka! Stałe, parametry kompilacji można również zdefiniować wewnątrz kodu VBA zamiast w oknie VBAProject Properties zaprezentowanym w pierwszym kroku powyżej. W tym celu również niezbędne będzie wykorzystanie znaku # w celu utworzenia np. takiego fragmentu kodu:
czwartek, 14 marca 2013
Obszar komórek Range 3D
Technika pracy z obszarami 3D posiada swoje odniesienie do standardowych rozwiązań znanych z Excela. Po jednoczesnym zaznaczeniu kilku arkuszy wprowadzając wartości do jednego z nich automatycznie tworzymy adekwatne wpisy do tych samych zakresów komórek we wszystkich zaznaczonych arkuszach.
Podobną technikę możemy zastosować korzystając z VBA. Poniższy przykład generuje wpisy we wszystkich 3 arkuszach zaznaczonych poleceniem Select.
Co jednak ważne- powyższa technika wymaga zaznaczenia komórek przed ich wypełnieniem. Poniższy przykład, choć intuicyjnie zgodny z powyższym nie daje identycznego rezultatu.
Inne adekwatne rozwiązanie prezentuje poniższy przykład wykorzystujący specjalną właściwość obiektu Worksheet.
Podobną technikę możemy zastosować korzystając z VBA. Poniższy przykład generuje wpisy we wszystkich 3 arkuszach zaznaczonych poleceniem Select.
Co jednak ważne- powyższa technika wymaga zaznaczenia komórek przed ich wypełnieniem. Poniższy przykład, choć intuicyjnie zgodny z powyższym nie daje identycznego rezultatu.
Inne adekwatne rozwiązanie prezentuje poniższy przykład wykorzystujący specjalną właściwość obiektu Worksheet.
piątek, 8 marca 2013
Nie zapomnieć o A w VBA...
Swego czasu trafiłem na obszerny artykuł napisany przez specjalistę od VBA poświęcony roli 'A' w 'VBA'... Niestety nie zapisałem linku do owego artykułu, być może można go odnaleźć w sieci. Niemniej treść owego można by skrócić do kilku prostych zdań, z którymi bardzo się zgadzam.
Nie twórzmy makr wszędzie tam, gdzie istnieją proste rozwiązania dostępne po stronie samej aplikacji Excel (czy innej aplikacji Office). A jeżeli już musimy tworzyć makro, to w pierwszej kolejności wykorzystajmy funkcjonalność gotowych rozwiązań, które znamy z aplikacji Excela.
Jednym z najprostszych i najważniejszych przypadków owego A w VBA jest kwestia wykorzystania funkcji arkuszowych, do których mamy dostęp z pomocą kolekcji WorksheetFunction... i temu tematowi, kwestii wykorzystania instrukcji WorksheetFunction poświęcę wkrótce kilka osobnych wpisów.
Nie twórzmy makr wszędzie tam, gdzie istnieją proste rozwiązania dostępne po stronie samej aplikacji Excel (czy innej aplikacji Office). A jeżeli już musimy tworzyć makro, to w pierwszej kolejności wykorzystajmy funkcjonalność gotowych rozwiązań, które znamy z aplikacji Excela.
Jednym z najprostszych i najważniejszych przypadków owego A w VBA jest kwestia wykorzystania funkcji arkuszowych, do których mamy dostęp z pomocą kolekcji WorksheetFunction... i temu tematowi, kwestii wykorzystania instrukcji WorksheetFunction poświęcę wkrótce kilka osobnych wpisów.
Subskrybuj:
Posty (Atom)
