Sumowanie kwot według waluty
Transkrypt
Sumowanie kwot według waluty
Rozwiązania Porady ekspertów Problem Sumowanie kwot według waluty Moje pytanie dotyczy arkusza kalkulacyjnego Excel. W drugiej kolumnie arkusza mam wpisane różne kwoty. Niektóre z nich są sformatowane jako złotówki, inne jako euro, dolary lub funty. Czy jest jakiś sposób na to, aby zsumować osobno złotówki, euro itd.? Excel nie posiada funkcji, która potrafiłaby sumować liczby według waluty. Rozwiązanie Faktycznie, Excel nie posiada funkcji, które pozwalają na przeprowadzanie bardziej zaawansowanych obliczeń na liczbach, uwzględniając ich konkretny format. Istnieje co prawda funkcja KOMÓRKA, która w wyniku może zwracać pewne informacje dotyczące analizowanej komórki arkusza, ale nie sprawdzi się ona w naszym przypadku. Aby rozwiązać problem, należy zatem: 1) utworzyć własną funkcję, która w wyniku będzie zwracać symbol danej waluty, 2) w prosty sposób zsumować kwoty, przyjmując jako kryterium – symbol waluty zwrócony wcześniej przez funkcję VBA. Część 1: funkcja własna do wyciągnięcia symbolu waluty Option Explicit 'Funkcja wyciąga z tekstu pojedyncze znaki, które nie są cyframi. 'Funkcja pomija także znak spacji i separator dziesiętny Function SymbolWaluty(Komorka As Range) As String Dim Dim Dim Dim sTekst sSeparator sZnak iLicznik As As As As String String String Integer sTekst = Trim(Komorka.Text) sSeparator = Application.DecimalSeparator For iLicznik = 1 To Len(sTekst) sZnak = Mid(sTekst, iLicznik, 1) If Not IsNumeric(sZnak) Then If sZnak <> sSeparator And sZnak <> Space(1) Then SymbolWaluty = SymbolWaluty & sZnak End If End If Next iLicznik End Function Analiza kodu: Funkcja posiada jeden argument – komórkę z kwotą i cztery zmienne. Pierwsza zmienna sTekst odwołuje się do właściwości Text obiektu Range. Właściwość ta w wyniku zwraca ciąg tekstowy – konkretną wartość komórki, wraz z jej formatem liczbowym, czyli np. 454,8 zł. Funkcja TRIM dodatkowo usuwa zbędne spacje z tekstu. Zmienna sSeparator przechowuje separator dziesiętny ustawiony w Excelu. Dla polskich ustawień domyślnie jest to średnik, dla innych krajów przeważnie kropka. Zmienna sZnak przechowuje każdy pojedynczy znak zmiennej sTekst. Zmienna iLicznik to prosty licznik pętli, w którym będziemy „przechodzić” po wszystkich znakach zmiennej sTekst. For iLicznik = 1 To Len(sTekst) Funkcja LEN określa długość danego tekstu. Jak wspomniałem, w pętli będziemy „przechodzić” po wszystkich pojedynczych znakach zmiennej sTekst. sZnak = Mid(sTekst, iLicznik, 1) Funkcja MID zwraca fragment tekstu. Pierwszy argument funkcji to nasz tekst, z którego Controlling nr 4 ● 1–30 kwietnia 2010 1 Porady ekspertów Rozwiązania chcemy pobrać dane (sTekst). Drugi argument określa miejsce w tekście, od którego chcemy zacząć pobieranie (iLicznik – czyli najpierw zaczynamy od pierwszego znaku, potem drugiego itd.). Trzeci, opcjonalny argument określa liczbę znaków, jaką chcemy pobrać (1 – bo za każdym razem chcemy pobrać tylko jeden znak). Dla tekstu 454,8 zł, zmienna sZnak przyjmie najpierw wartość „4” (wynik typu tekstowego). If Not IsNumeric(sZnak) Then Naszą intencją jest to, aby odrzucić wszystkie cyfry, a wyciągnąć tylko te znaki, które są tekstem. Za pomocą funkcji ISNUMERIC sprawdzamy, czy podany znak jest liczbą czy też nie. Mimo że zmienna sZnak jest zmienną typu String (w wyniku otrzymujemy „4”, a nie 4), to VBA dokonuje automatycznej konwersji i traktuje „4” jako liczbę, zatem warunek postawiony w tej linii kodu nie zostaje spełniony i pętla przechodzi do następnego znaku. If sZnak <> sSeparator And sZnak <> Space(1) Then Jeżeli dany znak nie jest liczbą, wówczas pętla przechodzi do następnej linii, aby sprawdzić dwa następne warunki. Ponieważ chcemy z wyniku wyeliminować wszystkie spacje, a także separator dziesiętny (średnik lub kropka), to musimy sprawdzić obydwa warunki. SymbolWaluty = SymbolWaluty & sZnak Jeżeli wszystkie trzy warunki są spełnione (znak nie jest liczbą, spacją ani separatorem dziesiętnym), wtedy ten pojedynczy znak zostaje dodany do wyniku funkcji. W efekcie dla 454,8 zł otrzymujemy wynik „zł” – pierwsze trzy cyfry, a także cyfra po przecinku są odrzucane przy pierwszym warunku, średnik i spacja w następnej linijce kodu. Znaki „z” i „ł” spełniają wszyst- kie warunki, zatem to właśnie ich połączenie otrzymujemy w wyniku funkcji. Część 2: funkcja arkuszowa sumująca kwoty według waluty W kolumnie C znajduje się wynik działania funkcji SymbolWaluty. Jak łatwo zauważyć, argumentem dla funkcji jest zawsze komórka znajdująca się w tym samym wierszu, w kolumnie B. Aby zsumować kwoty dla poszczególnych walut, wystarczy skorzystać z funkcji SUMA.JEŻELI. Widok 1 Widok z rozwiązaniem zadania: Źródło: opracowanie własne Najważniejsze formuły w arkuszu to: C3 = SymbolWaluty($B3) F3 = SUMA.JEŻELI($C$3:$C$16;$E3;$B$3:$B$16) Porady udzielił: Mariusz Jankowski autor strony internetowej poświęconej Excelowi i programowaniu w VBA; Pytania: [email protected] Skorzystaj z porad naszych ekspertów! Wyślij pytanie na e-mail: [email protected] Gwarantujemy pełną anonimowość 2 www.controlling.infor.pl