Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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 :-)

Předmět Autor Datum
Tak to máš prostě naprogramované blbě. My Ti na monitor nevidíme ani zde nevlastníme křišťálovou kou…
MachR55 16.08.2013 13:26
MachR55
Ale klídek pane ;-) jasne že sem si to odkrokoval, lenže problem je hlavne s procedurama na ukladani…
Clovek 16.08.2013 13:31
Clovek
Protože to v Excel:-(u 2007 jde, dá se vyloučit, že bys na to blbě odkazoval. Takže spíš bude příčin…
MachR55 16.08.2013 13:45
MachR55
Ešte pre upresnenie na formulare mam Multipage s 5 pages. A postupoval som tak že som si to krokoval…
Clovek 16.08.2013 13:54
Clovek
Složitostí formulářů a podmínek to samozřejmě může být, ale bez znalosti toho kódu bohužel víc nepor…
MachR55 16.08.2013 13:59
MachR55
kzyiepwvjmki66xvgz2d tu to je pro lepšie pochopenie :-)
Clovek 16.08.2013 14:30
Clovek
tak som zistil nasledujucu vec, jak som sem dal ten program, odstranil som z neho všetky Labels (oko…
Clovek 16.08.2013 14:46
Clovek
No, mě to taky nespadlo (vyzkoušeno v Excelu 2007 a XP), ale díval jsem se, že tam máš zmatky ohledn…
MachR55 16.08.2013 15:25
MachR55
o load a show už mam opravene , diky :-) a polia myslíš Frame ? či neco ine ? lebo tam mam objekty v…
Clovek 16.08.2013 16:18
Clovek
Přidání objektů na formulář za běhu: http://www.tushar-mehta.com/publish_train/xl_vba_c ases/1051%20…
Zdenál 17.08.2013 14:36
Zdenál
zaujímavé, to som vôbec nepoznal, musím si to naštudovať, díky ;-)
Clovek 17.08.2013 19:45
Clovek
Tak na dynamické objekty už jsi odkaz dostal. Tím nastrkáním do polí myslím práci ve VBA, kdy si obj… poslední
MachR55 19.08.2013 08:44
MachR55
a vyskočí chybová hláška Aká?
los 16.08.2013 21:14
los
Tu je screen aj komplet výpis 301365229
Clovek 17.08.2013 17:05
Clovek

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 Excel:-(u 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...

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:

UserForm1.Show
Load UserForm1

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...

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:

Rem Deklarace pole pro ulozeni odkazu na ComboBoxy ve Frame1 (dynamicke pole)
Dim aCbxFrm1() As Variant

Rem Pridani odkazu na ComboBox do pole
Pocet = Pocet + 1                 ' Promenna POCET obsahuje pocet doposud nactenych comboboxu
ReDim aCbxFrm1(Pocet) Preserve    ' Predeklarovani pole (zvetseni o 1)
Set aCbxFrm1(Pocet) = CbxVyber1   ' Prirazeni odkazu na ComboBox, pojmenovany "CbxVyber1"

Rem Prace s Comboboxy pomoci odkazu v poli
Vyber = aCbxFrm1(1).ListIndex     ' Zjisteni vybrane polozky v Comboboxu
For i = 1 to UBound(aCbxFrm1)     ' Cyklus pres vsechyn Comboboxy v poli
  aCbxFrm1(i).ForeColor = -2147483630   ' Zmena barvy popredi vsech Comboboxu
Next i

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:

Rem Deklarace promenne
Dim wsh1 As Worksheet  

Rem Prirazeni
Set wsh1 = ThisWorkbook.Worksheets("Sheet1")

Rem Prace s odkazem (zkrati a zprehledni se kod programu)
UserForm1.CheckBox5 = wsh1.CheckBox5

- 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.

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