Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Visual Basic - zmeny vlastností Caption ActiveX prvkov

Ahoj
prosím o pomoc pri nasledujúcom probléme:

V zošite mám vložených napr 5 ActiveX prvkov typu label.
Vo vlastnostiach (v režime návrhu) majú nastavené názvy (Name) napr A, B, C, D a E a obsah hodnôt (Caption) napr 1, 2, 3, 4 a 5.
(Zvláštne, že keď chcem tieto prvky cyklom volať, musím sa odvolávať nie na Controls ale Shapes)
Tieto prvky potrebujem aktualizovať podľa tabuľky v inom hárku tak, že podľa získaného mena potrebujem vyhľadať v tabuľke príslušnú hodnotu a tú vložiť do vlastnosti Caption.

mám to takto:

for i = 1 to 5
x = Shapes(i).Name
n = worksheetfunction.vlookup(x,....)
Shapes(i).Caption = n
next i

toto mi nefunguje, napriek tomu, že ActiveX prvok má vlastnosti Name aj Caption.
Musím ho však volať ako Shapes(i), z ktorého hodnotu Name vyčítať vie, ale nevie nastaviť hodnotu Caption.

Ak riadok Shapes(i).Caption = n opravím na A.Caption = n , tak to funguje, ale týmpádom je obecnosť cyklu v prdeli, musel by som jednotlivo ponastavovať Caption všetkých prvkov jednotlivo a to nehovorím, že prvkov tam mám v skutočnosti oveľa viac.

Vie prosím, niekto poradiť?

Předmět Autor Datum
Z jakého důvodu se musíš odkazovat na ActiveX prvky pomocí Shape? Shape nemá vlastnost caption, takz…
Jan Fiala 29.03.2015 08:12
Jan Fiala
Ale veď ja sa ani nechcem odkazovať na ActiveX prvky pomocou Shape... Veď o tom je celý môj dotaz...…
robert13 29.03.2015 10:39
robert13
To chceš říct, že máš v databázi jména a prvky umísťuješ staticky v režimu návrhu a pak to "nějak" (…
Jan Fiala 29.03.2015 11:52
Jan Fiala
neviem, či si rozumieme... Tak ešte raz: Mám excelovský zošit s prvým hárkom, na ktorom je mapa s c…
robert13 29.03.2015 12:30
robert13
Možná by to bylo snažší vyřešit pomocí textových polí, do nich přímo můžeš vkládat odkaz na buňku a…
Zdenál 29.03.2015 15:56
Zdenál
Omlouvám se, z toho "sešit" jsem nepochopil, že jde o Excel, o tom jsi tuším nikde v dotazu nepsal.…
Jan Fiala 29.03.2015 18:03
Jan Fiala
ja sa ospravedlňujem ;-) Inak - medzitým som odskúšal tip využitia textového poľa (Tvary), ale to f…
robert13 29.03.2015 18:10
robert13
Tak si vytvoř pomocné buňky, kam umístíš ten vzorec a z textového pole budeš odkazovat na ten výsled…
Zdenál 29.03.2015 18:18
Zdenál
A nemuzes to vyresit tak, ze by byl dalsi (skryty) list, ve kterem by byla pro kazde textove pole bu…
Jan Fiala 29.03.2015 18:19
Jan Fiala
medzitým, ako ste mi odpovedali, som dopĺňal môj vyšší komentár ale už som ho nedokázal zmeniť, tak…
robert13 29.03.2015 18:27
robert13
odpoveď pre Zdenál-a aj pre Honzu: obaja navrhujete ten istý princíp. Ano takto nejak by to určite…
robert13 29.03.2015 18:29
robert13
Jaký je rozdíl mezi tím, kdyz vysledek (vzorec) napíšeš do buňky nebo použiješ přímo v textboxu?
Jan Fiala 29.03.2015 19:44
Jan Fiala
v textovom poli (tvary) nefungujú vzorce, dá sa tam dať maximálne odkaz... Už to nerieš, nechcem ot…
robert13 30.03.2015 05:26
robert13
Ale vždyť to píšu. Do textového pole si dej odkaz a aktualizuj buňky na pomocném listu. Dotaz byl,…
Jan Fiala 30.03.2015 08:18
Jan Fiala
Áno, pustil som sa tou cestou. Chcel som to vybaviť programovo, bez potreby pomocnýh hárkov, zoznam… poslední
robert13 30.03.2015 11:02
robert13

Z jakého důvodu se musíš odkazovat na ActiveX prvky pomocí Shape? Shape nemá vlastnost caption, takze ji ani nemuzes nastavovat. Najdi si obecného předka, který je pouzitelný i pro tvé ActiveX prvky (kterých nikdo z nás nic neví, protože jsi žádné informace nedodal) a který obsahuje i Caption.

Je opravdu nutné používat nějaké další externí ActiveX? Neexistují nativní kompoenety, které by se daly použít?

Ale veď ja sa ani nechcem odkazovať na ActiveX prvky pomocou Shape... Veď o tom je celý môj dotaz...
PRETO som tam umiestňoval ActiveX, aby som MAL prvky, u ktorých sa dajú tieto vlastnosti nastavovať!
Problém je v tom, že napriek tomu, že som tam dal ActiveX, ich neviem volať ako kolekciu Controls. Vedel som ich získať len pomocou Shape, čo mi samozrejme nevyhovuje, lebo VIEM, že Shape nemá ani Name ani Caption.

A neviem, čo by si potreboval vedieť, keď píšeš, že som žiadne informácie nedodal...
Tak ešte raz:
vo Vývojárovi som v režime návrhu do hárku (t.j. nie do formulára) vložil ActiveX: Label, keďže ActiveX má možnosť nastavovať množstvo parametrov a teda aby som dokázal nastavovať Name a Caption (prípadne i Backcolor).

Z popísanej procedúry je jasné, čo potrebujem:
prvkov tam mám cca 200 , tak spravím cyklus pre i od 1 do 200, pre každý prvok získam Name, ktoré vyhľadám v databáze a z databázy vyčítanú hodnotu pre daný prvok chcem naplniť do Caption.

Že prečo ActiveX?
Jednak pre už uvedenú možnosť nastavovania množstva vlastností a jednak kvôli tomu, že na hárku mám obrázok: mapu
K mapám som pri jednotlivých mestách potreboval vizuálnu informáciu z databázy, tak som ku každému mestu umiestnil ActiveX, ktorého Name je názov mesta. Dajme tomu, že pre každé mesto potrebujem napr počet obyvateľov... Takže v databáze vyhľadám mesto a zistím jeho počet obyvateľov. Počet obyvateľov chcem dať do Caption ActiveX-u. Prípadne podľa počtu obyvateľov môžem zmeniť i ďalšiu vlastnosť príslušného ActiveX - Backcolor. A to všetko do mapy (nie do buniek hárka, keďže sú prekryté mapou), vloženej ako obrázok do hárku

Ak poznáš iný spôsob, poraď

P.S. zaujímavé, že ak dám
Sheets("Mapa").Bratislava.Caption=5
tak to ide (Bratislava je Name ActiveX-u), ale potrebujem tie prvky zobecniť, aby som ich mohol volať v cykle parametrom Index a nie konkrétnym menom. Neviem, ako ich označiť inak, než Shapes(i)
Takže namiesto:
Sheets("Mapa").Shapes(i).Caption=5
potrebujem dostať (lebo Shape nemá Caption) niečo ako:
Sheets("Mapa").Prvok(i).Caption=5
pričom "i" je v tomto prípade index prvku s názvom Bratislava

Díky

To chceš říct, že máš v databázi jména a prvky umísťuješ staticky v režimu návrhu a pak to "nějak" (myšleno vyhledáváním dle jména) propojuješ?
Proč si nevytvoříš prvky až za běhu programu - v databázi stačí mít souřadnice, kam se prvek vytvoří a pak to máš vše pod kontrolou. Vytvoříš a nastavíš Caption, jak potřebuješ.

neviem, či si rozumieme...

Tak ešte raz:
Mám excelovský zošit s prvým hárkom, na ktorom je mapa s cca 200 mestami, pri každom meste je rámik (ActiveX) s Backcolor určitej farby a s Caption s počtom obyvateľov (len ako príklad). Prvky ActiveX typu Label som do mapy dostal, rozmiestnil a pridelil im mená v režime návrhu (len tak tam tie prvky dostanem), po umiestnení, rozmiestnení a pomenovaní prvkov som režim návrhu vypol. HOTOVO. Toto je základný hárok v súbore: mapa so "štítkami" s počtami obyvateľov. Keď otvorím zošit, vidím mapu so štítkami. Fertig. Informačná mapa...
K tomu žiadny program nepotrebujem.

Druhý hárok je tabuľka (databáza), do ktorej sa k mestám manuálne z času na čas aktualizujú počty obyvateľov.
A TERAZ potrebujem procedúru:
Keď tabuľku zaktualizujem a prepnem sa na hárok mapy, udalosťou hárka mapy Activate sa má spustiť procedúra, ktorá mi zaktualizuje počty obyvateľov (Caption) a podfarbenie (Backcolor) vo farebnej škále podľa počtu obyvateľov v prvkoch ActiveX. Hotovo.
Uložím a punktum.

Nabudúce keď Excel otvorím, vidím mapu s naposledy aktualizovanými počtami obyvateľov... Bez akéhokoľvek behu programu.
Program potrebujem len v momente, keď upravím v tabuľke počty obyvateľov.
Toť vše...

ja sa ospravedlňujem ;-)

Inak - medzitým som odskúšal tip využitia textového poľa (Tvary), ale to funguje len v prípade, že textové pole odkazuje na nejakú bunku, ktorá obsahuje hodnotu, ktorá sa má zobraziť v textovom poli.
Môj problém by bol vyriešený, keby sa do textového poľa dal zadať vzorec.

A nemuzes to vyresit tak, ze by byl dalsi (skryty) list, ve kterem by byla pro kazde textove pole bunka?
Pak bys jednoduse naplnil obsahy bunek a na zaklade toho by se ti zobrazily texty.
Klidne tam muzes mit sloupců kolik chces, v jednom jméno mesta, podle ktereho budes vyhledavat a v dalsim vlastni obsah.
A2 - Bratislava
B2 - udaje, ktere zobrazujes

textove pole odkazuje na B2

medzitým, ako ste mi odpovedali, som dopĺňal môj vyšší komentár ale už som ho nedokázal zmeniť, tak ešte raz:

a sa ospravedlňujem, mea culpa ;-)

Inak - medzitým som odskúšal tip od Zdenál, t.j. využitia textového poľa (Tvary)a začalo to vyzerať sľubne, kým som nezistil, že textové pole môže obsahovať akurát tak odkaz na bunku, ale nie vzorec. A Použiť vzdialenú bunku na výpočet vzorca a textovým poľom sa odkázať na túto bunku pre mňa nie je schodné.

Celý príklad, ktorý som uvádzal, bol zjednodušený, kvôli vysvetleniu problému.

V skutočnosti nehľadám v databáze jednu konkrétnu hodnotu ale potrebujem napr pre Bratislavu vrátiť výsledok vzorca
=COUNTIFS(Sklady!B2:B200;"=Bratislava";Sklady!E2:E 200;"=3")

Takže v prípade ActiveX potrebujem do Label.Caption dostať výsledok uvedenej funkcie
a v prípade textového poľa (Tvary) detto

Uvažoval som definovať prvky Shapes(i) ako kolekciu objektov, aby som ich dokázal volať ako indexované objekty, ktoré by už vlastnosť Caption mali, ale tak ďaleko moje schopnosti nesiahajú, ako to zapísať.

Moje neznalé úvahy smerovali nejak takto:
dim Shapes(200) as collection (as control?)
set control(i)=shapes(i)?

Proste spraviť zo Shape objekt, ktorý viem volať indexom, zistiť jeho Name a prideliť do jeho Caption hodnotu získanú z vyššieuvedeného vzorca...

Zpět do poradny Odpovědět na původní otázku Nahoru