Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Set

Termin Definicja
Set

Set to instrukcja VBA przypisująca zmiennej referencję do obiektu zamiast prostej wartości.

Set w VBA – czym jest przypisanie obiektu

Set w języku VBA służy do przypisywania zmiennej odwołania do obiektu. Dzięki temu zmienna nie przechowuje jedynie tekstu, liczby ani wartości logicznej, lecz wskazuje na konkretny element środowiska programu, na przykład arkusz, skoroszyt, zakres komórek, formularz, kolekcję albo obiekt systemu plików. Jest to istotna różnica, ponieważ obiekt posiada własne właściwości, metody i relacje z innymi elementami aplikacji.

Przykładowa instrukcja może wyglądać następująco:

Set arkusz = ThisWorkbook.Worksheets("Dane")

W tym zapisie zmienna arkusz otrzymuje referencję do arkusza o nazwie „Dane” znajdującego się w bieżącym skoroszycie. Nie jest tworzona kopia arkusza i nie jest kopiowana jego zawartość. Zmienna staje się wygodnym uchwytem pozwalającym odwoływać się do wybranego obiektu w dalszej części procedury.

Instrukcja Set występuje przed wyrażeniem zwracającym obiekt. Samo przypisanie może mieć postać krótką, ale jego znaczenie zależy od typu zmiennej. Najczęściej używa się deklaracji Dim, a następnie przypisania referencji:

Dim zakres As Range
Set zakres = Worksheets("Dane").Range("A1:C10")

Od tej chwili można stosować zapis zakres.Value, zakres.ClearContents albo zakres.Font.Bold = True. Ułatwia to czytanie kodu, ogranicza powtarzanie długich ścieżek obiektów i zmniejsza ryzyko odwołania do innego arkusza niż zamierzony.

Set a zwykłe przypisanie wartości i porównania w VBA

W VBA operator przypisania bez słowa Set stosuje się zwykle do danych prostych, takich jak liczby, napisy, daty i wartości logiczne. Przykład liczba = 10 oznacza umieszczenie liczby w zmiennej, natomiast tekst = "Raport" zapisuje w niej ciąg znaków. W przypadku obiektów potrzebne jest wskazanie referencji, dlatego stosuje się konstrukcję Set zmienna = obiekt.

Różnicę można przedstawić na dwóch przykładach:

Dim nazwa As String
nazwa = "Arkusz kontrolny"

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Kontrola")

Pierwsza zmienna przechowuje wartość tekstową. Druga wskazuje na obiekt typu Worksheet, który udostępnia między innymi kolekcję komórek, właściwości nazwy i widoczności oraz metody związane z arkuszem. Próba przypisania obiektu w sposób przeznaczony dla wartości prostych może zakończyć się błędem kompilacji albo błędnym działaniem procedury.

Warto odróżnić również obiekt od właściwości obiektu. Instrukcja Set komorka = Range("A1") przypisuje referencję do komórki, natomiast wartosc = Range("A1").Value pobiera zawartość tej komórki. W pierwszym przypadku zmienna może później zmienić formatowanie komórki lub wyczyścić jej zawartość. W drugim przypadku przechowywana jest tylko pobrana informacja i nie ma bezpośredniego połączenia z komórką.

Podobny mechanizm pojawia się przy pracy ze skoroszytami, formularzami użytkownika, obiektami wykresów, folderami i plikami. Referencja pozwala zachować jednoznaczny punkt odniesienia, ale nie zmienia samego obiektu. Jeżeli arkusz zostanie zmodyfikowany przez inną procedurę, zmienna nadal wskazuje ten sam arkusz, o ile obiekt nie został usunięty lub zamknięty.

Set i typowe problemy z referencjami obiektów

Jednym z częstych problemów jest pominięcie słowa Set przy przypisywaniu obiektu. Kod może wtedy zgłosić błąd „Object required” albo „Object variable or With block variable not set”, zależnie od sytuacji i dalszego użycia zmiennej. Szczególnej uwagi wymaga deklarowanie typu. Zmienna zadeklarowana jako Range powinna otrzymać obiekt zakresu, a zmienna Worksheet – obiekt arkusza. Nieprawidłowa zgodność typów jest wykrywana wcześniej i zwykle ułatwia znalezienie przyczyny.

Inny problem powstaje, gdy referencja nie została ustawiona przed użyciem. Przykład:

Dim ws As Worksheet
ws.Range("A1").Value = 1

W tym fragmencie zmienna ws została zadeklarowana, lecz nie wskazuje jeszcze na konkretny arkusz. Przed wykonaniem operacji powinno pojawić się przypisanie, na przykład Set ws = ThisWorkbook.Worksheets("Dane"). Sama deklaracja informuje o typie zmiennej, ale nie wybiera obiektu.

Źródłem błędów bywa także niejednoznaczne używanie ActiveWorkbook, ActiveSheet lub niekwalifikowanego Range. Kod działający poprawnie podczas ręcznego uruchamiania może zacząć wskazywać inny arkusz po przełączeniu okna, otwarciu dodatkowego pliku albo uruchomieniu makra z formularza. Bezpieczniejszym rozwiązaniem jest przypisanie referencji do konkretnego skoroszytu i arkusza:

Dim skoroszyt As Workbook
Dim dane As Worksheet
Set skoroszyt = ThisWorkbook
Set dane = skoroszyt.Worksheets("Dane")

Trzeba też pamiętać, że zamknięcie skoroszytu, usunięcie arkusza albo skasowanie pliku może sprawić, że dalsze operacje na referencji przestaną być prawidłowe. W dłuższych procedurach przydatne jest sprawdzanie, czy obiekt został ustawiony, oraz obsługa błędów związanych z brakiem wskazanego arkusza lub pliku. Po zakończeniu pracy można zwolnić referencję przez Set dane = Nothing. W wielu krótkich procedurach nie jest to konieczne, ponieważ VBA zarządza pamięcią automatycznie, lecz jawne zakończenie pracy z obiektem może poprawić czytelność kodu i ułatwić kontrolę nad zasobami.

Set w praktyce – wskazówki dla kodu VBA

Przy budowaniu makra dobrze jest najpierw określić, z jakim rodzajem obiektu będzie wykonywana praca. Następnie można zadeklarować zmienną o konkretnym typie i przypisać jej referencję. Wczesne deklarowanie, takie jak Dim plik As Workbook albo Dim katalog As Object, pomaga wychwycić literówki oraz podpowiada dostępne właściwości i metody.

Przydatne jest stosowanie pełnych kwalifikacji obiektów. Zapis Set komorka = skoroszyt.Worksheets("Dane").Range("B2") jest bardziej przewidywalny niż samo Set komorka = Range("B2"), ponieważ jasno wskazuje skoroszyt i arkusz. Jeżeli zakres jest używany wielokrotnie, można przypisać go raz i operować na zmiennej:

Dim tabela As Range
Set tabela = dane.Range("A1:F100")
tabela.Sort Key1:=tabela.Columns(2), Header:=xlYes

W konstrukcji With również przydatne jest wcześniejsze ustawienie referencji. Dzięki temu kilka operacji odnosi się do tego samego obiektu:

Set raport = ThisWorkbook.Worksheets("Raport")
With raport
    .Range("A1").Value = "Podsumowanie"
    .Columns("A:F").AutoFit
End With

Ważne jest odróżnianie przypisania referencji od przypisania właściwości. Gdy celem jest zmiana nazwy arkusza, używa się raport.Name = "Podsumowanie", bez słowa Set, ponieważ modyfikowana jest właściwość tekstowa. Gdy celem jest wskazanie arkusza przez zmienną, stosuje się Set raport = .... Takie rozgraniczenie porządkuje kod i pozwala szybciej analizować komunikaty o błędach.

Podczas testów warto uruchamiać procedurę krokowo, obserwować wartości zmiennych w oknie lokalnym i sprawdzać, do którego skoroszytu lub arkusza prowadzi dana referencja. Szczególnie przydatne jest kontrolowanie nazw obiektów, gdy pliki powstają na podstawie kopii, szablonów lub danych importowanych z innych źródeł.

Set w skoroszycie – kiedy potrzebna jest pomoc serwisu

Problemy z makrami VBA nie zawsze wynikają z samej składni Set. Przyczyną może być uszkodzony skoroszyt, nieprawidłowo działający dodatek, wyłączone makra, blokada pliku, konflikt wersji pakietu biurowego albo błąd systemu plików. Jeżeli procedura przestaje działać po zmianie komputera, aktualizacji oprogramowania lub przeniesieniu pliku, pomocne jest zachowanie kopii dokumentu, treści komunikatu i informacji o momencie wystąpienia problemu.

Do serwisu warto zgłosić się wtedy, gdy nie można otworzyć pliku zawierającego makra, aplikacja zamyka się podczas wykonywania kodu, arkusze nie zapisują zmian albo problem powtarza się również w innych dokumentach. Przed przekazaniem pliku dobrze jest usunąć dane, które nie są potrzebne do diagnostyki, oraz zachować kopię zapasową. W przypadku Warszawskiego Pogotowia Komputerowego 24/7 naprawy są z reguły realizowane do 3 dni roboczych, co może ułatwić szybkie przywrócenie sprawnego środowiska pracy z dokumentami i makrami.

Jeżeli błąd dotyczy wyłącznie konkretnej instrukcji, przydatne będzie przekazanie krótkiego fragmentu kodu wraz z opisem oczekiwanego rezultatu. Jeżeli natomiast pojawiają się również problemy z uruchamianiem programu, dostępem do plików, stabilnością systemu lub zapisem danych, potrzebna może być szersza diagnoza komputera. W obu przypadkach dokładny opis objawów pomaga rozdzielić błąd programistyczny od problemu technicznego urządzenia lub środowiska, w którym wykonywany jest kod VBA.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę