09. april 2006 - 10:20Der er
13 kommentarer og 1 løsning
Ekstern makrofil
Hej
Jeg prøver lige igen, da jeg ikke kan finde ud af det.
Jeg har følgende problemstilling/spørgsmål:
1. Jeg har en skabelon.xlt 2. Jeg har 6 makroer i denne skabelon med tilhørende knapper
Jeg vil gerne at denne skabelon henter makroer og knapper fra en ekstern fil, således at hvis jeg retter i makroerne, tilføjer makroer eller knapper, at det så altid er det nyeste der bliver hentet ind i skabelon.xlt eller den fil man nu har gemt skabelon.xlt som.
Kan man det ?
Her er mine makroer:
Sub Skjul() Application.ScreenUpdating = False Dim iLoop As Integer Dim rNa As Range Dim i As Integer Dim rX As Range svalue = 0 'søgeværdi scolumn = 13 'søgekolonne iLoop = WorksheetFunction.CountIf(Columns(scolumn), svalue) Set rNa = Cells(1, scolumn) Set rX = Columns(scolumn).Find(What:=searchvalue, After:=rNa, _ LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=True)
For i = 1 To iLoop Set rNa = Columns(scolumn).Find(What:=svalue, After:=rNa, _ LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=True) Set rX = Union(rNa, rX) Next i rX.EntireRow.Hidden = True Application.ScreenUpdating = True ActiveSheet.Cells(1, 3).Select End Sub
Sub Vis() Application.ScreenUpdating = False Cells.Select Selection.EntireRow.Hidden = False Application.ScreenUpdating = True ActiveSheet.Cells(1, 3).Select End Sub
Sub Workbook_BeforeClose(Cancel As Boolean) Application.CommandBars("SR").Delete End Sub Sub Linie() JaNej = MsgBox("Denne funktion indsætter en ny linie. Linien indsættes under den linie du står på nu. Vil du fortsætte ?", vbYesNo + vbQuestion, "Indsæt ny linie") Select Case JaNej Case vbYes ActiveCell.Offset(1, 0).Select Selection.EntireRow.Insert Worksheets("Stamdata").Range("200:200").EntireRow.Copy Destination:=ActiveCell.Offset(0, 0).EntireRow Case vbNo End Select End Sub Sub Note() JaNej = MsgBox("Denne funktion indsætter en ny note. Du skal stå på linien lige under en allerede eksisterende note. Vil du fortsætte ?", vbYesNo + vbQuestion, "Indsæt ny note") Select Case JaNej Case vbYes If ActiveSheet.Name = "Noter spec." Then Dim i ActiveCell.Offset(0, 0).Select For i = 1 To 10 Selection.EntireRow.Insert Next
Worksheets("Stamdata").Range("202:212").EntireRow.Copy Destination:=ActiveCell.Offset(0, 0).EntireRow Else End If If ActiveSheet.Name = "Noter" Then ActiveCell.Offset(0, 0).Select For i = 1 To 10 Selection.EntireRow.Insert Next
Worksheets("Stamdata").Range("188:198").EntireRow.Copy Destination:=ActiveCell.Offset(0, 0).EntireRow Else End If Case vbNo End Select End Sub Sub Overskrift() JaNej = MsgBox("Denne funktion indsætter en overskrift. Du skal stå på en noteoverskrift. Vil du fortsætte ?", vbYesNo + vbQuestion, "Indsæt overskrift") Select Case JaNej Case vbYes If ActiveSheet.Name = "Noter" Then JaNej = MsgBox("Skal der kun stå 'Noter' uden årstal ?", vbYesNo + vbQuestion, "Indsæt overskrift") Select Case JaNej Case vbYes ActiveCell.Offset(0, 0).Select For i = 1 To 2 Selection.EntireRow.Insert Next
Worksheets("Stamdata").Range("232:233").EntireRow.Copy Destination:=ActiveCell.Offset(0, 0).EntireRow Case vbNo ActiveCell.Offset(0, 0).Select For i = 1 To 4 Selection.EntireRow.Insert Next
Worksheets("Stamdata").Range("215:218").EntireRow.Copy Destination:=ActiveCell.Offset(0, 0).EntireRow End Select Else MsgBox "Du står ikke på arket 'Noter' !" End If Case vbNo End Select End Sub
Sub Sidetal() Dim pn As Variant JaNej = MsgBox("Skal sidetallet sættes til 'Auto' ?", vbYesNo + vbQuestion, "Ret sidetal") Select Case JaNej Case vbYes With ActiveSheet.PageSetup .FirstPageNumber = xlAutomatic
End With Case vbNo pn = Application.InputBox("Indtast sidetal på arket", "Ret sidetal")
Var det en idé at lade dine knapper om at udføre en makro i et helt andet ark? Altså at kopiere dine makroer i en speciel workbook, som kan sættes til at være skjult og så lade knappen kalde dem med denne kode:
Hvis denne makroworkbook altid ligger på denne position, kan du rette i den, så vildt du lyster, uden at det påvirker din skabelon (selvfølgelig sålænge filer bevarer sit navn og indeholder makroer med de navne, som der henvises til i skabelonen).
1. Hvis jeg tilføjer en ny makro til makro.xla, så bliver den jo ikke hentet automatisk ind i skabelon.xlt
Pointen var, at brugeren skulle åbne skabelon.xlt og så gemme den som f.eks. excelark.xls (eller noget andet). I dette regneark skulle altid være tilgængeligt de nyeste makroer f.eks. fra makro.xla og de dertil hørende knapper.
Så at når du åbner skabelon.xlt/excelark.xls så står der nærmest en kode som siger
Jeg er ikke helt med på, hvorfor du vil have makroerne til at køre i en .XLA
Resten: I makromodulet, der hedder "This Workbook" kan du lægge følgende:
sub workbook_Open() Workbooks.open filename:="c:\mine_regneark\test_1.xls" End sub
Denne bliver afviklet, hver gang din skabelon åbnes. Hvis test_1.xls så også er skjult, burde brugeren alene se den ved, at der kommer et skilt op om, at den ønskede fil indeholder makroer, som man skal acceptere.
Om de virker i din skabelon, afhænger jo af, om du kalder dem - altså skriver et eller andet i skabelonen, der gør, at den nye makro skal aktiveres.
Hvis du laver en ny knap i "fjernarket", kommer denne ikke med i skabelonen, men hvis du lægger knapperne i skabelonen, kalder de jo den makro i fjernarket, som de er sat til, uanset om der er ændret i denne.
Mit oprindelige forslag var, at du lod knapperne i din skabelon "fjernkalde" makroer, der så ligger i et andet regneark, som kunne være skjult (Vindue > Skjul, hvorefter du gemmer det (luk Excel helt og svar "ja" til at gemme ændringerne i denne mappe).
Nej, du skal bare skelne skarpt mellem knappen og den makro, som den kalder. Makroen kan sagtens ligge et andet sted og du kan ændre frit i den. Men din skabelon kan ikke "se", at du måske har tilføjet en helt ny makro eller opfundet en ny knap.
Men det, at du ændrer i makroens indhold, det påvirker ikke skabelonen.
Jeg har lavet et almindeligt regneark med mine makroer. Det er gemt som Mappe1.xls i Mappen XLStart. Når den ligger i denne mappe bliver den automatisk indlæst når man starter Excel - hvad enten man starter Excel via Start-menuen eller ved at dobbeltklikke på en anden excel-fil. Det fungerer fint.
Enig, det ville have været mit sidste løsningsforslag. Det eneste problem med denne løsning er, at den ikke kan bruges af andre end dig selv. Som jeg forstod dit spørgsmål, var der andre brugere, som du lavede regnearket for.
Her kan du så gøre det, at du lægger makrofilen på et fællesdrev, feks. P:\Makroer. Hvis du så hos den enkelte bruger går ind i Funktioner > Indstillinger > Fanebladet "Standard". I boksen "Ved start åbnes alle filer i:" skriver du stien til den fælles makrofil NB! Kun stien, ikke også filnavnet. Det har samme funktion som XLstart.
Makrofilen bør være skjult og delt. Skjult er beskrevet tidligere. Delt: Funktioner > Delt projektmappe > Sæt flueben i "Tillad, at flere brugere ksn foretage ændringer samtidigt".
Størrelsen: Ja, Excel har sine nykker! Af og til hjælper det at markere samtlige ark, kopiere dem og indsætte det i en ny projektmappe. Du må ikke spørge mig hvorfor, jeg ved bare, at det hjælper - nogen gange!
Jeg har prøvet at lave en xla-fil og køre mine makroer derfra, men den kommer med nogle fejlmeldinger også selvom den så udfører makroen bagefter.
Men jeg tror ikke dette er løsningen for mig, da jeg alligevel ikke kan opnå det jeg gerne vil, nemlig at jeg kan tilrettet makroer m.v. og det så har effekt på alle brugere som bruger den skabelon jeg har lavet.
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.