Funkcja, którą Wam przedstawię w tym poście (czyli sprawdzanie, czy jeden z zakresów zawiera się w drugim), prawdopodobnie nie będzie tak często używana jak metody wydajnego przetwarzania zakresów czy sposoby wprowadzania danych do arkusza, niemniej jednak może być dość ciekawa dla programistów VBA, a dodatkowo umożliwi prezentację właściwości Parent oraz metody Union.
Na początku zapoznajcie się z kodem tej funkcji:
Option Explicit Function CzyWZakresie(Zakres1, Zakres2) CzyWZakresie = False If Zakres1.Parent.Parent.Name = Zakres2.Parent. Parent.Name Then If Zakres1.Parent.Name = Zakres2.Parent.Name Then If Union(Zakres1, Zakres2).Address = Zakres2. Address Then CzyWZakresie = True End If End If End If End Function
Powyższa funkcja sprawdza, czy podane jako jej argumenty dwa adresy zawierają się w sobie, a ściślej rzecz biorąc czy zakres podany jako pierwszy argument (Zakres1) zawiera się w zakresie podanym jako drugi argument (Zakres2).
Pierwszą ciekawostką jest użycie właściwości Parent obiektu. Ta właściwość zwraca obiekt będący nadrzędnym obiektem (kontenerem) dla użytego obiektu. Czyli użycie w okienku Immediate instrukcji:
Print Range("A1").Parent.Name
zwróci nam nazwę arkusza, w którym dana komórka A1 się znajduje (bieżący arkusz - u mnie akurat jest to Arkusz1). Natomiast użycie instrukcji:
Print Range("A1").Parent.Parent.Name
zwróci nam obiekt nadrzędny drugiego stopnia wobec komórki, czyli nazwę skoroszytu (u mnie Zeszyt1). Jak zapewne zauważyliście powstała nam pewna hierarchia obiektów: najniżej w hierarchii jest komórka (A1), nieco wyżej jest arkusz, który jest kontenerem przechowującym komórki (Arkusz1), a jeszcze wyżej skoroszyt, który jako kontener obiektów przechowuje arkusze (Zeszyt1).
Właściwości Parent użyliśmy w naszej funkcji w dwóch zagnieżdżonych instrukcjach If. Ponieważ nasza funkcja może przyjąć jako argumenty zakresy z różnych arkuszy (a nawet skoroszytów), mogłoby się zdarzyć, że dwa zakresy będące w różnych plikach lub arkuszach mają takie same adresy i funkcja zwróciłaby nam informacje, że one się w sobie zawierają - co byłoby oczywistą nieprawdą. Dlatego musimy sprawdzić czy podane zakresy są w tym samym skoroszycie oraz w tym samym arkuszu - odpowiada za to ten fragment:
If Zakres1.Parent.Parent.Name = Zakres2.Parent. Parent.Name Then If Zakres1.Parent.Name = Zakres2.Parent.Name Then
Drugą ciekawostką jest metoda Union (jest to metoda obiektu Application). Jako argumenty wejściowe przyjmuje co najmniej dwa zakresy (obiekty typu Range), a wynik jej pracy to "suma" tych zakresów. Wykonując zatem instrukcję:
If Union(Zakres1, Zakres2).Address = Zakres2.Address
sprawdzamy tym samym, czy zakres pierwszy (Zakres1) całkowicie się zawiera w Zakres2.
Podsumowanie
Właściwość Parent jest bardzo przydatna do identyfikacji lub sprawdzania obiektów nadrzędnych, szczerze zachęcam do jej zapamiętania. Natomiast metoda Union pomaga przy operacjach z zakresami.
