Co oznacza dwukropek i znak równości := w wywołaniu funkcji?

przez | 2024-06-05

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")

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.