Jak zapewne każdy początkujący adept Excela wie, dane możemy przeliczać w sposób automatyczny lub ręczny.
Przeliczanie Automatyczne i Ręczne
W zdecydowanej większości skoroszytów mamy do czynienia z pierwszą sytuacją. Jest ona na pewno bardziej komfortowa, zawsze bowiem widzimy prawidłowe wyniki formuł. Przeliczają się one na bieżąco.
Drugie podejście stosowane jest bardzo rzadko – głównie tam, gdzie mamy do czynienia z bardzo rozbudowanymi plikami, w których każde przeliczenie formuł trwa bardzo długo i zbytnio irytuje użytkownika.
Calculation Dotyczy Application
Sam sposób przeliczania danych w pliku to właściwość Calculation obiektu … Application (a nie Workbook jak mogłoby się wydawać). Dzieje się tak ponieważ, właściwość ta jest przypisywana do konkretnej instancji/sesji Excela.
Jeżeli więc:
- w danym pliku ustawimy tryb na ręczny (xlCalculationManual) i zamkniemy taki plik, to otwierając nowy plik w tej samej sesji Excela, przeliczanie będzie w nim ustawione domyślnie na ręczne
- w danym pliku ustawimy tryb na ręczny (xlCalculationManual) i zamkniemy taki plik razem z całą sesją Excela, to następne otwierając nowy plik, przeliczanie będzie w nim ustawione na automatyczne. I jest to wartość domyślna.
Metoda Calculate Obiektu Range
Oprócz właściwości Calculation mamy również metodę Calculate, która dotyczy właśnie jednorazowego przeliczenia:
- całej aplikacji (czyli wszystkich otwartych w danej sesji plików – popularne F9)
- pojedynczego arkusza (Ctrl + F9)
- wybranego zakresu komórek (opcja dostępna jedynie z poziomu VBA)
I właśnie tym ostatnim zagadnieniem chciałbym się zająć w tej notce.
Wyobraźmy sobie, że liczymy cenę z VAT dla kilku produktów – domyślnie podatek wynosi 0%
W tym miejscu musimy się upewnić, że dane są przeliczane w sposób ręczny (Application.Calculation = xlCalculationManual)
Następnie wprowadzamy wartość podatku VAT -> 23% – chcemy jednak przeliczyć tylko ceny produktów nr 1 i 2.
Klikamy przycisk na samym dole i otrzymujemy nowe ceny z VAT dla produktów nr 1 i 2, i niezmienione ceny dla produktów 3 i 4.
Udało się!
Pod przycisk zostało podpięte bardzo krótkie makro PrzeliczCenyWybranychProduktow(), które wygląda tak:
Sub PrzeliczCenyWybranychProduktow()
Arkusz1.Range("D3:D4").Calculate
End Sub