Excel 2003 vs novšie verzie - VBA
Ahoj. Mám nasledujúci problém:
V Exceli 2003 som vo VBA naprogramoval projekt na par tisic riadkov. Ked bol projekt hotový a išiel som ho otestovať na inom PC s excelom 2003 tak sa normalne zapne, vyskočí hláška či spustiť makrá a hned ako sa pustia ( pri otvorení excelu su nastavane nejake procedurky) tak spadne excel a vyskočí chybová hláška. Vyriešiť sa to dá tým že zapnem BEZ makier dam uložiť a potom to nespadne, no akonahle subor uložim a pustim znovu zase excel spadne.
Vyskúšaných bolo vela PC s excelom 2003. Ked som to testoval na exceli 2007 a 2010 daný problém nenastal nikdy.
Z toho som vydedukoval, či náhodou nemá excel 2003 ohladom VBA nejaké obmedzenia čo do počtu nejakých objektov alebo niečo podobné.
Za každú radu vopred ďakujem
Tak to máš prostě naprogramované blbě. My Ti na monitor nevidíme ani zde nevlastníme křišťálovou kouli (i když si to asi mnozí dotazující myslí), takže nevíme, na čem přesně Ti to spadne. Prostě si to musíš odkrokovat nebo pro začátek tam nacpat kontrolní hlášky, abys viděl, jak daleko se dostaneš.
Omezení Excelu pro VBA jsou různé - viz výsledky hledání "excel 2003 vba limitation". Ale to bys mohl - jako autor tisíciřádkového projektu - přece vědět?
Ale klídek pane
jasne že sem si to odkrokoval, lenže problem je hlavne s procedurama na ukladanie a načitanie. Príklad v exceli mam checkbox, procedura ma jeho hodnotu zapisat do prave sa otvarajuceho formulara, a presne pri tomto padne, alebo naopak. Pri večine objektov je to v pohode, ale pri nektorych to padne, a netušim proč ... a nechapem jakto že to v exceli 2007 a vic ide bez problemu...
Protože to v Excelu 2007 jde, dá se vyloučit, že bys na to blbě odkazoval. Takže spíš bude příčina někde v pořadí či rychlosti inicializace příslušných objektů (2003 to může mít jinak než 2007), třeba se snažíš zapisovat do formuláře, který se ve verzi 2003 vytváří pomaleji (má tam třeba více položek), nebo je v 2003 vázán na inicializaci ještě jinýho objektu, nebo se tam děje ještě něco jinýho, netuším.
Co se stane, když v tom začátku necháš jen ten inkriminovaný objekt, na kterém to padá, spadne to taky?
Moje zkušenosti s kompatibilitou VBA maker mezi verzemi Excelu 2003 a 2007 jsou dost nepěkné a spíše opačného rázu - co mi fungovalo ve 2003 tak ve 2007 nejede.
Ešte pre upresnenie na formulare mam Multipage s 5 pages. A postupoval som tak že som si to krokoval, a vždy chybný članok vyradil z kodu všade kde sa použival, a takto som vyradil snad už 1/4 objektov a stale sa nachadzaju nove a nove ktore tam postupne pribudali... je tam aj vela nadvezností, ked sa z comboboxu vyberie nejaka položka tak sa objavý další combobox podla vybranej položky a tak dalej, takže ma napadlo či to nemože byť aj zložitostou podmienok alebo tak... Len to ma zaujima, jakto že je možne že pri prvom spustení to ide aj v 2003. Až ked to uložim a nasledne otvorím to padne...
Složitostí formulářů a podmínek to samozřejmě může být, ale bez znalosti toho kódu bohužel víc neporadím, s takovým chováním jsem se nikdy nesetkal.
kzyiepwvjmki66xvgz2d tu to je pro lepšie pochopenie
tak som zistil nasledujucu vec, jak som sem dal ten program, odstranil som z neho všetky Labels (okolo 250) a zrazu to už nepadá ... takže to bolo zrejme tým...
No, mě to taky nespadlo (vyzkoušeno v Excelu 2007 a XP), ale díval jsem se, že tam máš zmatky ohledně aktivace toho formuláře při otevření sešitu. V proceduře Sub auto_open() máš za sebou tyto příkazy:
Ujasni si rozdíl mezi Load (vyvolá událost Initialize, formulář nezobrazí) a Show (je-li třeba, vyvolá událost Initialize a poté událost Activate) - třeba zde. Nevím, třeba je háček někde jinde, ale tohle si určitě oprav.
A jestli můžu mít k Tvému projektu nějakou poznámku - proč nevyužíváš přidávání či odebírání objektů za běhu? Proč ty objekty nenastrkáš do polí, abys k nim měl jednotný přístup? Takhle je to šílený, to bych fakt nechtěl někdy v budoucnu upravovat...
o load a show už mam opravene , diky a polia myslíš Frame ? či neco ine ? lebo tam mam objekty vždy rozdelene do Frame a ovladam tie jak celok. A pridavani a odebirani objektu za behu teš moc nechapem co je mysleno Diky za pomoc
Přidání objektů na formulář za běhu: http://www.tushar-mehta.com/publish_train/xl_vba_c ases/1051%20Add%20userform%20items%20on%20the%20fl y.shtml.
Dobrý příklad je třeba i zde: http://en.kioskea.net/faq/12523-vba-adding-control s-dynamically-into-a-userform
zaujímavé, to som vôbec nepoznal, musím si to naštudovať, díky
Tak na dynamické objekty už jsi odkaz dostal. Tím nastrkáním do polí myslím práci ve VBA, kdy si objekty (resp. odkazy na ně) vložíš do pole a pak na ně odkazuješ přes to pole. Příklad:
Filozofie přístupu je myslím z příkladu zřejmá.
Dále, co jsem se ještě zběžně díval, bych Ti doporučil:
- vše z procedury UserForm_Activate přesuň do UserForm_Initialize
- na začátek této části přidej "Application.ScreenUpdating = False" a na konec "Application.ScreenUpdating = True"
- v těch jednotlivých procedurách "nacitajxx" a "naplnxx" vymaž přepínače překreslování obrazovky (Application.ScreenUpdating = False/True). To by mělo odstranit to blikání při startu aplikace
- dále doporučuji vytvořit zkratku na worksheet, zjednoduší to práci (zejména pokud bys potřeboval ten list přejmenovat) a zpřehlední kód:
- na začátku máš poměrně velké zdržení, než všechno načteš z listu do formuláře. Pamatuj, že nejpomalejší je vždy přesun dat mezi listem a VBA kódem. Pokud něco takového potřebuješ, vždy je lepší načíst si potřebný obsah jedním příkazem z listu do nějakého pomocného pole (je jedno, jestli načítáš jednu buňku nebo třeba 10000 buněk) a pole si zpracovat v makru. Musel bys ale předělat ovládací prvky v listu - místo ovládacích prvků ActiveX použít formulářové ovládací prvky, u nichž si můžeš nastavit, s kterou buňkou budou svázány. Tyto buňky si pak nastavit na druhý list a pak komunikovat právě prostřednictvím toho druhého listu. Ale to je práce na delší dobu, ber to spíš jako doporučení pro další projekty.
- pokud to s VBA myslíš vážně, doporučuji tuhle knihu. Sám ji mám pro Excel 2003 a většinu zde uvedených tipů mám právě z té knihy, nemůžu si ji vynachválit.
Aká?
Tu je screen aj komplet výpis 301365229