< návrat zpět

MS Excel


Téma: Dlouhý kód ve VBA rss

Zaslal/a 3.8.2017 14:27

Dobrý den,

rád bych se zeptal na max velikost kodu ve VBA, napsal jsem asi dost dlouhý kod a při spuštění mi to hodí hlášku "Procedure too large"
Lze nějak optimalizovat kod, nebo vložit nějakou proceduru, či větu, která akceptuje i delší kod VBA?
Nevím co jinak s tím, nápověda nabízí kod rozdělit, ale to u mě asi nepůjde, neboť to chci spouštět jedním tlačítkem.
Díky předem

Zaslat odpověď >

Strana:  1 2   další »
icon #037092
eLCHa
Jste šikovný. To musí být šíleně přehledné.

Rozdĕlte proceduru na více a pod tlačítkem postupně zavolejte všechny části-procedury.citovat
#037094
avatar
No to právě nevím jak..jedná se logovací tabulku, kde dle hesla zobrazuji pouze nějaké listy a nějaké musí být schovány.
Těch listů je asi 50 a mám asi 20 různých práv.
Klasicky nějaké listy nechávám jako visible True a ty další jako xlveryhidden...nicméně mi to vyhází na nějakých 1000 řádků kodu a nevím jak tu proceduru rozdělit :-(

Zkusím ty práva nějak zkonsolidovat..uvídíme.
Každopádně děkujicitovat
#037095
elninoslov
Za prvé neverím tomu, že sa to nedá rozsekať a/alebo parametrizovať procedúry, či rozhodiť do modulov. To je blbosť.
Za druhé nikto Vám to neurobí, bez toho, aby ste zverejnil ten kód, čo je logické.
Za tretie, len všeobecne, napr. si najskôr urobte iba base procedúru na kontrolu práv, napr Select Case, odtiaľ volajte s parametrom inú procedúru na skrytie/odkrytie. Ďalej odstráňte všetky Sheets("názovlistu").Select a rovno použite Sheets("názovlistu").potrebná_operácia.
To logovanie alebo čo to vlastne robíte, je asi nejaký zápis užívateľa a jeho akcie. Ak je tak, tak to je jasný kandidát na samostatnú procedúru
Sub LogProc(User as String, Akcia as Long, Cas as Double)
... zapíšte...
End Sub
...
Inak povedané, opakujúce sa časti kódu majú byť samostatná procedúra.
Opakujúce sa časti kódu so zmeneným parametrom, majú byť samostatná parametrizovaná procedúra.
...

Čo viac napísať, keď sme "slepí"...citovat
#037096
avatar
Posílám část kodu ve wordu, potřebuji, aby těch Case rolí bylo asi 20...takto jen pro ukázku
Taky nevěřím, že se to dá rozsekat, to makro se spouští automaticky při otevření souboru...logicky

Díky moccitovat
#037097
avatar
Tak word mi to jako přílohu nebere, posílám excel.
Ale to že to nejde rozsekat je můj laický názor, s VBA terpve začínám a učím se za pochodu.
Příloha: xlsx37097_kod.xlsx (11kB, staženo 31x)
citovat
icon #037098
eLCHa
Určitě to jde ještě zjednodušit, ale to není téma.
Otestovat nemohu, ale principPrivate Sub CommandButton1_Click()
Dim UserName As String
Dim Password As String

UserName = TextBox1.Value
Password = TextBox2.Value

If UserName = "" Or Password = "" Then
MsgBox "PROSÍM VYPLŇTE VŠECHNA POLE"
Exit Sub
End If

RowCounter = 2
Do
If UserName = Sheets("UserData").Cells(RowCounter, 1).Value Then
If Password = Sheets("UserData").Cells(RowCounter, 2).Value Then
Role = Sheets("UserData").Cells(RowCounter, 3).Value
Exit Do
Else
MsgBox "NESPRÁVNÉ HESLO!"
Exit Sub
End If
ElseIf Sheets("UserData").Cells(RowCounter, 1).Value = "" Then
MsgBox "NEEXISTUJÍCÍ UŽIVATEL!"
Exit Sub
End If

RowCounter = RowCounter + 1
Loop

Application.ScreenUpdating = False
Select Case (Role):
Case ("MASTER"):
Call subSet_1

Case ("OSTAT"):
Call subSet_2

Case ("OSOUKR"):
Call subSet_3
End Select
Application.ScreenUpdating = True

Unload Me
End Sub

Private Sub subSet_1()
Sheets("START").Visible = True
Sheets("PL_T").Visible = True
Sheets("PL_TS").Visible = True
Sheets("1").Visible = True
Sheets("2").Visible = True
Sheets("3").Visible = True
Sheets("4").Visible = True
Sheets("5").Visible = True
Sheets("6").Visible = True
Sheets("7").Visible = True
Sheets("8").Visible = True
Sheets("9").Visible = True
Sheets("10").Visible = True
Sheets("11").Visible = True
Sheets("1S").Visible = True
Sheets("2S").Visible = True
Sheets("3S").Visible = True
Sheets("4S").Visible = True
Sheets("5S").Visible = True
Sheets("6S").Visible = True
Sheets("7S").Visible = True
Sheets("8S").Visible = True
Sheets("9S").Visible = True
Sheets("10S").Visible = True
Sheets("11S").Visible = True
Sheets("R").Visible = True
Sheets("R1").Visible = True
Sheets("R2").Visible = True
Sheets("O1").Visible = True
Sheets("O2").Visible = True
Sheets("O3").Visible = True
Sheets("O4").Visible = True
Sheets("O5").Visible = True
Sheets("O6").Visible = True
Sheets("O7").Visible = True
Sheets("O8").Visible = True
Sheets("O9").Visible = True
Sheets("O10").Visible = True
Sheets("O11").Visible = True
Sheets("O12").Visible = True
Sheets("O13").Visible = True
Sheets("O14").Visible = True
Sheets("O15").Visible = True
Sheets("O16").Visible = True
Sheets("O17").Visible = True
Sheets("O18").Visible = True
Sheets("O19").Visible = True
Sheets("O20").Visible = True
Sheets("DATA").Visible = True
Sheets("INPUT").Visible = True
Sheets("CF_M").Visible = True
Sheets("CF_T").Visible = True
Sheets("C").Visible = True
Sheets("C_P").Visible = True
Sheets("O1").Visible = True
Sheets("UserData").Visible = True
Sheets("START").Select
Range("B2").Select
End Sub

Private Sub subSet_2()
Sheets("START").Visible = xlVeryHidden
Sheets("PL_T").Visible = xlVeryHidden
Sheets("PL_TS").Visible = xlVeryHidden
Sheets("1").Visible = xlVeryHidden
Sheets("2").Visible = xlVeryHidden
Sheets("3").Visible = xlVeryHidden
Sheets("4").Visible = xlVeryHidden
Sheets("5").Visible = xlVeryHidden
Sheets("6").Visible = xlVeryHidden
Sheets("7").Visible = xlVeryHidden
Sheets("8").Visible = xlVeryHidden
Sheets("9").Visible = xlVeryHidden
Sheets("10").Visible = xlVeryHidden
Sheets("11").Visible = xlVeryHidden
Sheets("1S").Visible = xlVeryHidden
Sheets("2S").Visible = xlVeryHidden
Sheets("3S").Visible = xlVeryHidden
Sheets("4S").Visible = xlVeryHidden
Sheets("5S").Visible = xlVeryHidden
Sheets("6S").Visible = xlVeryHidden
Sheets("7S").Visible = xlVeryHidden
Sheets("8S").Visible = xlVeryHidden
Sheets("9S").Visible = xlVeryHidden
Sheets("10S").Visible = xlVeryHidden
Sheets("11S").Visible = xlVeryHidden
Sheets("R").Visible = xlVeryHidden
Sheets("R1").Visible = xlVeryHidden
Sheets("R2").Visible = xlVeryHidden
Sheets("O1").Visible = True
Sheets("O2").Visible = True
Sheets("O3").Visible = True
Sheets("O4").Visible = True
Sheets("O5").Visible = True
Sheets("O6").Visible = xlVeryHidden
Sheets("O7").Visible = xlVeryHidden
Sheets("O8").Visible = xlVeryHidden
Sheets("O9").Visible = xlVeryHidden
Sheets("O10").Visible = xlVeryHidden
Sheets("O11").Visible = xlVeryHidden
Sheets("O12").Visible = xlVeryHidden
Sheets("O13").Visible = xlVeryHidden
Sheets("O14").Visible = xlVeryHidden
Sheets("O15").Visible = xlVeryHidden
Sheets("O16").Visible = xlVeryHidden
Sheets("O17").Visible = xlVeryHidden
Sheets("O18").Visible = xlVeryHidden
Sheets("O19").Visible = xlVeryHidden
Sheets("O20").Visible = xlVeryHidden
Sheets("DATA").Visible = xlVeryHidden
Sheets("INPUT").Visible = xlVeryHidden
Sheets("CF_M").Visible = xlVeryHidden
Sheets("CF_T").Visible = xlVeryHidden
Sheets("C").Visible = xlVeryHidden
Sheets("C_P").Visible = xlVeryHidden
Sheets("UserData").Visible = xlVeryHidden
Sheets("O1").Select
Range("A1").Select
End Sub

Private Sub subSet_3()
Sheets("START").Visible = xlVeryHidden
Sheets("PL_T").Visible = xlVeryHidden
Sheets("PL_TS").Visible = xlVeryHidden
Sheets("1").Visible = xlVeryHidden
Sheets("2").Visible = xlVeryHidden
Sheets("3").Visible = xlVeryHidden
Sheets("4").Visible = xlVeryHidden
Sheets("5").Visible = xlVeryHidden
Sheets("6").Visible = xlVeryHidden
Sheets("7").Visible = xlVeryHidden
Sheets("8").Visible = xlVeryHidden
Sheets("9").Visible = xlVeryHidden
Sheets("10").Visible = xlVeryHidden
Sheets("11").Visible = xlVeryHidden
Sheets("1S").Visible = xlVeryHidden
Sheets("2S").Visible = xlVeryHidden
Sheets("3S").Visible = xlVeryHidden
Sheets("4S").Visible = xlVeryHidden
Sheets("5S").Visible = xlVeryHidden
Sheets("6S").Visible = xlVeryHidden
Sheets("7S").Visible = xlVeryHidden
Sheets("8S").Visible = xlVeryHidden
Sheets("9S").Visible = xlVeryHidden
Sheets("10S").Visible = xlVeryHidden
Sheets("11S").Visible = xlVeryHidden
Sheets("R").Visible = xlVeryHidden
Sheets("R1").Visible = xlVeryHidden
Sheets("R2").Visible = xlVeryHidden
Sheets("O1").Visible = xlVeryHidden
Sheets("O2").Visible = xlVeryHidden
Sheets("O3").Visible = xlVeryHidden
Sheets("O4").Visible = xlVeryHidden
Sheets("O5").Visible = xlVeryHidden
Sheets("O6").Visible = True
Sheets("O7").Visible = True
Sheets("O8").Visible = True
Sheets("O9").Visible = True
Sheets("O10").Visible = True
Sheets("O11").Visible = True
Sheets("O12").Visible = True
Sheets("O13").Visible = True
Sheets("O14").Visible = True
Sheets("O15").Visible = True
Sheets("O16").Visible = True
Sheets("O17").Visible = True
Sheets("O18").Visible = True
Sheets("O19").Visible = True
Sheets("O20").Visible = True
Sheets("DATA").Visible = xlVeryHidden
Sheets("INPUT").Visible = xlVeryHidden
Sheets("CF_M").Visible = xlVeryHidden
Sheets("CF_T").Visible = xlVeryHidden
Sheets("C").Visible = xlVeryHidden
Sheets("C_P").Visible = xlVeryHidden
Sheets("UserData").Visible = xlVeryHidden
Sheets("O6").Select
Range("A1").Select
End Sub
citovat
icon #037100
eLCHa
Mno, ale nedalo mi to.
Toto je kód, jak by pravděpodobně vypadal u mne
Při volání procedury vyplníte pouze názvy listů, které chcete skrýt, odděleny středníkem.
Nevím, jestli to u vás bude fungovat - bez přílohy nemohu odladit - takto jsem to vyčetl z toho kódu (neladil jsem ani u sebe - musel bych vytvářet sešit s podobnou strukturou a to se mi nechce) - námět ke studiu

Private Sub CommandButton1_Click()
Dim sUserName As String
Dim sPassword As String

sUserName = TextBox1.Value
sPassword = TextBox2.Value

If Not sUserName = "" And sPassword = "" Then
Dim iUser As Long
iUser = -1
On Error Resume Next
iUser = Application.WorksheetFunction.Match(sUserName, Sheets("UserData").Columns(1), 0)
On Error GoTo 0

If Not iUser = -1 Then
If Sheets("UserData").Cells(iUser, 2).Value2 = sPassword Then
Dim bScreen As Boolean
bScreen = Application.ScreenUpdating
Application.ScreenUpdating = False

Select Case CStr(Sheets("UserData").Cells(iUser, 3).Value2)
Case "MASTER"
Call subSetSheets(vbNullString)
Case "OSTAT"
Call subSetSheets("START;PLT;PL_TS;1;2;3")
Case "OSOUKR"
Call subSetSheets("START;PLT;PL_TS;1;2;3;1S;2S;3S")
End

Application.ScreenUpdating = bScreen
Else
MsgBox "NESPRÁVNÉ HESLO!"
End If
Else
MsgBox "NEEXISTUJÍCÍ UŽIVATEL!"
End If
Else
MsgBox "PROSÍM VYPLŇTE VŠECHNA POLE"
End If

Unload Me
End Sub

Private Sub subSetSheets(ByVal sSheets As String)
sSheets = "#" & Replace$(sSheets, ";", "#;#") & "#"

Dim sh As Worksheet
For Each sh In ThisWorkbook.Sheets
If InStr(sSheets, "#" & sh.Name & "#") = 0 Then
sh.Visible = xlSheetVisible
Else
sh.Visible = xlVeryHidden
End If
Next sh
Set sh = Nothing
End Sub
citovat
#037103
avatar
Zkusil jsem ten první postup a funguje to úplně super...je to sice delší, ale pro mne srozumitelné.

Moc děkuji!
Jirkacitovat
#037111
avatar
S tou "visibility" listů mi to přijde jak nějaká hra. Nejde použít Array?citovat
#037166
elninoslov
Ide, ale iba na skrytie, a aj to iba na xlSheetHidden. Na skrytie pomocou xlSheetVeryHidden pole nefunguje.citovat

Strana:  1 2   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje