
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ť?
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...
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 nepotřebuješ k aktualizaci žádné makro...
Omlouvám se, z toho "sešit" jsem nepochopil, že jde o Excel, o tom jsi tuším nikde v dotazu nepsal.
V titulku máš Visual Basic, ne Visual Basic for Application.
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.
Tak si vytvoř pomocné buňky, kam umístíš ten vzorec a z textového pole budeš odkazovat na ten výsledek.
Příklad: chci v textovém poli spojit obsah buněk A1 a A2, tj. zadat
To nejde, takže do buňky A3 napíšu ten vzorec a z textového pole se jen odkážu na A3.
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...
odpoveď pre Zdenál-a aj pre Honzu:
obaja navrhujete ten istý princíp.
Ano takto nejak by to určite šlo ale nebolo by to elegantné
až to inak nepôjde, budem sa musieť uberať týmto smerom...
Jaký je rozdíl mezi tím, kdyz vysledek (vzorec) napíšeš do buňky nebo použiješ přímo v textboxu?
v textovom poli (tvary) nefungujú vzorce, dá sa tam dať maximálne odkaz...
Už to nerieš, nechcem otravovať, ďakujem za trpezlivosť a ochotu...
Ak nenájdem iné riešenie, urobím to cez pomocnú skrytú tabuľku.
Ale vždyť to píšu.
Do textového pole si dej odkaz a aktualizuj buňky na pomocném listu.
Dotaz byl, jaký je rozdíl mezi tím když aktualizuješ pomocné buňky nebo přímo activeX
Áno, pustil som sa tou cestou.
Chcel som to vybaviť programovo, bez potreby pomocnýh hárkov, zoznamov a pod ale když to nejde tak to nejde
Ďakujem