W jednym z poprzednich wpisów czytelnik zadał pytanie co oznacza taki dziwny zapis w wywołaniu metody (funkcji) InputBox z obiektu Application:
Application.InputBox(Prompt:="Z ilu ostatnich dni mam załadować dane", _
Title:="Zestawienie sprzedaży", Default:="7", Type:=1)
Zapis :=
w VBA oznacza przypisanie wartości do konkretnego argumentu w funkcji lub metodzie. Pozwala to na bardziej czytelne przekazywanie argumentów, szczególnie gdy funkcja ma ich wiele, a nie wszystkie są wymagane. Oto prosty przykład takiej funkcji, która przyjmuje dużo różnych argumentów, ale nie wszystkie są wymagane.
Function ZapisDoBazy(Imie As String, _
Nazwisko As String, _
Optional Miasto As String, _
Optional Wiek As Long, _
Optional Wzrost As Long, _
Optional Waga As Long, _
Optional IQ As Long, _
Optional ObwodBiust As Long, _
Optional ObwodTalia As Long, _
Optional ObwodBiodra As Long, _
Optional ObwodBiceps As Long, _
Optional WysokoscCzola As Long) As Boolean
Dim s As String
s = "=== DANE PRZEKAZANE DO FUNKCJI: ===" + vbCrLf
s = s + "Imie: " + Imie + vbCrLf
s = s + "Nazwisko: " + Nazwisko + vbCrLf
s = s + "Miasto: " + Miasto + vbCrLf
s = s + "Wiek: " + CStr(Wiek) + vbCrLf
s = s + "Wzrost: " + CStr(Wzrost) + vbCrLf
s = s + "Waga: " + CStr(Waga) + vbCrLf
s = s + "IQ: " + CStr(IQ) + vbCrLf
s = s + "ObwodBiust: " + CStr(ObwodBiust) + vbCrLf
s = s + "ObwodTalia: " + CStr(ObwodTalia) + vbCrLf
s = s + "ObwodBiodra: " + CStr(ObwodBiodra) + vbCrLf
s = s + "ObwodBiceps: " + CStr(ObwodBiceps) + vbCrLf
s = s + "WysokoscCzola: " + CStr(WysokoscCzola) + vbCrLf
s = s + vbCrLf + vbCrLf
'Tu jakiś kod obrabiający dane i zapisujący je do bazy
Debug.Print s
ZapisDoBazy = True
End Function
Czyli mamy taką sytuację, że w zależności od sytuacji czasami mamy trochę więcej a czasem trochę mniej informacji o użytkowniku (np. pobieramy dane z formatki), które chcemy zapisać w bazie. Oto prosty przykład wywołania funkcji:
Wynik = ZapisDoBazy("Iga", "Kowalska", "Kraków", 35, 180, 70, 130, 88, 70, 92, 30, 20)
Tak naprawdę tylko dwa pierwsze argumenty są wymagane, pozostałe są opcjonalne, więc jeśli nie mam kompletu danych to równie dobrze mogę wywołać funkcję podając tylko imię i nazwisko (za pozostałe dane domyślnie będą wstawione zera):
Wynik = ZapisDoBazy("Iga", "Kowalska")
No, ale rzućmy okiem na wcześniejszy przykład. Chcę się upewnić, czy dobrze zapisałem obwód w talii u Igi. Czy jesteś w stanie w ułamku sekundy ocenić, która to jest liczba? (70)
A teraz dodajmy do bazy danych osobę, dla której mamy podaną tylko wysokość czoła (ostatni parametr). Tak wygląda wywołanie mojej funkcji:
Wynik = ZapisDoBazy("Maria", "Nowak", , , , , , , , , , 30)
(tam gdzie nie znałem wartości wpisałem same przecinki, mógłbym równie dobrze (z wyjątkiem parametru miasto) wpisać zera pomiędzy przecinkami.
Czy jesteś pewien, czy podałem poprawną ilość przecinków?? Jeśli wpisałem np. o jeden przecinek za mało, to w wywołaniu funkcji wartość 30 będzie podstawiona do zmiennej ObwodBiceps a nie WysokoscCzola.
Albo kolejny przykład. Znamy tylko wagę kolejnej osoby. Więc nasze wywołanie funkcji wygląda następująco:
Wynik = ZapisDoBazy("Zenon", "Śliwa", , , , 80)
Znów mamy wątpliwości czy podałem odpowiednią liczbę przecinków (za Wagą jest jeszcze kilka kolejnych parametrów, ale nie musiałem ich podawać bo domyślnie będą podstawione zera).
A teraz magia. Czy takie wywołanie funkcji nie jest czytelniejsze?
Wynik = ZapisDoBazy(Imie:="Zenon", Nazwisko:="Śliwa", Waga:=80)
Mało tego. Jeśli w ten sposób przekazuję dane do funkcji (podaję nazwę parametru, dwukropek, znak równości i jego wartość) to nawet nie muszę tych argumentów podawać w takiej kolejności w jakiej są one definiowane w funkcji. Czyli to wywołanie też jest poprawne:
Wynik = ZapisDoBazy(Waga:=80, Nazwisko:="Śliwa", Imie:="Zenon")