With...End With to konstrukcja VBA upraszczająca wielokrotne odwołania do właściwości tego samego obiektu.
Składnia konstrukcji With...End With w VBA
With...End With jest instrukcją języka Visual Basic for Applications, używaną wtedy, gdy kilka kolejnych operacji dotyczy tego samego obiektu. Po słowie kluczowym With podaje się wyrażenie wskazujące obiekt, a blok kończy się słowami End With. Wewnątrz bloku właściwości i metody tego obiektu zapisuje się z kropką na początku, na przykład .Name, .Value albo .ClearContents. Kropka informuje interpreter, że dana właściwość lub metoda odnosi się do obiektu określonego w instrukcji With.
Przykładowa konstrukcja może wyglądać tak: With Worksheets("Arkusz1").Range("A1"), następnie .Value = "Test" oraz .Font.Bold = True, a na końcu End With. Bez konstrukcji With każda linia musiałaby zawierać pełne odwołanie do zakresu, czyli między innymi Worksheets("Arkusz1").Range("A1").Value. Konstrukcja nie tworzy nowego obiektu i nie kopiuje jego właściwości. Określa jedynie obiekt domyślny dla odwołań zapisanych w obrębie danego bloku.
Odwołania do właściwości i metod obiektu
W bloku With można używać zarówno właściwości, jak i metod obiektu, o ile należą one do typu zwróconego przez wyrażenie umieszczone po With. Dla obiektu Range mogą to być na przykład .Value, .NumberFormat, .ClearContents i .Copy. Można także odwoływać się do zagnieżdżonych właściwości, takich jak .Font.Color lub .Interior.Pattern. VBA rozpoznaje wtedy pełne wyrażenie w odniesieniu do obiektu bazowego zdefiniowanego na początku bloku.
Instrukcje wewnątrz bloku nie muszą jednak wszystkie dotyczyć obiektu wskazanego przez With. Zwykłe wyrażenia bez początkowej kropki są interpretowane według normalnych reguł zakresu widoczności VBA. Na przykład zmienna zadeklarowana wcześniej jako tekst nadal odwołuje się do tej zmiennej, a nie do właściwości obiektu. Podobnie pełne odwołanie zapisane z nazwą obiektu, takie jak Application.Workbooks.Count, pozostaje niezależne od obiektu bieżącego bloku.
Ważne jest również prawidłowe określenie obiektu. Jeśli wyrażenie po With zwraca Nothing, próba użycia właściwości lub metody tego obiektu może zakończyć się błędem wykonania. W kodzie VBA często stosuje się więc wcześniejsze przypisanie obiektu do zmiennej typu obiektowego oraz sprawdzenie, czy zmienna zawiera prawidłową referencję. Sam blok With nie zabezpiecza przed błędnym odwołaniem, nie obsługuje wyjątków i nie sprawdza automatycznie poprawności danych przekazywanych do metod.
Zakres działania, zagnieżdżanie i typowe błędy
Zakres konstrukcji zaczyna się od instrukcji With i trwa do odpowiadającego jej End With. Każdy blok musi mieć własne zakończenie. VBA dopuszcza zagnieżdżanie bloków, lecz przy zagnieżdżeniu kropka odnosi się do obiektu z najbliższego aktywnego bloku With. Z tego powodu przy bardziej złożonym kodzie warto stosować pełne nazwy obiektów tam, gdzie mogłoby powstać niejasne odwołanie. Pominięcie początkowej kropki jest częstą przyczyną logicznego błędu: właściwość może zostać odczytana z innego obiektu, zmiennej lub kontekstu aplikacji.
Niepoprawne jest także traktowanie With jako skrótu dla dowolnego fragmentu kodu. Konstrukcja nie pozwala pomijać wymaganych argumentów metod i nie zmienia typu obiektu. Jeżeli With dotyczy komórki Range, to zapis .Visible będzie prawidłowy tylko wtedy, gdy właściwość ta jest dostępna dla konkretnego typu obiektu i w danym modelu obiektowym. Błąd może pojawić się również wtedy, gdy kod zmieni referencję obiektu w trakcie działania albo użyje właściwości zwracającej inny typ niż zakładany przez autora.
Konstrukcja poprawia czytelność i ogranicza powtarzanie długich ścieżek obiektowych, ale nie zastępuje jednoznacznego kwalifikowania odwołań. W makrach programu Excel szczególną uwagę należy zwrócić na obiekty aktywne, takie jak ActiveWorkbook, ActiveSheet i Selection. Jeżeli wyrażenie po With opiera się na takim stanie interfejsu, makro może działać inaczej po zmianie aktywnego arkusza lub skoroszytu. Stabilniejszy kod wskazuje konkretny skoroszyt, arkusz i zakres, a dopiero potem wykorzystuje blok With.
Weryfikacja makra wykorzystującego With...End With
Podczas sprawdzania makra należy najpierw ustalić, jaki obiekt faktycznie zwraca wyrażenie po With. Pomocne jest przejście przez kod w edytorze VBA krok po kroku, obserwowanie wartości zmiennych w oknie Locals oraz użycie okna Immediate do sprawdzania wyrażeń. Warto porównać każde odwołanie rozpoczynające się kropką z właściwościami i metodami dostępnego typu obiektowego. Jeżeli kod operuje na arkuszu lub zakresie, trzeba też sprawdzić, czy nazwa arkusza, adres komórki i skoroszyt odpowiadają rzeczywistym elementom dokumentu.
Praktyczny test powinien obejmować zarówno normalne wykonanie, jak i sytuacje brzegowe: brak oczekiwanego arkusza, pusty zakres, nieprawidłową wartość właściwości oraz zamknięty skoroszyt. Błędy wykonania VBA mają numery i opisy dostępne w obiekcie Err, dlatego procedura diagnostyczna może rejestrować Err.Number i Err.Description przed zakończeniem obsługi błędu. Trzeba jednak odróżnić błąd techniczny od błędu logiki: makro może wykonać się bez wyjątku, a mimo to zmodyfikować niewłaściwy arkusz, ponieważ obiekt został pobrany z aktywnego kontekstu.
Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów, komputerów PC i podzespołów, a w przypadku problemów z makrami może rozpocząć diagnostykę od odtworzenia błędu, sprawdzenia wersji pakietu Office, ustawień zabezpieczeń makr oraz zależności między dokumentem a kodem VBA. Przy analizie konstrukcji With...End With istotne jest zachowanie kopii pliku i testowanie zmian na duplikacie, aby można było porównać wynik działania procedury z oczekiwanym stanem arkusza.