Avatar billede lineriber Praktikant
15. november 2013 - 14:25 Der er 7 kommentarer og
1 løsning

VBA kode der retter i eksisterende modul

Hej Eksperter

Jeg har tidligere skrevet et lignende spørgsmål uden at få et brugbart svar, så nu prøver jeg igen.
Jeg kører Excel 2007 engelsk version.

Kan man skrive en VBA kode der ved afspilning fra ens "Personal VBAProject" laver en rettelse i en eksisterende VBA kode gemt i filens "modul1"?

Jeg har nemlig 90 filer som jeg skal have rettet en VBA kode i (gemt i filens modul1), og jeg ville gerne undgå at skulle ind og rette det manuelt i hver fil.

Mvh
Line
Avatar billede finb Ekspert
15. november 2013 - 15:17 #1
Minder de 90 filer om hinanden ?
finb
Avatar billede Sitestory Mester
15. november 2013 - 15:23 #2
Jeg har ikke prøvet, men det er vist muligt at importere og eksportere .bas-filer med et program (makro).

Hvis du lagde alle filerne i ét katalog, kunne de gennemløbes med en For-Each løkke, hvor man åbner hver fil, importerer det nye og overskriver det gamle modul, gemmer og lukker.

Noget i den dur ville jeg prøve.
Avatar billede Mads Larsen Nybegynder
15. november 2013 - 15:25 #3
Her er ihver fald en sample på hvordan man med VBA kode kan ændre VBA kode

Sub ReplaceVBA()
    For i = 1 To Application.VBE.CodePanes.Count
        If Application.VBE.CodePanes(i).CodeModule.Name = "Module1" Then
            For o = 1 To Application.VBE.CodePanes(i).CodeModule.CountOfLines
                If Application.VBE.CodePanes(i).CodeModule.Lines(o, 1) = "TestString = ""Test""" Then
                    Application.VBE.CodePanes(i).CodeModule.ReplaceLine o, "TestString = ""TestReplace"""
                End If
            Next
        End If
    Next i
End Sub
Avatar billede Sitestory Mester
15. november 2013 - 15:30 #4
Fik ikke svaret på dit spørgsmål: Nej, jeg mener ikke, det er muligt. Man kan slette, tilføje og gøre andre ting, som bl.a. beskrives her: http://www.cpearson.com/excel/vbe.aspx men det løser vist ikke din opgave. Derfor tror jeg på den med at udskifte modulet med kode.
15. november 2013 - 18:50 #5
Det kan man godt, og det tror jeg også Chip Pearson mener når han i artiklen skriver "modifies other VBA Projects".

Jeg har tidligere lavet en løsning til en kunde, hvor netop dette er tilfældet, og jeg kan se i koden, at jeg har lavet funktioner der f.eks. sletter en hel "Sub", og en anden funktion der opretter den samme "Sub" igen med ny kode.

Spørgsmålet er, hvorvidt det er indsatsen værd for _kun_ 90 filer, tænker du har redigeret dem på max 30 minutter, og så er du videre uden ret meget bøvl, og ingen filer fejler på din kode.
Avatar billede lineriber Praktikant
17. november 2013 - 14:04 #6
Hej Alle

Tak for jeres svar.
Jeg er på vej til USA og er væk de næste par uger, så her lige et hurtigt retursvar til jer.

@finb: ja, filerne ligner hinanden, de er bygget op omkring den samme "skabelon" og indholder bare forskellige værdier i hver fil.

@Sitestory: jeg prøver lige at læse det igennem du har linket til.

@IT-GuFFE: tak for foreslaget. Kan du forklarer mig hvor jeg skal skrive den nye VBA kode ind henne i din Sub Replace?

@Smartoffice: ja, det kan du såmænd have ret i. Men det er bare desværre et gentagende problem for mig at jeg skal have lavet smårettelser i modulet til de her 90 filer. Og hvis jeg gerne vil have en kollega til at gøre det, som ikke har kendskab til Visual Basic vinduet, ville det være smart hvis denne kollega bare kunne afspille en VBA kode der gjorde det der skulle gøres. Så derfor er jeg stadig interesseret i at få det her løst.
Avatar billede Mads Larsen Nybegynder
18. november 2013 - 08:25 #7
NB! For at koden vil køre skal der sættes flueben i "Hav tillid til VBA-projektobjectmodellen" som er under "Center for sikkerhed og rettighedsadministration > Indstillinger for makro"

Da det jo er en "beskidt" makro som ændrer i filerne.


Sub ReplaceVBA()
'Finder linjen TestString = "Test"
'Ændrer linjen til TestString = "TestReplace"
    For i = 1 To Application.VBE.CodePanes.Count
        If Application.VBE.CodePanes(i).CodeModule.Name = "Module1" Then
            For o = 1 To Application.VBE.CodePanes(i).CodeModule.CountOfLines
                If Application.VBE.CodePanes(i).CodeModule.Lines(o, 1) = "TestString = ""Test""" Then 'Linjen der skal findes og ændres
                    Application.VBE.CodePanes(i).CodeModule.ReplaceLine o, "TestString = ""TestReplace""" 'Den nye kode indsættes her
                End If
            Next
        End If
    Next i
End Sub
Avatar billede lineriber Praktikant
28. februar 2014 - 11:22 #8
Jeg har ikke kunne få det til at virke, og har istedet placeret koderne som et add-in på hver bruges PC => så skal der kun rettes i koden hos 4 brugere istedet for i 90 filer.
Jeg lukker spørgsmålet.
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

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