04. september 2006 - 15:42Der er
23 kommentarer og 1 løsning
knap på værktøjslinien
Jeg har oprette en knap på værktøjslinien, hvor jeg har tilknyttet en makro, som får Excel til at springe til en faneblad, som hedder Menu. Der er tale om et delt regneark.
sub Menu() activeworkbook.Save sheets("menu").select end sub.
Når brugeren aktivere knappen, så kan programmet huske et tidligere ark som så åbnes. Ser jeg på hvad knappen henviser til så står der: Uge 24.XLS!thisWorkbook.menu. Uge 24 er ikke åben, når det sker, men åbnes ved aktivering af knappen. Hvor gemmes oplysningen om uge 24?
Et andet spørgsmål er:
Min woorkbook åbnes med: Private sub workbook_open() application.commandbars("Container").Visible= True Toolbars("Container").Position = xlTop End sub
og lukkes med:
Private sub workbook_open() Application.commandbars("Container").Visible= False Application.commandbars("Container").delete End sub
Når brugerne har 2 regneark åben samtidig f.eks. uge 32 og uge 33, og lukker den ene, så lukkes værktøjslinierne også ned. Hvordan undgås det?
For Each wb In Workbooks() I = I + 1 Next If I < 2 Then Application.CommandBars("Container").Visible = False Application.CommandBars("Container").Delete End If
lige en rettelse til proceduren der lukker regnearket. Der skal selvfølgelig stå Private sub Workbook_closed() - hej akyhne - din kode virker perfekt til at holde styr på, hvornår knappen på værktøjslinien skal lukkes ned - tak for det. ang. det som gemmes, så ligger der ikke noget i person.xls. Er der andre muligheder?
Når jeg tilknytter en makro til værktøjslinie til makroen, så tilknytter jeg en makro der menu, som ligger i ThisWorkbook. Når jeg efterfølgende gemmer og åbner arket igen, og ser hvad knappen nu peger på, så står der uge37.xls!Ark1.menu. Det er formentlig her at det går galt, når den husker et tidliger ark. Hvordan kan jeg sikre at knappen peger på en makro som står i netop det ark som er åben?
Jeg opretter værktøjslinine som følger: Funktioner - tilpas - vælg værktøjslinien - tilføj ny - navngiv og vælger dernæst fanebladet kommandoer - vælg kontrolelementer - vælg kommandoknap - tildel makro. Tilbage til fanebladet værktøjslinier og vedhæft værktøjslinie. Problemt er nok, at brugerne har flere regneark åbne, som benytter samme værktøjslinie. mhv. Hubertus
Du skal enten oprette værktøjslinien i hvert regneark hvor den skal bruges via VBA, og i den kode checke om den allerede eksisterer, eller oprette den i et regneark, gemme som .xla fil, og tilføje den i menuen tilføjelsesprogrammer. I sidste tilfælde skal .xla filen så kopieres til hver computer hvor du skal bruge den.
Uanset hvordan du laver den, skal du i koden checke om den allerede eksisterer. Du kan også kreere den under personlig projektmappe (person.xls), men det kræver igen at det gøres på hver computer.
Dim mnu As CommandBar For Each mnu In Application.CommandBars If mnu.Name = "Container" Then Exit Sub Next Set myBar = CommandBars _ .Add(Name:="Container", Position:=msoBarTop, _ Temporary:=True) myBar.Visible = True
Set NewKnap = myBar.Controls _ .Add(Type:=msoControlButton, ID:=1851) With NewKnap .Caption = "Jeg giver værdien på celle A1" .OnAction = "MinMakro1" End With
Set NewKnap = myBar.Controls _ .Add(Type:=msoControlButton, ID:=1851) With NewKnap .Caption = "Jeg giver værdien på celle A2" .OnAction = "MinMakro2" End With End Sub
Sub MinMakro1() MsgBox "Range A1.value er: " & Range("A1").Value End Sub
Sub MinMakro2() MsgBox "Range A2.value er: " & Range("A2").Value End Sub
Koden kan du køre ved WorkBook_Open i hvert ark. Du kunne også slette den først i koden, hvis der senere skulle dukke ark op med ændrede knapper på. Ønsker du en af de andre løsninger må du lige sige til.
Der er tekst på. Den skal bare vises. Finder lige ud af det. (se .Caption = "Jeg giver værdien på celle A2" i koden ovenfor) Ved ikke hvorfor det ikke virker i ThisWorkbook.
Style Specifies whether the button face displays its icon or its caption. Can be one of the following MsoButtonStyle constants: msoButtonAutomatic, msoButtonIcon, msoButtonCaption, msoButtonIconAndCaption, msoButtonIconAndCaptionBelow, msoButtonIconAndWrapCaption, msoButtonIconAndWrapCaptionBelow, or msoButtonWrapCaption.
Mange muligheder!
With NewKnap .Caption = "Jeg giver værdien på celle A1" .OnAction = "MinMakro1" .Style = msoButtonIconAndCaption End With
Når du har din commandbar klar, kan du gøre følgende:
1. Gem koden i alle ark I anvender. Ulempe: brugeren skal godkende makroen hver gang. 2. Exporter til .xla fil. Filen skal gemmes i mappen AddIns, som Excel foreslår. Du skal derefter på alle computere og kopiere filen der. Derudover skal du i tilføjelsesprogrammer, under "Funktioner", vælge gennemse og tilføje din .xla-fil. Fordele: Ingen makroalarm ved opstart. Ulempe: Besværligheden ved at skulle på alle maskiner.
OBS: Ved sidste metode, SKAL du gemme arket i original form som .XLS fil. Skal der rettes på værktøjslinien, åbnes .XLS arket, rettelser laves, filen eksporteres som .xla fil, og kopieres til mappen AddIns på alle maskiner.
i din kommentar d. 8/9 - giver du en kode som skulle give en knap med tekst. Mangler du ikke at angive hvilken ikon der skal anvendes. Jeg ved godt at den kan angives med en set linie, men kan den angives inde i with koden?
Det vsr et eksempel på hvordan du sætter style på en knap eller andet.
Du skal stadig skrive
Set NewKnap = myBar.Controls _ .Add(Type:=msoControlButton, ID:=1851) With NewKnap .Caption = "Jeg giver værdien på celle A2" .OnAction = "MinMakro2" End With
Du kan godt omskrive koden, men den bliver bare længere af det. ID koden skal dog stå i Set-kommandoen.
Hvilket ikon ID-nummeret giver, kan du prøve at se med koden herunder. Ved at holde musen over ikonet, kan du se hvilket ID-nummer du skal bruge.
Koden kører kun fra 1-2000. Der er over 10.000 ID numre, men de indeholder ikke alle et ikon! Derfor koden "on error resume next"
Dim mnu As CommandBar For Each mnu In Application.CommandBars If mnu.Name = "ikoner" Then Exit Sub Next Set myBar = CommandBars _ .Add(Name:="ikoner", _ Temporary:=True) myBar.Visible = True
For Z = 1 To 2000 On Error Resume Next Set NewKnap = myBar.Controls _ .Add(Type:=msoControlButton, ID:=Z) With NewKnap .Caption = Z .OnAction = "MinMakro1" End With Next
End Sub
Jeg havde engang et lille program som lavede en bladremenu med alle ikonerne. Har den ikke mere. Du må selv rette til for at se resten.
Dim mnu As CommandBar For Each mnu In Application.CommandBars If mnu.Name = "ikoner" Then Exit Sub Next Set myBar = CommandBars _ .Add(Name:="ikoner", _ Temporary:=True) myBar.Visible = True
For Z = 1 To 2000 On Error Resume Next Set NewKnap = myBar.Controls _ .Add(Type:=msoControlButton, ID:=Z) With NewKnap .Caption = Z .OnAction = "MinMakro1" End With Next
Problemet er løst - tak for hjælpen og god inspiration mht. mulighederne i style - dem vil jeg arbejde videre med. Lægger du et svar, så du kan få dine point. mvh. Hubertus
I din kommentar fra d. 5/9 viste du følgende kode:
For Each wb In Workbooks() I = I + 1 Next If I < 2 Then Application.CommandBars("Container").Visible = False Application.CommandBars("Container").Delete End If
gælder den for flere sheets i en workbook, eller gælder det når man har flere regneark åbne? mvh. Hubertus
Korrekt. Egentlig hedder det et regneark, og fanerne, dem der her ark1 o.s.v. hedder faneblade!!! De burde hedde Fane1, Fane2 o.s.v.
Bemærk: Der KAN være ganske specielle tilfælde, hvor 2, uafhængigt åbnede regneark ikke kan se hinanden. Det sker i nogle tilfælde hvor arket er åbnet fra en ekstern kilde.
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.