Stránka 1 z 1

Psani funkci ve VBA Excel (vyřešeno)

Napsal: 18 říj 2005 15:38
od cukista
Pisu si funkci ve VBA pro Excel a chci, aby jejim vystupem byl typ Range, tj. aby vysledkem funkce byl seznam nejakych hodnot, kde prvni hodnota se vypise na miste funkce a dalsi se vypisou podle potreby dolu a doprava... Nemate nekdo nejakou myslenku, jak toho docilit

Napsal: 18 říj 2005 20:41
od miras
Ty jo, asi by to chtělo bejt krapet konkrétnější. Vymyslet se nechá prakticky cokoliv, ale z tohohle popisu můžu snadno vytvořit něco diametrálně odlišnýho než co bys potřeboval :wink:
Ideální by byl konkrétní příklad :idea:

Re: Psani funkci ve VBA Excel

Napsal: 19 říj 2005 09:56
od mikel
cukista píše:Pisu si funkci ve VBA pro Excel a chci, aby jejim vystupem byl typ Range, tj. aby vysledkem funkce byl seznam nejakych hodnot, ...

Už tady si odporuješ. Nejdříve chceš, aby vystupem funkce byla nějaká oblast a hned nato to má být nějaké pole čísel. Jen pro upřesnění, výstupem funkce nemůže být objekt (Range), ale nějaká hodnota/řetězec nebo pole hodnot/řetězců. Takže nejlepší bude, když napíšeš příklad čeho chceš touto funkcí docílit a pak můžeme poradit.

Napsal: 19 říj 2005 13:39
od cukista
no ja mam celkem jasno, co potrebuju (pripominka k tomu, ze bych si odporoval)... Chci, aby moje funkce vracela 3 hodnoty (at se to jmenuje pole nebo mne napadlo typ Range, je to v tomto pripade nepodstatne) a to tak, ze prvni hodnota bude v bunce, ktera obsahuje funkci a dalsi dve hodnoty budou v bunkach pod ni... Treba by to slo primym zapisem do bunek pod funkci, ale jaksi jsem neprisel na to, jak zjistit, ve ktere bunce se funkce nachazi (abych pak mohl psat primo do nasledujici bunky). Druha moznost mne napadla pomoci "Tabulky", kdy jsou funkce nejak spojene (pak se ukazuji ve slozenych zavorkach), ale to teda uz vubec nevim, jak to resit... Hlavne ta druha moznost mi prijde cistejsi a funkce, ktere vraceji vice hodnot uz jsem videl v provozu - ale jak to naprogramovat???

Napsal: 19 říj 2005 13:44
od cukista
... jo a konkretni priklad... tak treba bude funkce, ktera scita 2 parametry a jako vystup budou ty dva parametry + soucet - v bunkach pod sebou...
(ja sice resim neco slozitejsiho, ale princip je naprosto totozny)

Napsal: 20 říj 2005 08:51
od mikel
Nepochybuju, že máš jasno v tom, co chceš, ale je třeba to sdělit i ostatním, co možná nejpřesněji.
Problém funkce je ten, že dost dobře neumí pracovat s buňkou, takže pouze vypíše výsledek do buňky, kde zadáš vzorec. Tohle by dokázala vyřešit procedura, ale tu nemůžeš použít jako vzorec přímo v Excelu. Takže zbývá jediné řešení, a to použít funkci ve formátu maticového vzorce - vybereš buňky, ve kterých má být výsledek funkce, napíšeš vzorec (aniž bys zrušil označenou oblast), jenže neukončíš zadání Enterem, ale Ctrl+Shift+Enter. Tak vznikne zápis funkce ve složených závorkách, jak ses zmínil, a výsledek se zapíše do všech označených buněk. Má to ovšem malý nedostatek - všechny vzorce jsou části matice, takže nemůžeš vymazat jenom část z nich, ale pouze všechny najednou. Mělo by to platit snad pro všechny standardní funkce, tak si to můžeš zkusit např. s =SUMA(x:y).
A teď k tvému konkrétnímu příkladu. Tady je zápis funkce na součet libovolného počtu čísel ve vybrané oblasti.
Obrázek
Napsal jsem to tak, že sečte čísla i v oblasti, kde jsou nějaké text.řetězce (viz příklad).
Obrázek
Jak můžeš vidět, výsledkem funkce je pole čísel, kde první hodnota je suma a další jsou sčítané položky. Když ji napíšeš do samostatné buňky, vypíše pouze sumu. Když ji zadáš jako maticový vzorec, vypíše sumu a položky podle toho, jak velkou oblast zápisu vybereš (všechny tvary funkce v příkladu jsou stejné, liší se jen velikostí vybrané oblasti pro zápis funkce).

Napsal: 20 říj 2005 09:21
od cukista
Je to super, dik moc... Ja jsem teda jak jsem zvykly prosmejdil help i predtim, kdyz jsem poradne nevedel co hledat a i ted, abych se dozvedel neco o Application.Transpose, ale nenasel jsem vubec nic...
R.

Napsal: 20 říj 2005 09:27
od mikel
Pokud je výstupem funkce pole, tak standardní výpis je na řádek. Pokud chceš výstup do sloupce, musíš ho transponovat = Application.Transpose

Napsal: 20 říj 2005 10:06
od cukista
Aha, tak pak ta myslenka, ktera by mne asi nikdy nenapadla je, ze i kdyz nenadefinujes typ vystupu funkce v hlavicce, muzes presto hodnotu priradit a dokonce to muze byt i pole.... No zas jsem o neco chytrejsi... Dik jeste jednou.

Napsal: 20 říj 2005 12:41
od mikel
To souvisí s defaultním nastavením pro funkci a to je datový typ Variant.
Když má být výstupem pole musí to být Variant, to znamená že to je úplně stejné, jako kdybych napsal:

Function FUNKCE(Oblast As Range) As Variant