Avatar billede Winni Novice
11. september 2018 - 08:50 Der er 19 kommentarer

Opdeling af makro

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.

Er jeg så heldig, at nogen kan hjælpe mig?
11. september 2018 - 09:15 #1
Princippet er er

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.
Avatar billede finb Ekspert
11. september 2018 - 09:27 #2
Forenklet:
Sub KoerUnderkoderne
  Call Underkode1
  Call Underkode2
  Call Underkode3
  Call Underkode1 ' rem: fx igen
End Sub
Avatar billede Winni Novice
11. september 2018 - 09:33 #3
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

Hereafter kommer en masse masse kode
11. september 2018 - 09:38 #4
Når du kopierer dele af koden ud i en under-sub skal du sætte dit kald der hvor koden stod oprindeligt.
Avatar billede Winni Novice
11. september 2018 - 10:21 #5
Det er fantastisk med så hurtige svar 😊

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
Avatar billede Jan Hansen Ekspert
11. september 2018 - 11:01 #6
Hej

se her under:

Option Explicit

' 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



Jan
Avatar billede Dan Elgaard Ekspert
11. september 2018 - 11:57 #7
Personligt vil jeg kigge på din kode igen - jeg tror nemlig, at den kan afkortes betydeligt mere...

Du har f.eks. allerede i den kodestump, som du bruger i indledningen 4 linjer, der kan afkortes til 1:

For i = 1 to Worksheets("Beregninger").Cells(Rows.Count, "B").End(xlUp).Row

Jeg nægter simpelthen, at tro, at en procedure kan blive for lang, med mindre man laver dårlig kode (no offence).
Avatar billede Winni Novice
11. september 2018 - 12:21 #8
Kære Jan

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
Avatar billede Dan Elgaard Ekspert
11. september 2018 - 15:41 #9
"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 :-)
Avatar billede Winni Novice
12. september 2018 - 09:32 #10
Tusind tak for jeres store indsats.

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.
Avatar billede Jan Hansen Ekspert
12. september 2018 - 09:43 #11
Hmm mon der er noget sikkerheds opsætning  på pro plus? nogen der har et bud?
Jan
12. september 2018 - 10:38 #12
Der er noget med at makroer skrevet på en 64bit office kan få problemer når de skal køre på en 32bit masine.
Avatar billede Dan Elgaard Ekspert
12. september 2018 - 11:30 #13
Det er ikke nok, at sige, at "den fejler"...

Hvad gør den?
Hvad skal den gøre?
Hvad gør makroen ikke?
Hvad kommer der af fejl meddelelse?
Hvilken linje er markeret, når der kommer en fejl?

Jeg kan kun gentage mit råd: Upload dit regneark, med din kode, så vi kan se, hvad der går galt.
Avatar billede Winni Novice
12. september 2018 - 13:30 #14
Jeg kan godt se, at det ikke giver jer ret meget at arbejde med. Når jeg bare skriver, at den fejler.

Min udfordring er som sagt, at min makro kører perfekt i ’365 Personale’ men fejler i 365 Pro Puls.

Jeg uploader gerne min makro, men kors hvor er den lang 😊 Dan@ er du sikker på, at du vil have makroen?
Avatar billede Dan Elgaard Ekspert
12. september 2018 - 14:44 #15
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.
Avatar billede Winni Novice
12. september 2018 - 15:24 #16
Jeg kan simpelthen ikke finde ud af at sende jer en besked. Kan I sende mig en besked, som jeg så kan svare på (sende min makro)
Avatar billede Jan Hansen Ekspert
12. september 2018 - 15:55 #17
Du kan dele filen gennem
Google drive: https://drive.google.com
Dropbox:  https://www.dropbox.com
Onedrive:  https://onedrive.live.com
eller lignende fil delings tjenester, men husk det er excel-filen der har interesse, du kan bare fylde dummy data i den.



Jan
Avatar billede Winni Novice
13. september 2018 - 09:05 #18
Kære alle

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
Avatar billede Jan Hansen Ekspert
13. september 2018 - 15:49 #19
Fint , men det vil nu være en god ide at luge ud og finpudse koden.

Og velbekomme
Jan
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester