Hejsa Jeg har en meget lang makro, når jeg prøver at køre den, får jeg fejlmeldingen ’Procedure too large’. Jeg har forkortet makroen, alt det jeg kan. Men den er stadig for lang. Jeg har læst mig frem til, at man kan dele makroen op.
Men men men jeg har ingen anelse om, hvordan jeg gør det. Skal lige sige, at jeg er en novice ud i vba-kode. Så forklaringen må gerne være for dumpappede blishørs og fatsvage pingviner :-D :-D :-D
Min makro består af en del forskellige formler + design.
Sub MegetLangMakro noget kode 1 noget kode 2 noget kode 3 noget kode 4 End Sub
Kan splittes i
Sub MegetLangMakro Call UnderKode1 noget kode 2 noget kode 3 noget kode 4 End Sub
Sub UnderKode1 noget kode 1 End Sub
Altså, hvor du kopierer dele af din kode ud i andre subs og kalder dem fra din "hoved" makro.
Du kan så få udfordringer omkring variable. En variabel du har defineret i MegetLangMakro kan du ikke bruge i UnderKode1, så man skal være lidt opmærksom når man copy-paster. Man kan godt overføre variable fra MegetLangMakro til UnderKode1 eller have globale variable, der kan ses begge steder, men det bliver nok lidt for omfattende at forklare her.
Tusind tak for superhurtige svar. Nu må I gerne fnise i fletningen. Men hvor skal jeg skrive det?
Starten af min makro ser således ud:
Sub Tabeller() ' ' Tabeller Makro ' Dim i As Integer Dim j As Integer j = 12 With ActiveWorkbook.Worksheets("Beregninger") lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With For i = 2 To lastRow
Desværre fungerer det ikke helt efter hensigten. Jeg skal bruge min makro til at lave tabeller til nogle meget store udbudslister. Der skal laves ca. 400 udbudslister, og hver liste har forskelligt antal tabeller.
Excel kører nu alle 3 dele, hvilket jo er godt. Men hver del af makroen skal generere tabeller, der skal komme efter den forrige makrodels tabeller.
Men makrodel 2 og 3 kører tabellerne oven i tabellerne fra makrodel 1. Jeg håber, at min forklaring giver nogenlunde mening.
Min kode (består af 3 del) ser således ud nu:
Sub Tabeller() ' ' Tabeller Makro ' Call UnderKode1 Call Underkode2 Call Underkode3 End Sub
Sub UnderKode1() Dim i As Integer Dim j As Integer j = 12 With ActiveWorkbook.Worksheets("Beregninger af XX") lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With For i = 2 To lastRow Kode Kode Kode End Sub
Sub UnderKode2() Dim i As Integer Dim j As Integer j = 26 With ActiveWorkbook.Worksheets("Beregninger af YY") lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With For i = 2 To lastRow Kode Kode Kode End Sub
Sub UnderKode3() Dim i As Integer Dim j As Integer j = 40
With ActiveWorkbook.Worksheets("Beregninger af ZZ") lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With For i = 2 To lastRow Kode Kode Kode End Sub
' Globale variable Dim ws As Worksheet Dim iCount As Integer, iJ As Integer Dim iLastRow As Integer ' ---------//-------------
Sub Tabeller() Set ws = Sheets("Beregning af XX") iJ = 12 UnderKoder1 Set ws = Sheets("Beregning af YY") iJ = 26 UnderKoder2 ' evt Underkode1 hvis opsætningen er ens Set ws = Sheets("Beregning af ZZ") iJ = 40 UnderKoder3
End Sub
Sub UnderKode1() With ws iLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With 'Hvis understående kode er ens i alle ark kaldes UnderKode1 efter sætninge as ws og iJ For iCount = 2 To iLastRow kode kode Next iCount End Sub Sub UnderKode2() With ws iLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With 'Hvis understående kode er ens i alle ark kaldes UnderKode1 efter sætninge as ws og iJ For iCount = 2 To iLastRow kode kode Next iCount End Sub Sub UnderKode3() With ws iLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row End With 'Hvis understående kode er ens i alle ark kaldes UnderKode1 efter sætninge as ws og iJ For iCount = 2 To iLastRow kode kode Next iCount End Sub
Jeg kan desværre ikke få det til at virke. Der kommer denne fejlmelding ’Sub or Fucktion not defined’, og jeg vil mene, at jeg har gjort, som du forslog. Jeg udelukker ikke, at jeg har lavet fejl 😊
Kære Dan
Jeg bliver på ingen måder fornærmet 😊 Jeg har kodet i en måned, så jeg er meget grøn og ny. Dermed kan jeg sagtens havet lavet en masse dårlig kode.
Når jeg prøver med din kode i stedet for de 4 linjer, kommer denne fejlmelding ’Duplicate declaration in current scope’ under min 2. del af min lange kode
"Duplicate declaration" betyder, at du erklærer en variable mere end en gang - det burde ikke umiddelbart have noget med min kodelinje at gøre...
Hvis jeg må komme med et forslag, så uploader du dit regneark, med din kode, et eller andet sted, så vi kan se det - på den måde bli'r det uendeligt meget lettere, at hjælpe dig :-)
Det her er efter mere røget, end det er speget. I går prøvede jeg at køre min oprindelig makro på en computer med Microsoft Office 365 Personal, og der fungerede den perfekt. Men da jeg kørte præcis samme makro på en computer med Microsoft Office 365 Pro Puls, fejlede den.
Jeg har prøvet alle jeres forslag, og ingen af dem kan jeg få til at virke på Pro Puls.
Nej, det er jeg ikke - den lyder som et monster :-)
Men, jeg tror bare, at det er eneste måde vi kan hjælpe dig på, hvis vi kan få makroen at se - så, find et sted, hvor du kan uploade din regnearksfil, og smid os et link.
Tusind tak for hjælpen og jeres gode forslag. Det lykkedes mig i går at få makroen til at virke. Det havde ikke noget med 365 Personale vs. 365 Pro Puls at gøre. Som Thor skrev, så var min makro for stor til 32 bit. Løsningen blev, at jeg har delt min kode i undersubs med en reference til min variabel fra den ene undersub til den næste. Så koden ser således ud:
Sub Tabeller() ' ' Tabeller Makro ' Dim i As Integer Dim j As Integer j = 12 For i = 2 To Worksheets("Beregninger af XX").Cells(Rows.Count, "B").End(xlUp).Row Kode Kode Kode Next i Call XX(j) End Sub
Sub Mnd(j As Integer) For i = 2 To Worksheets("Beregning af YY").Cells(Rows.Count, "B").End(xlUp).Row Kode Kode Kode Next i Call YY(j) End Sub
For i = 2 To Worksheets("Beregninger af ZZ").Cells(Rows.Count, "B").End(xlUp).Row Kode Kode Kode Next i End Sub
Fint , men det vil nu være en god ide at luge ud og finpudse koden.
Og velbekomme Jan
Synes godt om
1 synes godt om dette
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.