środa, 3 czerwca 2009

Krótka bajka o skracaniu (kodu)

Pokażę dziś w jaki sposób można sobie maksymalnie ułatwić życie wykorzystując pewne cechy programowania w VBA. Mi samemu z początku wydawało się to trochę abstrakcją, lecz po kilku(set) wykorzystanych razach stało się wręcz niezbędne. Ale do rzeczy :)

Język VBA udostępnia nam możliwość skracania odwołań do obiektów poprzez zastosowanie konstrukcji With....End With
With Obiekt
kod
End With
Gdzie:
Obiekt jak sama nazwa wskazuje jest Obiektem który będziemy wykorzystywać wielokrotnie
kod to czynności które wykonamy wykorzystując wcześniej zadeklarowane odwołanie do obiektu czyli korzystamy z jego metod i właściwości poprzedzając je znakiem kropki np.
.top = 10
Ciekawostką jest to że obiektem może być dowolne coś co zwraca nam w wyniku operacji zmienną obiektową np.
Function getFromTable(id As Integer) As Variant
With CurrentProject.Connection.Execute("select opishtml from tabela where id =" & id)
If .EOF Or .BOF Then getFromTable = Empty: Exit Function
getFromTable = Nz(.Fields.Item(0).Value, Empty)
End With
End Function
Wykorzystuję tu fakt że wynikiem wykonania metody .Execute jest obiekt ADODB.Recordset. Fakt jest to mocno niejawne ale działa :)

Wyjaśnienia mogą jeszcze wymagać elementy .EOF or .BOF - jest to sprawdzenie czy rekordset przypadkiem nie jest pusty. Gdyby był to kolejna linia wygenerował by błąd
getFromTable = Nz(.Fields.Item(0).Value, Empty)
Ta linia natomiast podstawia pod zmienną wartość elementu o indeksie 0 z kolekcji .Fields. Elementy tej kolekcji budują pojedynczy wiersz Recordset-a. Sprawdzam przy okazji czy wartość przypadkiem nie jest Null i jak jest to podstawiam Empty
Funkcja Nz jest z defaultu dostępna tylko w Accessie, ale bardzo łatwo ją skonstruować samodzielnie z wykorzystaniem funkcji logicznej IsNull(zmienna) oraz IF albo jeszcze szybciej IIF. Dla niewtajemniczonych funkcja ta sprawdza czy podany parametr jest wartością Null i jeżeli tak to podstawia pod wartość końcową drugi parametr. W przeciwnym wypadku jest zwracana wartość pierwotna.

Poniżej trzy wersje funkcji Nz. Mogą być przydatne np. w Excelu
Function Nz(vIn As Variant, vIsNull As Variant) As Variant
If IsNull(vIn) Then
Nz = vIsNull
Else
Nz = vIn
End If
End Function

Function Nz(vIn As Variant, vIsNull As Variant) As Variant
Nz = vIn
If IsNull(vIn) Then Nz = vIsNull
End Function

Function Nz(vIn As Variant, vIsNull As Variant) As Variant
Nz = IIf(IsNull(vIn), vIsNull, vIn)
End Function


Morał
Wykorzystanie With ma wiele zalet jedną z nich jest możliwoć skrócenia kodu i jego wizualna optymalizacja. Kolejną niewątpliwą zaletą jest przyspieszenie kodu.

Brak komentarzy:

Prześlij komentarz