Start > Kursy on-line > Excel - makra i VBA

Excel - makra i VBA


Definiowanie funkcji użytkownika

Załącznik z przykładami dla tego rozdziału znajduje się w tym miejscu.

Jak już wspomnieliśmy, deklarowanie funkcji odbywa się poprzez użycie słowa kluczowego "Function" i następnie nazwania jej, po czy w nawiasie można podać argumenty takiej funkcji.

Załóżmy, że chcielibyśmy zadeklarować funkcję, wynikiem której będzie maksymalna wartość w podanym zakresie, przy spełnieniu określonego warunku. Innymi słowy funkcja taka będzie działać podobnie jak wbudowana funkcja Excela SUMA.JEŻELI, tylko będzie szukać maksymalnej wartości dla danego warunku. Definicja mogłaby być np. taka:


Function MAX_JEZELI(kryteria As Range, warunek As String, zakres As Range)

Dim licznik As Long

licznik = 1

For licznik = 1 To kryteria.Count
	If kryteria.Item(licznik) = warunek Then
		MAX_JEZELI = zakres.Item(licznik)
		GoTo sprawdz
		Else
			MAX_JEZELI = "Brak podanego warunku"
	End If
Next licznik

sprawdz:
For licznik = licznik + 1 To kryteria.Count
	If kryteria.Item(licznik) = warunek And zakres.Item(licznik) > MAX_JEZELI Then
		MAX_JEZELI = zakres.Item(licznik)
	End If
Next licznik

End Function
Na jej wstępie zdefiniowaliśmy, iż nazywać się będzie MAX_JEZELI. Nasza funkcja będzie zawierała trzy argumenty:

  • kryteria - podane jako zakres w którym będzie szukany warunek,
  • warunek - warunek, o ile zostanie spełniony - będzie brany pod uwagę dany wiersz lub kolumna,
  • zakres - zakres danych, z których będzie szukane maksimum dla tych elementów na poziomie których jest spełniony warunek.



W kolejnych krokach dokonujemy już tylko przypisania do licznika (którego zadaniem będzie prześledzenie zakresu z kryteriami) wartości równej 1 i rozpoczęcie przeszukiwania pierwszego wystąpienia warunku (pierwsza pętla For). Po jego wystąpieniu, następuje przejście do etykiety kodu nazwanej "sprawdź:" w celu sprawdzenia kolejnych elementów tablic i tam gdzie podany warunek jest spełniony, a dodatkowo wartość z zakresu jest większa od obecnej, zostaje ona przypisana do funkcji. Spójrzmy może na poniższy obraz, wykorzystujący napisaną funkcję:




Przeszukujemy zakres A3:A25 w celu odnalezienia wierszy, które zawierają warunek podany w komórce B1, następnie wynikiem tej funkcji stanie się taka wartość, która dla wiersza odpowiadającego warunkowi jest jednocześnie największą. Mówiąc obrazowo: nasz przykład szuka w zakresie podanym jako kryteria liczby 3. Po znalezieniu pierwszej z nich (w komórce A5, czyli w trzecim elemencie zakresu A3:A25), przypisuje tę wartość do funkcji i przechodzi do kolejnej pętli For w celu przeszukania czy ta wartość występuje gdzieś jeszcze (zauważmy, że druga pętla rozpoczyna się od wiersza elementu następującego po tym, w którym znalezione zostało pierwsze wystąpienie). Sprawdzając kolejne elementy używa instrukcji warunkowej, która pyta, czy warunek jest spełniony oraz czy wartość w jego wierszu jest większa od obecnej - jeśli tak, to zmienia wynik funkcji, jeśli nie - przechodzi dalej.

Zauważmy, że w przypadku nie odnalezienia warunku w żadnej z podanego zakresu kryteriów, funkcja zwróci tekst "Brak podanego warunku" - odpowiedni warunek pełni rolę obsługi błędów w naszej prostej funkcji.
Polecam czytelnikowi pobranie pliku z przykładem i spokojne prześledzenie zawartego kodu - jest to zdecydowanie najlepsza metoda prawidłowego zrozumienia logiki zastosowanej w opisywanym przykładzie.