Jan 19 2010

Wtorki z VBA cz.13 – Określanie, czy zakres zawiera się w innym zakresie

Posted by Marcin

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.

Powiązane artykuły:

Leave a Reply