Adresy komórek w kodzie VBA

Ostatnio kilka razy zdarzyło mi się korygować kod VBA w skoroszytach użytkowników, w których nagle coś przestawało działać.  Przyczyna błędu była prozaiczna, choć niekiedy bywa trudna do zlokalizowania. O co chodzi? O adresy komórek w kodzie VBA. 

Załóżmy, że mamy prostą tabelkę:

kliknij, aby powiększyć

W kolumnie D jest prosta formuła sumująca wartości z komórek
B i C tego samego wiersza. Kolumna E to też suma tych komórek, ale wprowadzona jako wartość kodem VBA:

Public Sub Suma()
With Worksheets(„Arkusz8”)
.Range(„E2”) = .Range(„B2”) + .Range(„C2”)
.Range(„E3”) = .Range(„B3”) + .Range(„C3”)
.Range(„E4”) = .Range(„B4”) + .Range(„C4”)
.Range(„E5”) = .Range(„B5”) + .Range(„C5”)
.Range(„E6”) = .Range(„B6”) + .Range(„C6”)
End With
End Sub

Problem zaczyna się wtedy, gdy użytkownik końcowy zmieni układ arkusza  np. wstawi kolumny lub wiersze. Wszystkie formuły odwołujące się do komórek (także w innych arkuszach) – bez problemu same się zaktualizują, nawet gdy są wpisane jako adresy bezwzględne. 

kliknij, aby powiększyć

W kodzie VBA jednak nic się nie zmieniło, odwołania do poszczególnych komórek zostały takie same. Po wykonaniu makra efekt wygląda tak:

Procedura nadał wpisuje obliczone kodem wartości i wstawia je w kolumnę E, likwidując znajdującą się tam po przesunięciu formułę. W dodatku są tam dziwne wartości – sumowana jest liczba początkowa LP oraz wartość X. 
Problem może się pojawić także przy zmianie nazwy arkusza – w kodzie będzie zapisana stara nazwa i przy uruchomienie procedury pojawi się błąd wykonania 9.
Niestety, w takim przypadku trzeba ręcznie przerobić odwołania w kodzie VBA, dostosowując go do nowego układu danych. 

Ten przykład jest prosty, w bardziej skomplikowanych projektach znalezienie i   poprawienie takiego błędu może być zdecydowanie bardziej skomplikowane. 
Jak zabezpieczyć się przed nieprzewidzianą ingerencją użytkownika? 
Najprostsze sposoby to:

    • włączenie ochrony arkusza
      uniemożliwiające wstawienie wierszy/kolumn;
    • zastosowanie w kodzie VBA odwołań do nazw kodowych arkuszy
      uniezależniające odwołania do konkretnych arkuszy;


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

 

Dodaj komentarz

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