13
Příklad 1 Příklad 1 Function Function Cetnost Cetnost (rozsah (rozsah as Range as Range , cislo As , cislo As Long Long ) As ) As Long Long Dim co As Dim co As Long Long Dim bunka as variant Dim bunka as variant co = 0 co = 0 For Each For Each bunka bunka In rozsah In rozsah If cislo = If cislo = bunka bunka .Value Then .Value Then co = co + 1 co = co + 1 End If End If Next Next bunka bunka Cetnost Cetnost = co = co End Function End Function

8Funkce

Embed Size (px)

DESCRIPTION

KA

Citation preview

Page 1: 8Funkce

Příklad 1Příklad 1

Function Function CetnostCetnost(rozsah(rozsah as Range as Range, cislo As , cislo As LongLong) As ) As LongLong Dim co As Dim co As LongLong Dim bunka as variantDim bunka as variant co = 0co = 0 For Each For Each bunkabunka In rozsah In rozsah If cislo = If cislo = bunkabunka.Value Then.Value Then co = co + 1co = co + 1 End IfEnd If Next Next bunkabunka CetnostCetnost = co = coEnd FunctionEnd Function

Page 2: 8Funkce

Příklad 2Příklad 2Function Secti2(rozsahFunction Secti2(rozsah as Range as Range) As String) As String Dim co(1 To 5) As ByteDim co(1 To 5) As Byte Dim Bunka as variantDim Bunka as variant Dim Retez As StringDim Retez As String For a = 1 To 5For a = 1 To 5 co(a) = 0co(a) = 0 Next aNext a Retez = ""Retez = "" For Each bunka In rozsahFor Each bunka In rozsah Select Case bunka.ValueSelect Case bunka.Value Case 1 To 4: co(bunka.Value) = co(bunka.Value) + 1Case 1 To 4: co(bunka.Value) = co(bunka.Value) + 1 Case Else: co(5) = co(5) + 1Case Else: co(5) = co(5) + 1 End SelectEnd Select Next bunkaNext bunka For a = 1 To 5For a = 1 To 5 Retez = Retez & Str(co(a)) & ", "Retez = Retez & Str(co(a)) & ", " Next aNext a Secti2 = RetezSecti2 = RetezEnd FunctionEnd Function

Page 3: 8Funkce

Vytváření funkcí deklarací FunctionVytváření funkcí deklarací Function

Jedná se vlastně o procedury, které nejsou deklarovány klausulíJedná se vlastně o procedury, které nejsou deklarovány klausulí SubSub, ale klausulí , ale klausulí FunctionFunction..

Na proceduru deklarovanou klausulí Na proceduru deklarovanou klausulí SubSub pohlížíme jako na příkaz, pohlížíme jako na příkaz, kdežto procedura definovaná klausulí kdežto procedura definovaná klausulí FunctionFunction vždy vrací hodnotu. vždy vrací hodnotu.

Funkce jsou všestranné a dají se používat nejen jako součásti výrazuFunkce jsou všestranné a dají se používat nejen jako součásti výrazuv procedurách VBA, ale taky ve vzorcích, které vytváříme vv procedurách VBA, ale taky ve vzorcích, které vytváříme vbuňkách listu pracovního sešitu.buňkách listu pracovního sešitu.

Function Opacne (Retezec AS STRING) As StringFunction Opacne (Retezec AS STRING) As String‘‘Řetězec znaků obrátí opačněŘetězec znaků obrátí opačně

Opacne = “”Opacne = “”Delka_Retezce = Delka_Retezce = Len(Retezec)Len(Retezec)

For I = For I = Delka_Retezce To 1 Step -1Delka_Retezce To 1 Step -1 Opacne = Opacne Opacne = Opacne & Mid& Mid(Retezec,I,1)(Retezec,I,1)

Next INext IEnd FunctionEnd Function

Page 4: 8Funkce

Použití funkcePoužití funkce

1.1. Použití funkce v pracovním sešituPoužití funkce v pracovním sešitu- Funkce musí být umístěna v normálním modulu, ten vyvoláte Funkce musí být umístěna v normálním modulu, ten vyvoláte

přes Project Explorer, kliknutím pravého tlačítka myši vyvoláte přes Project Explorer, kliknutím pravého tlačítka myši vyvoláte nabídku, zvolte nabídku, zvolte Insert/ ModuleInsert/ Module..

- Vaše funkce je umístěna v kolekci funkcí MS Excel kategorii Vaše funkce je umístěna v kolekci funkcí MS Excel kategorii vlastní (nabídka Vložit/ Funkci)vlastní (nabídka Vložit/ Funkci)

- Funkci se v listu volá následovně :Funkci se v listu volá následovně := Opacne(C3)= Opacne(C3)

- Vaše funkce lze stejně jako funkce MS Excel vnořovat :Vaše funkce lze stejně jako funkce MS Excel vnořovat := Opacne(Opacne(C3))= Opacne(Opacne(C3))

2.2. Použití funkce v proceduře VBAPoužití funkce v proceduře VBASub Opacne_proc()Sub Opacne_proc()

Dim Vstup As StringDim Vstup As StringVstup = InputBox(Vstup = InputBox(““Zadejte textZadejte text””))MsgBox Opacne(Vstup), , VstupMsgBox Opacne(Vstup), , Vstup

End SubEnd Sub

Page 5: 8Funkce

Filosofie funkceFilosofie funkce

PozorPozor !! Funkce slou !! Funkce slouží k tomu, aby vracela nějakou hodnotu, chová se vlastně jako ží k tomu, aby vracela nějakou hodnotu, chová se vlastně jako proměnná.proměnná.

Funkce pracovního listu Funkce pracovního listu nemůženemůže provádět žádnou činnost s objekty. provádět žádnou činnost s objekty.Syntaxe :Syntaxe : [Private | Public ] [Static] [Private | Public ] [Static] FunctionFunction názevnázev [[((parametrparametryy))]] [[As As typtyp]] [[příkazypříkazy]]

[Exit [Exit FunctionFunction]] End FunctionEnd Function– PrPrivateivate - - funkce funkce je dostupnje dostupná procedurám a funkcím ve stejném moduluá procedurám a funkcím ve stejném modulu– PublicPublic – funkce je dostupná všem jiným procedurám a funkcím ve všech – funkce je dostupná všem jiným procedurám a funkcím ve všech

modulech sešitu. modulech sešitu. – StaticStatic – – hodnoty proměnných deklarovaných ve funkci se budou mezi hodnoty proměnných deklarovaných ve funkci se budou mezi

jednotlivými voláními funkce uchovávatjednotlivými voláními funkce uchovávat– FunctionFunction – – Slovo určující začátek funkce, která vrací hodnotuSlovo určující začátek funkce, která vrací hodnotu– Název Název – určuje název funkce– určuje název funkce– Parametry – Parametry – seznam proměnných, které reprezentují parametry předávané seznam proměnných, které reprezentují parametry předávané

funkci. Tyto parametry jsou zapsány v závorkáchfunkci. Tyto parametry jsou zapsány v závorkách– Typ – Typ – Datový typ hodnoty vrácené touto funkcíDatový typ hodnoty vrácené touto funkcí– Příkazy – Příkazy – kód jazyka VBAkód jazyka VBA– Exit Function Exit Function – příkaz pro ukončení (vystoupení z) funkce před oficiálním – příkaz pro ukončení (vystoupení z) funkce před oficiálním

koncemkoncem– End Function End Function – oficiální konec funkce– oficiální konec funkce

Page 6: 8Funkce

Filosofie funkceFilosofie funkce a jej a její prováděníí provádění

Je třeba mít na paměti následující body :Je třeba mít na paměti následující body :- Pokud nedeklarujete rozsah platnosti funkce v rámci modulu, bude Pokud nedeklarujete rozsah platnosti funkce v rámci modulu, bude

tato funkce standardně veřejná (Public)tato funkce standardně veřejná (Public)- Funkce deklarovaná jako soukromá (Private) se neobjeví v kategorii Funkce deklarovaná jako soukromá (Private) se neobjeví v kategorii

Vlastní dialogovém okně Vložit/Funkci. S takovouto platností má Vlastní dialogovém okně Vložit/Funkci. S takovouto platností má funkce smysl pouze tehdy, nechcete-li, aby uživatel o této funkci funkce smysl pouze tehdy, nechcete-li, aby uživatel o této funkci věděl, ale přitom funkce mohla být volána některou z Vámi věděl, ale přitom funkce mohla být volána některou z Vámi deklarovaných procedur.deklarovaných procedur.

- Pokud potřebujete volat funkci deklarovanou v jiném sešitě, musíte Pokud potřebujete volat funkci deklarovanou v jiném sešitě, musíte nastnastaavit odkaz do jiného sešitu pomocí příkazu editoru vit odkaz do jiného sešitu pomocí příkazu editoru VB Tools VB Tools ReferencesReferences

Provádění funkce :Provádění funkce :1.1. Volání funkce z jiné proceduryVolání funkce z jiné procedury

Celkem = SectiPole(TotoPole)Celkem = SectiPole(TotoPole)Celkem = Application.Run (Celkem = Application.Run (““SectipoleSectipole”, “TotoPole”)”, “TotoPole”)

2.2. Použití funkce ve vzorci pracovního listu :Použití funkce ve vzorci pracovního listu : Musíme zajistit, aby MS Excel dokázal funkci najít. Je-li funkce Musíme zajistit, aby MS Excel dokázal funkci najít. Je-li funkce

deklarovaná ve stejném sešitě, nemusí se dělat nic, ale pokud ne :deklarovaná ve stejném sešitě, nemusí se dělat nic, ale pokud ne :

Page 7: 8Funkce

Provádění FunkceProvádění Funkce

1.1. Před název funkce uvést název sešitu :Před název funkce uvést název sešitu := MojeFunkce.xls= MojeFunkce.xls!!SpocitejBunky(A1:C10)SpocitejBunky(A1:C10)

2.2. Nastavit odkaz na sešit :Nastavit odkaz na sešit :V editoru VB volbou nabídkyV editoru VB volbou nabídky Tools Tools References . References .

3.3. Vytvořením doplňkuVytvořením doplňkuKdyž si ze sešitu, který obsahuje funkce vytvoříme doplněk, Když si ze sešitu, který obsahuje funkce vytvoříme doplněk, nebudeme muset při volání některé funkce používat odkaz na nebudeme muset při volání některé funkce používat odkaz na soubor.soubor.

4.4. Řešení přepočtu funkce :Řešení přepočtu funkce :Funkce se přepočte okamžitě, změní-li se nějaká buňka :Funkce se přepočte okamžitě, změní-li se nějaká buňka :

Application.Volatile TrueApplication.Volatile True Metoda Metoda VolatileVolatile objektu objektu ApplicationApplication má pouze jediný parametr ( má pouze jediný parametr (truetrue

nebo nebo falsefalse))

Page 8: 8Funkce

Funkce s polem parametrůFunkce s polem parametrů

– Funkce mohou mít jako nepovinný parametr pole nebo více polí, Funkce mohou mít jako nepovinný parametr pole nebo více polí, následující funkce bude mít jako parametr pole listu a vrací jeho následující funkce bude mít jako parametr pole listu a vrací jeho celkový součet :celkový součet :

Function CelkemPole (List) As doubleFunction CelkemPole (List) As double

Dim Polozky As VariantDim Polozky As Variant

CelkemPole = 0CelkemPole = 0

For Each Polozky in ListFor Each Polozky in List

If Application.IsNumber(Polozky) If Application.IsNumber(Polozky) Then _Then _

CelkemPole = CelkemPole + PolozkyCelkemPole = CelkemPole + Polozky

Next PolozkyNext Polozky

End FunctionEnd Function

Page 9: 8Funkce

Funkce s nepovinnými parametryFunkce s nepovinnými parametry

– Mnohé vestavěné funkce mají množství nepovinných parametrů, například Mnohé vestavěné funkce mají množství nepovinných parametrů, například funkce, která vrací znaky z levé části řetězce funkce, která vrací znaky z levé části řetězce LeftLeft má syntaxi : má syntaxi : LEFT (LEFT (texttext [[, , počet_znakůpočet_znaků]]))

První parametr První parametr text text je povinný, druhý se však uvádět nemusí. Pokud se druhý parametr je povinný, druhý se však uvádět nemusí. Pokud se druhý parametr vynechá, implicitní hodnotou tohoto druhého parametru je 1.vynechá, implicitní hodnotou tohoto druhého parametru je 1.

= LEFT (A1,1)= LEFT (A1,1)

= LEFT (A1)= LEFT (A1)

Oba dva výstupy funkce Oba dva výstupy funkce leftleft jsou stejné. jsou stejné.

- Vlastní funkce, které napíšete v jazyce VBA mohou mít rovněž nepovinné parametry. Vlastní funkce, které napíšete v jazyce VBA mohou mít rovněž nepovinné parametry. Parametr označíme jako nepovinný tak, že před jeho název napíšeme klíčové slovo Parametr označíme jako nepovinný tak, že před jeho název napíšeme klíčové slovo OptionalOptional. .

Function Kresli(Oblast As variant, Optional Prepocitej As Boolean = False)Function Kresli(Oblast As variant, Optional Prepocitej As Boolean = False)

Application.Volatile PrepocitejApplication.Volatile Prepocitej

Kresli = Oblast.CountKresli = Oblast.Count

End FunctionEnd Function

- V seznamu parametrů se mohou nepovinné parametry objevit až za posledním povinným V seznamu parametrů se mohou nepovinné parametry objevit až za posledním povinným parametrem.parametrem.

Page 10: 8Funkce

Funkce, která vrací pole VBAFunkce, která vrací pole VBA

– Jazyk VBA obsahuje užitečnou funkci Jazyk VBA obsahuje užitečnou funkci ArrayArray. Tato funkce vrací . Tato funkce vrací datový typ variant, který obsahuje pole :datový typ variant, který obsahuje pole :

Function NazvyMesicu()Function NazvyMesicu()

NazvyMesicu = Array("Leden", "Únor", "Březen", "Duben", _NazvyMesicu = Array("Leden", "Únor", "Březen", "Duben", _

"Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", _"Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", _

"Listopad", "Prosinec")"Listopad", "Prosinec")

End FunctionEnd Function

– V MS Excel označte buňky, do kterých chcete funkci vložit, pak V MS Excel označte buňky, do kterých chcete funkci vložit, pak napište jméno funkce ( napište jméno funkce ( =NazvyMesicu()=NazvyMesicu() )a zmáčkněte současně )a zmáčkněte současně klávesy CTRL+SHIFT+ENTERklávesy CTRL+SHIFT+ENTER

Page 11: 8Funkce

Funkce s neurčitým počtem parametrůFunkce s neurčitým počtem parametrů

Některé funkce požadují předem neurčitý počet parametrů, příkladem Některé funkce požadují předem neurčitý počet parametrů, příkladem této funkce může být funkce SUM :této funkce může být funkce SUM :

= SUM (číslo1, číslo2, .. , číslon)= SUM (číslo1, číslo2, .. , číslon)

První parametr této funkce je vyžadován, ostatní jsou nepovinné, První parametr této funkce je vyžadován, ostatní jsou nepovinné, následuje příklad funkce SUM, která sečte 4 oblasti :následuje příklad funkce SUM, která sečte 4 oblasti :

= SUM (A1:C3, C7:D9, D12:E15, G13:O5)= SUM (A1:C3, C7:D9, D12:E15, G13:O5)

Typy parametrů lze rovněž kombinovat, lze napsat například takovouto Typy parametrů lze rovněž kombinovat, lze napsat například takovouto funkci :funkci :

= SUM (A1:C3, 55, D8, 12*2)= SUM (A1:C3, 55, D8, 12*2)Nebo si můžeme napsat sami funkci, která bude mít nespecifikovaný Nebo si můžeme napsat sami funkci, která bude mít nespecifikovaný

počet parametrů pomocí klíčového slova počet parametrů pomocí klíčového slova ParamArrayParamArray. Toto klíčové . Toto klíčové slovo může být použito u posledního parametru v množině slovo může být použito u posledního parametru v množině parametrů funkce. Jedná se vždy o datový typ parametrů funkce. Jedná se vždy o datový typ VariantVariant a je vždy a je vždy volitelným parametrem (i v případě, že nepřidáme klíčové slovo volitelným parametrem (i v případě, že nepřidáme klíčové slovo OptionalOptional))

Page 12: 8Funkce

Příklad 1Příklad 1

Function Jednoduchy (ParamArray pole() As Variant) As DoubleFunction Jednoduchy (ParamArray pole() As Variant) As Double

For Each prvek in pole()For Each prvek in pole()

Jednoduchy = Jednoduchy + prvekJednoduchy = Jednoduchy + prvek

Next prvekNext prvek

End FunctionEnd Function

Page 13: 8Funkce

Příklad 2Příklad 2

Function jednoduchy(ParamArray pole() As Variant) As DoubleFunction jednoduchy(ParamArray pole() As Variant) As Double For Each prvek In pole()For Each prvek In pole() If IsObject(prvek) ThenIf IsObject(prvek) Then For Each cosi In prvekFor Each cosi In prvek neco = neco + cosineco = neco + cosi Next cosiNext cosi ElseIf IsNumeric(prvek) ThenElseIf IsNumeric(prvek) Then neco = neco + prvekneco = neco + prvek End IfEnd If Next prvekNext prvek jednoduchy = necojednoduchy = necoEnd FunctionEnd Function