czwartek, 27 czerwca 2013

Funkcje informacyjne, część 5/5- funkcje arkuszowe po stronie VBA

To już ostatni post w serii poświęconej funkcjom informacyjnym. Tym razem sięgnę do zasobów funkcji arkuszowych i przedstawię przykładowe z nich, a konkretnie funkcje CZY.LICZBA oraz funkcje błędów: CZY.BRAK, CZY.BŁ i CZY.BŁĄD. Zadanie to będzie relatywnie łatwe gdyż zakładam, iż każdy z programistów VBA jest co najmniej dobry,m jak nie bardzo dobrym specjalistą w pracy z Excelem.

Na początek przypomnę więc technikę wykorzystania funkcji arkuszowych w programach VBA. Po daną funkcję możemy sięgnąć z wykorzystaniem jednej z dwóch technik (tu dla funkcji SUMA):
1WynikSuma = WorksheetFunction.Sum(Range("a1:a10"))
2WynikSuma = Application.Sum(Range("a1:a10"))

w obu wypadkach w wyniku otrzymamy  sumę obszaru A1:A10 przypisaną do zmiennej WynikSuma, a różnica pomiędzy powyższymi wywołaniami dotyczy sposobu obsługi możłiwych błędów wynikłych w czasie wywołania instrukcji (ale to temat na osobny post).

Wracając do funkcji informacyjnych:

1. Funkcja CZY.LICZBA dostępna jest z poziomu VBA w postaci instrukcji:
1WorksheetFunction.IsNumber()
2Application.IsNumber()

Funkcja zwróci wartość TRUE o ile testowana wartość jest liczbą. Podobną funkcją jest funkcja VBA IsNumeric prezentowana w poprzednich postach. Pomiędzy tymi funkcjami  wystąpią różnice w wyjątkowych sytuacjach, np.:
1IsNumeric(True)        >> zwróci True
2WorksheetFunction.IsNumber(True)    >> zwróci False

2. Funkcja CZY.BRAK dostępna jest z poziomu VBA w postaci instrukcji:
1WorksheetFunction.IsNA()
2Application.IsNA()

Funkcja ta zwróci TRUE tylko wtedy, gdy testowana wartość, najczęściej komórka arkusza, zawiera błąd typu #N/D.

3.  Funkcja CZY.BŁ dostępna jest z poziomu VBA w postaci instrukcji:
1WorksheetFunction.IsErr()
2Application.IsErr()

Funkcja ta zwróci wartość TRUE w przypadku każdego innego błędu niż ten opisany w punkcie 3 powyżej.

4. Funkcja CZY.BŁĄD dostępna jest z poziomu VBA w postaci instrukcji:
1WorksheetFunction.IsError()
2Application.IsError()

Funkcja ta zwróci TRUE w sytuacji, gdy kontrolowana wartość komórki zawiera błąd dowolnego typu, a więc zarówno błędy obsługiwane przez funkcje z punktu 2 jak i z punktu 3 powyżej.

piątek, 21 czerwca 2013

Funkcje informacyjne, część 4/5- funkcje VBA

Kontynuując omawianie funkcji informacyjnych (z grupy VBA) przedstawię na zakończenie dwie funkcje: IsMissing, IsError.

1. Funkcja IsMissing ma swoje szczególne zastosowanie w tworzeniu własnych funkcji użytkownika. Wykorzystamy ją wtedy gdy dany parametr funkcji jest opcjonalny. Wewnątrz funkcji zapewne będziemy chcieli przetestować czy użytkownik podał ten parametr czy też go pominął.

Wyobraźmy sobie funkcję, która standardowo liczy pole kwadratu, a jeżeli użytkownik poda długość dwóch boków to funkcja obliczy pole prostokąta przyjmując jako wymiary boków figury kolejne podane argumenty.

1Function PoleKwadratuProstokąta(długośćA, Optional DługośćB)
2 
3    If IsMissing(DługośćB) Then
4        PoleKwadratuProstokąta = długośćA * długośćA
5    Else
6        PoleKwadratuProstokąta = długośćA * DługośćB
7    End If
8    
9End Function

W powyższym przykładzie dzięki funkcji IsMissing sprawdzamy czy użytkownik podał drugi z argumentów i określamy jaki wzór zostanie zastosowany do obliczeń.

Funkcja IsMissing nie ma szczególnego zastosowania w innych przypadkach. Sprawdzenie pustych komórek, nieprzypisanych zmiennych, pustych ciągów tekstowych każdorazowo zwraca wartość False jak dla poniższych przykładów:
1Dim ZmiennaA
2Debug.Print IsMissing(ZmiennaA)
3Debug.Print IsMissing("")
4Debug.Print IsMissing(Range("A1"))

2. Funkcja IsError zwraca wartość True w sytuacji gdy testowana wartość lub zmienna zwracają błąd. Funkcja ta znajdzie swoje główne zastosowanie w kilku przypadkach- w sytuacji gdy testujemy wartość zwracaną przez naszą funkcję, w sytuacji gdy sprawdzamy czy dana komórka zawiera błąd (bład formuły), w sytuacji testowania wartości zwracanych przez funkcje arkuszowe wywołanych jako rozwinięcie obiektu Application. Przyjrzyjmy się przykładom i komentarzom w poniższym kodzie:
1'instrukcja wywołująca błąd
2Debug.Print CVErr(6)
3Debug.Print IsError(CVErr(6)) '>>True
4 
5'zakładając, że w komórce A1 formuła zwraca błąd,
6'oraz że komórki od A2:A10 pozostają puste to
7Debug.Print IsError(Range("A1")) '>>True
8Debug.Print IsError(Range("A2")) '>>False
9Debug.Print IsError(Application.Sum(Range("A1:A10"))) '>>True

Uwaga! Poniższe wywołanie zwróci błąd kompilacji, funkcja IsError nie będzie skuteczna w tym aspekcie. W celu 'przechwycenia' tego błędu niezbędne będzie zastosowanie procedury obsługi błędów.

1Debug.Print IsError(WorksheetFunction.Sum(Range("A1:A10")))

poniedziałek, 17 czerwca 2013

Funkcje informacyjne, część 3/5- funkcje VBA

Kontynuując temat związany z funkcjami informacyjnymi dziś prześledzę wykorzystanie dwóch kolejnych: IsEmpty, IsNull.

1. Funkcja IsEmpty zwróci wartość True gdy zmienna testowana przez funkcję nie została zainicjowana, a więc nie przypisano jej żadnej wartości. Oto przykład wraz ze zwracanymi wynikami:
1Dim ZmiennaA
2Debug.Print IsEmpty(ZmiennaA)  >>True
3 
4ZmiennaA = 100
5Debug.Print IsEmpty(ZmiennaA)  >>False

Co jednak ważne- choć pomoc VBA wspomina o możliwości testowania zmiennych z wykorzystaniem funkcji IsEmpty możemy także zapytać np. o zawartość komórki:
1Debug.Print IsEmpty(Range("A1"))

jeżeli komórka A1 będzie pusta w wyniku otrzymamy True, jeżeli jednak w komórce A1 będzie dowolna wartość (tekst, liczba, data, itp). otrzymamy w wyniku wartość False.
I jeszcze ważna ciekawostka. Poniższe zapytanie o pusty ciąg tekstu zwróci wartość False:
1Debug.Print IsEmpty("")        >>False

2. Funkcja IsNull nie jest pytaniem czy dana zmienna przechowuje 0 lecz jest pytaniem, czy dana zmienna zwraca wynik Null. Każde z 3 poniższych zapytań zwróci więc wartość False gdyż w żadnym wypadku nie mamy do czynienia z wartością Null:
1Dim ZmiennaA
2Debug.Print IsNull(ZmiennaA)     >>False
3ZmiennaA = 100
4Debug.Print IsNull(ZmiennaA)     >>False
5ZmiennaA = 0
6Debug.Print IsNull(ZmiennaA)     >>False

I jeszcze test funkcji IsNull dla obszaru typu Range:
1Debug.Print IsEmpty(Range("A1")) >>False

Niezależnie czy komórka zawiera jakąś wartość czy jest pusta powyższe zapytanie zwróci False.

Kiedy więc funkcja IsEmpty zwróci wartość True? W sytuacji następującego zapytania:
1Dim ZmiennaB
2ZmiennaB = Null
3Debug.Print IsNull(ZmiennaB)     >>True

czwartek, 13 czerwca 2013

Funkcje informacyjne, część 2/5- funkcje VBA

Kontynuując zagadnienia dot. funkcji informacyjnych dziś zaprezentowane zostaną dwie kolejne funkcje- IsArray() oraz IsObject().


1. Funkcja IsArray zwróci prawdę True gdy testowana zmienna będzie zmienną tablicową. Prześledźmy działanie funkcji na poniższym przykładzie analizując zwracane wyniki:
1Dim ZmiennaA
2Debug.Print IsArray(ZmiennaA)  >>wynik False
3 
4ZmiennaA = Array(1, 2, 3)
5Debug.Print IsArray(ZmiennaA)  >>wynik True
6 
7Dim ZmiennaB()
8Debug.Print IsArray(ZmiennaB)  >>wynik True

Pamiętając jednak o tym, że zakres komórek po przekazaniu do VBA zwraca tablicę także poniższe wywołanie zwróci wynik True:
1Debug.Print IsArray(Range("A1:A10"))

2. Funkcja IsObject zwróci wartość True zawsze wtedy gdy jako argument funkcji wskażemy odwołanie do obiektu. Poniższe przykłady obrazuję taką sytuację, wszystkie zapytania zwracają wartość True niezależnie od tego czy definicja obiektu następuje przez określenie typu zmiennej, przez przypisanie obiektu do zmiennej typu Variant, czy też przez bezpośrednie wskazanie obiektu w momencie wywołania:
1Dim ZmiennaA As Range
2Dim zmiennaB As Worksheet
3Dim zmiennaC As Variant
4Set zmiennaC = Range("A1:B1")
5    
6Debug.Print IsObject(ZmiennaA)        >>wynik True
7Debug.Print IsObject(zmiennaB)        >>wynik True
8Debug.Print IsObject(zmiennaC)        >>wynik True
9Debug.Print IsObject(Range("A1:b1"))  >>wynik True

Myślę, że powyższe funkcje będą dobrym początkiem w zakresie wyjaśniania działania funkcji informacyjnych. Pozostałe dwa posty dot. zagadnienia już wkrótce.

piątek, 7 czerwca 2013

Funkcje informacyjne, część 1/5- funkcje VBA

Funkcje informacyjne to jeden z bardziej przydatnych obszarów VBA, na który zawsze brakuje czasu w czasie prowadzonych szkoleń (dlaczego? bo zazwyczaj inne tematy stają się ciekawsze i ważniejsze).

Krótko więc postaram się przybliżyć rolę wybranych funkcji informacyjnych. Zaczniemy od klasycznych funkcji VBA, a w osobnym poście, który opublikowany zostanie wkrótce przedstawię funkcje arkuszowe pełniące podobne pomocnicze role.

Na początek definicja- rolą funkcji informacyjnych będzie zwrócenie informacji typu PRAWDA/FAŁSZ  w odpowiedzi na pytanie CZY sprawdzające WYBRANE PARAMETRY ZMIENNEJ CZY OBIEKTU. Omówię to na bazie konkretnych przykładowych funkcji i przykładów ich wywołania.

1. Funkcja IsNumerc() odpowiada na pytanie czy wskazana wartość/zmienna zwraca liczbę. Poniższe przykłady zwrócą wartość True:
1Dim ZmiennaA
2ZmiennaA = 100
3Debug.Print IsNumeric(100)         >>True
4Debug.Print IsNumeric(ZmiennaA)    >>True

Funkcję IsNumeric możemy wywołać także w odniesieniu do komórki arkuszowej. Jeżeli w komórce znajdzie się wartość liczbowa to otrzymamy również wynik True.
Jeżeli jednak w komórce (np. A1) znajdzie się data lub godzina to otrzymamy następujący wynik działania funkcji IsNumeric:
1Debug.Print IsNumeric(Range("A1"))         >>False
2Debug.Print IsNumeric(Range("A1").Value)   >>False
3Debug.Print IsNumeric(Range("A1").Value2)  >>True

2. Funkcja IsDate() zwróci nam wartość True zawsze wtedy, gdy testowana wartość przechowuje Datę lub godzinę. Wszystkie poniższe przykłady zwrócą wartość True:
1Debug.Print IsDate(Date)     >>True   
2Debug.Print IsDate(Time)     >>True   
3Debug.Print IsDate(Now)      >>True