Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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
Předmět Autor Datum
Tak minimálně by to šlo rozdělit do více procedur. Ale zároveň vystává otázka, jestli tam je vůbec p…
Wikan 28.11.2016 14:45
Wikan
Problém není v elseifech, ale v tom, že procedura nesmí být větší jak 64 kB. Pokud chceš, můžeš si…
Zdenál 28.11.2016 15:24
Zdenál
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 j…
questtt 28.11.2016 15:58
questtt
V tom, co mas napisane, by nemal byt problem. Skor je otazne,co predstavuju tie tri bodky do konca b…
robert13 28.11.2016 15:55
robert13
Ty tři tečky jsou další ElseIf ....
questtt 28.11.2016 16:00
questtt
Tak potom to ries cez select case a nie if - elseif. Plus vsetko okrem rozhodovania prehod do standa…
robert13 28.11.2016 16:04
robert13
V tom, co mas napisane, by nemal byt problem. Skor je otazne,co predstavuju tie tri bodky do konca b…
robert13 28.11.2016 16:00
robert13
Shrnutí: IF ElseIf jsem nahradil za select case Podprocedury jsem zbavil "Call" a nahradil modul.m…
questtt 29.11.2016 18:41
questtt
Už so Select Case dosiahneš ohromné zjednodušenie a prehľadnosť. Ako je to s Private, neviem, ale Ty… poslední
robert13 29.11.2016 21:42
robert13

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:

Set wsVyp = ThisWorkbook.Sheets("Vypocty")     ' Tohle dej na začátek, před IFy
...
Range("S3").Value = wsVyp.Range("K5").Value

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

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

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.

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