
Excel VBA příliš dlouhý procedura
Zdravím,
V excelu 07 jsme si vytvořil proceduru, jejíž f-kcí je při kliknutí do určité buňky zobrazit data atd.
Problém nastal při přidání dalších části, což mělo za následek chybové hlášení- Compile Error:procedure too large
Jelikož jsem použil až příliš if, elseif, tak se ani nedivím. Jak zjednodušit daný code, aby nebyl tak dlouhý viz. část codu ?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$B$2" Then
Range("S3").Value = Sheets("Vypocty").Range("K5").Value
Range("T3").Value = Sheets("Vypocty").Range("L5")
Sheets("Vyp2").Range("G2").Value = Sheets("Vypocty").Range("J5")
Sheets("Vyp2").Range("H2").Value = "NEPRAVDA"
Call AP
Call ACs
ElseIf Target.Address = "$C$3" Then
Range("S3").Value = Sheets("Vypocty").Range("K6").Value
Range("T3").Value = Sheets("Vypocty").Range("L6")
Sheets("Vyp2").Range("G2").Value = Sheets("Vypocty").Range("J6")
Sheets("Vyp2").Range("H2").Value = "NEPRAVDA"
Call KP
Call KPs
.
.
.
End If
End Sub
Tak minimálně by to šlo rozdělit do více procedur.
Ale zároveň vystává otázka, jestli tam je vůbec potřeba tolik ElseIfů. Z toho příkladu je vidět, že jednotlivé větve jsou si dost podobné.
Problém není v elseifech, ale v tom, že procedura nesmí být větší jak 64 kB.
Pokud chceš, můžeš si dát každou Target.Address do samostatného IFu. Anebo to řeš pomocí Select Case
Ještě bych použil zkrácené odkazy na listy:
Ale celé to je nějaké podivné, chtělo by to nějak přepracovat. Ale víc neporadím, nějak mi není jasné, co vlastně potřebuješ...
Vyzkouším, pokud to nepůjde, tak poté upřesním dotaz
Další věc: Čím méně "teček" VBA prochází tím je rychlejší..
To taky upravím...
V tom, co mas napisane, by nemal byt problem. Skor je otazne,co predstavuju tie tri bodky do konca bloku If.
A pokial su tie podprocedury samostatne Sub-y, tak ich skus volat bez "Call", jednoducho len menom.
Ty tři tečky jsou další ElseIf ....
Tak potom to ries cez select case a nie if - elseif.
Plus vsetko okrem rozhodovania prehod do standardneho modulu makier, ako pisem nizsie.
Naviac si podla uvedneho nie som isty, ci nepotrebujres skor udalost Change namiesto SelectionChange... To sa z uvedeneho vycitat neda.
V tom, co mas napisane, by nemal byt problem. Skor je otazne,co predstavuju tie tri bodky do konca bloku If.
A pokial su tie podprocedury samostatne Sub-y, tak ich skus volat bez "Call", jednoducho len menom.
S dlzkou ani If, ElseIf tento zapis urcite nema problem.
Ale vsetky ukony mozes presunut do vseobecneho modulu makier a udalostou na urovni zosita len rozhodnut, na ktoru proceduru v standardnom module skocit.
A aj zjednodusit to ide ale to nie je kamenom urazu
Shrnutí:
IF ElseIf jsem nahradil za select case
Podprocedury jsem zbavil "Call" a nahradil modul.makro
Úkony jsem přesunul do modulu
Zatím jsem nevyzkoušel vše, ale zdá se, že to funguje. Jdu otestovat ještě zbytek..
Každopádně mám poslední dotaz, který se týká právě podprocedur, které mají samostatné Suby.
rada: "A pokial su tie podprocedury samostatne Sub-y, tak ich skus volat bez "Call", jednoducho len menom."
To jsem také učinil, ale našel jsem jiné znění:
"Bude fungovat jen tehdy, pokud procedura ani modul nejsou nastaveny jako Private.
U modulu to tak je, ale procedura je Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Takže teď nevím? ...po testu to jistě zjistím, ale nechci čekat...
Už so Select Case dosiahneš ohromné zjednodušenie a prehľadnosť.
Ako je to s Private, neviem, ale Ty tu nevoláš Private procedúry ale z Private voláš všeobecné procedúry.
Ja som zatiaľ Call nepoužil nikde aj keď v jednom mojom dotaze to bolo jedno z fungujúcich riešení ale fungovalo aj klasické volanie samotným menom.
Čiže keď máš makro napr
Sub Skuska (mesto)
MsgBox mesto
End Sub
tak volaním tejto procedúry
.
.
.
.
Skuska "Praha"
sa spustí makro Skuska, pričom je mu odovzdaný parameter "Praha", ktorý makro Skuska prevezme do premennej mesto a v MsgBoxe Ti Vypíše Praha
Tu som Ti zároveň naznačil možnosť použitia odovzdávania argumentu, ktoré je pre Tvoj prípad tiež užitočné pre zjednodušenie kódu.