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

Podobne dokumenty