27. maj 2003 - 14:12Der er
14 kommentarer og 1 løsning
Makro, der redigerer makro i andet regneark
Jeg er ved at lave et regneark med en rettelses-makro, der kan tage fat i et andet regneark og tilføje rettelser i dette ark. Den side af sagen er til at håndtere. Men rettelses-makroen skal desuden redigere nogle linier i det andet regnarks makroer. Hvordan refererer man til og redigerer i det andet arks makroer?!!
Jeg skulle måske have præciseret, at det er interaktion mellem to helt separate workbooks, jeg er interesseret i, ikke bare mellem ark. Vi sender en template ud til en masse brugere, der rapporterer regnskabstal i denne. Når der forekommer rettelser (nye konti, nye selskaber, etc.), vil vi lave en makro, der opdaterer deres template (og derved bevarer historiske data) i stedet for at distribuere en ny, tom template. Sagen er bare, at den rettelse, der nu skal laves, ikke kun hidrører selve regnearksdelen af templaten, men også de bagvedliggende makroer. Så jeg skal altså have fingre i templatens makroer fra den rettelsesmakro, vi sender ud. Håber det er forståligt.
I første omgang er der tale om en simpel søg og erstat på nogle linier i ét modul (nogle begreber i selve templaten ændres og derfor skal også ændres de steder i makroen, der refererer til disse begreber). Jeg kom frem til i går, at det nemmeste formentlig er at åbne editoren i den "eksterne" workbook, og derefter lave proceduren ved at sende keystrokes (dvs. sende en Alt-F11 med SendKeys og derefter køre søgerutinen med yderligere keystrokes). Risikoen for, at det går galt er imidlertid temmelig stor, når makroen sendes ud til mange brugere med forskellige Excel/Win-versioner. Jeg ville desuden gerne kunne referere direkte til det aktuelle modul og lave en lokal søg og erstat der fremfor at skulle lave en søg og erstat på hele projektet.
jeg viser lige mit forslag. Det går på at skifte et helt modul ud. Dette er mere sikkert end udskifte enkeltlinier. På denne måde er man også sikker på at alle ændringer slår igennem. Koden består af 4 sub hvoraf man kun skal køre sub main. Jeg forudsætter at denne kode ligger i et seperat modul og at regnearket endvidere indeholder det nye modul (altså med ny kode). Modulet der skal udskiftes hedder i dette tilfælde "Misc" Templaten, der skal have udskifter modul hedder "Test.xlt"
Sub Export() Dim module_name As String module_name = "c:\temp\Modul.bas" Application.VBE.ActiveVBProject.VBComponents("Misc").Export module_name End Sub
Sub Remove_Module() On Error Resume Next Set VBP = ActiveWorkbook.VBProject VBP.VBComponents.Remove VBP.VBComponents("Misc") End Sub
Sub Import() Dim module_name As String module_name = "c:\temp\Modul.bas" ActiveWorkbook.VBProject.VBComponents.Import module_name End Sub
Sub main() Export Workbooks("test.xlt").Activate Remove_Module Import End Sub
Først eksportes modulet "Misc" fra det nye regneark. Derefter fjernes det tilsvarende modul fra "Test.xlt" og det eksporterede modul importeres så til "Test.xlt"
Det lige en fejl i makroen. Den kan i øjeblikke kun køre fra VB-editoren Dette ændrer jeg lidt senere. Nu må jeg lige beskæftige mig med alm arbejde :-)
Lidt nemmere at forstå (måske) Const FILE As String = "test.xlt" ' fil, med modul der skal udskiftes Const MODULE_NAME As String = "Misc" ' modulet der skal udskiftes Const TEMPFILE As String = "c:\temp\Modul.bas" 'temporær fil
Sub Export() Application.VBE.ActiveVBProject.VBComponents(MODULE_NAME).Export TEMPFILE End Sub
Sub Remove_Module() On Error Resume Next Set VBP = Workbooks(FILE).VBProject VBP.VBComponents.Remove VBP.VBComponents(MODULE_NAME) End Sub
Sub Import() Set VBP = Workbooks(FILE).VBProject VBP.VBComponents.Import TEMPFILE End Sub
Sub main() Export Remove_Module Import Kill TEMPFILE ' fjern temporær fil End Sub
Det ligner noget, jeg kan bruge. Kan man forvente uden videre at kunne skrive til det temporære dir? Hvad hvis det ikke findes? Jeg takker og giver points.
Nej, dir skla findes, men du kan jo bare ændre stien til Const TEMPFILE As String = "c:\Modul.bas" Drev C: har de fleste :-) og filen bliver jo også slettet til sidst.
Ja, det er nok sikrere at lægge den i roden. Tak igen.
Synes godt om
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.