04. oktober 2006 - 10:39Der er
49 kommentarer og 1 løsning
problemer med at fastholde makro til menuknap
en udfordring af de drilske
et regneark, hvor jeg har oprettet en værktøjslinie og en knap, hvortil der er knyttet en makro. arket oprettes som et uge ark, hvor brugerne kan have flere uger åbne på en gang. Problemet opstår, når flere ark er åbne samtidig, så oplever vi flere gange at et tryk på menuknappen medfører en meddelelse om at makroen ikke findes (der er angivet en stil til den ønskede makro) Den makro der spørges efter, og angives i stien peger på et andet ugeark og ikke det ark som er aktivt nu. - lyder det kryptisk? men irriterende er det. Hvordan fastlåser man knap og makro til det aktuelle ark, således at brugeren kan have flere uger åben samtidig? mvh. Hubertus
-> akyhne - jeg mener regneark, og koden er placeret i et modul. Det som undre mig er at den har en sti til en makro i et andet regneark - som ganskevist bruger samme menulinie og makro.
-> Niels Erik - den vil ikke virke, da den jo overhoved ikke kan finde den aktuelle makro.
Problemet opstår fordi en makro af samme navn, kaldes fra flere forskellige ark. Hvor gemmemer Excel oplysningen om sammenknyttningen af knap og makro? Når jeg knytter makroen til kanppen vælger jeg altid thisworkbookmakronavn - det burde jo få den til at pege på den aktuelle regneark.
Hvis værktøjslinien bliver oprettet i et .xla tilføjelsesprogram, eller via person.xls, burde makroen være offentlig for alle regneark. ellers kan du prøve at kalde makroen med regnearkets navn "mitregneark.xls!minmakro"
-> jeg afprøver lige dit forslag - det er lidt langsomt da der er tale om produktionsark. Værktøjslinien oprettes via en makro, når arket åbnes, og lukkes automatisk, når arket afsluttes. dvs. værktøjslinien er kun aktiv, når regnearket er aktiv mvh. Hubertus
For en god ordens skyld, så er vores opsætning således at regnearkene ligger på et fælles drev (server), og er delt, således at flere kan bruge arket samtidig.
Hvis du i det øjeblik du har fejlen går ind i VBA editoren, må du kunne se hvor makroen ligger. hubertus: Var det dig der for et stykke tid siden spurgte om deling af et .xla eller person.xls ark? Og hvis... har I det så kørende på den måde?
Lad os lige starte helt forfra - nu begynder den endelig at snurre. For det første vil jeg gerne lige vide om du har din værktøjslinie i alle ark. For det andet. Bruger du en person.xls eller et tilføjelsesprogram. Kaldet til makroen i værktøjsbjælken bør bare kaldes ved makroens navn, såfremt den er offentlig, altså ikke noget med ThisWorkbook. person.xls og en evt. .xla fil vil/skal altid være synlig fra alle ark.
Værktøjslinien findes i alle ugearkene. De oprettes og nedlægges med åbning/nedlukning af arkene. dvs. er der 2 ark (dvs. 2 uger) åben, så oprettes værktøjslinien 2 gange. Jeg bruger ikke person.xls eller noget tilføjelsesprogram. Det er vigtigt at arkene kan distribueres via netværket, således at jeg ikke skal have fat i de enkelte klienter, når der skal ske ændringer. makroen ligger i et modul.
Ja, da brugerne arbejder med mange forskellige ark, hvor indholdet af værktøjslinien er forskellig. Princippet er, at der skal kun være de kanpper som anvendes i det pågældende ark.
Hej igen. Det er, sådan set også det jeg har lavet, men problemt er ikke at oprette og slette menulinie igen. Problemet opstår, når to forskellige regneark hver især åbner samme menulinie. Lukkes det ene regneark, så lukkes menulinien også i den anden. Samtidig ser det ud til, at når to regneark bruger samme menulinie, så oplever jeg, at arket ikke kan finde den makro som er knyttet til menupunktet.
Jeg lavede lige et forsøg, og her kørte det fint. Når det ene ark deaktiveres, slettes menuen, og idet det andet ark åbnes, oprettes den igen.
Prøv at putte følgende i et modul:
Public Sub OpretMinCommandobar() Set AllmyMenuBar = CommandBars.ActiveMenuBar For Each D In AllmyMenuBar.Controls If D.Caption = "Score" Then Exit Sub Next
Set myMenuBar = CommandBars.ActiveMenuBar Set newMenu = myMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=True) newMenu.Caption = "Score"
Set ctrl1 = newMenu.CommandBar.Controls _ .Add(Type:=msoControlButton, ID:=1) With ctrl1 .Caption = "Sletter noget" .TooltipText = "Slet nu" .Style = msoButtonCaption .OnAction = "Slet" 'navnet på makroen der skal afspilles
End With
Set ctrl2 = newMenu.CommandBar.Controls _ .Add(Type:=msoControlButton, ID:=1) With ctrl2 .Caption = "Import" .TooltipText = "Import" .Style = msoButtonCaption .OnAction = "Importer" 'navnet på makroen der skal afspilles
End With
End Sub
Public Sub SletMinCommandobar() Dim Y As Application Set myMenuBar = CommandBars.ActiveMenuBar For Each D In myMenuBar.Controls If D.Caption = "Score" Then D.Delete End If Next End Sub
Public Sub SkjulMinCommandobar() Set myMenuBar = CommandBars.ActiveMenuBar For Each D In myMenuBar.Controls If D.Caption = "Score" Then D.Visible = False End If Next End Sub
Public Sub VisMinCommandobar() Set myMenuBar = CommandBars.ActiveMenuBar For Each D In myMenuBar.Controls If D.Caption = "Score" Then D.Visible = True End If Next End Sub
Sub Slet() MsgBox "Slet " & ThisWorkbook.Name End Sub
Sub Importer() MsgBox "Importer " & ThisWorkbook.Name End Sub
og følgende i ThisWorkbook:
Private Sub Workbook_Activate() OpretMinCommandobar End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) SletMinCommandobar End Sub
Private Sub Workbook_Deactivate() SletMinCommandobar End Sub
Private Sub Workbook_Open() OpretMinCommandobar End Sub
Lav så flere kopier af arket, og start dem op. Klik på en af valgene i menuen, og se til at den msgbox der dukker op skriver det aktuelle arks navn. Prøv fra alle ark.
hejsa - lige vent tilbage fra lidt ferie Kunne jeg få dig til at knytte nogle kommentarer til især første del af din kode? Jeg vil nemlig gerne vide præcis, hvordan du undgår at menuen lukkes ned når en af regnearkene lukkes. mvh. Hubertus
Menuen lukkes netop ned når du forlader arket, men oprettes med det samme du skifter til et andet ark med samme kode. Og derfor finder den makroerne lokalt i det nye regneark.
hej igen - det er også hvad jeg er nået frem til, men jeg ville bare gerne forstå, hvad det er som sker i koden. Specielt dette modul
Public Sub OpretMinCommandobar() Set AllmyMenuBar = CommandBars.ActiveMenuBar For Each D In AllmyMenuBar.Controls If D.Caption = "Score" Then Exit Sub Next
Det er D, som jeg specielt er interessert i. Jeg kan godt se at menulinien checkes for om Score eksisstere, men kan ikke helt forstå D.
ActiveMenuBar er det pr. definition den menulinien med Filer, rediger osv. hvad hedder de andre menuliner? Jeg tænker her på, muligheden for at placere min menu på en af de andre menubjælker.
Så er jeg ved at være med i teknikken - tak for det :O) det var rigtigt dejligt. :O) Hvad med den del vedrørende navnene på menulinierne, kan du kaste lidt lys over det? mvh. Hubertus
Jeg tænker på, hvad man kalder de forskellige menulinier, hvis jeg vil have placeret min menu i en af de andre menubjælker. Du har f.eks. en linie: Set AllmyMenuBar = CommandBars.ActiveMenuBar som placere menupunktet på den øverste menubjælke. Hvad skal der stå, hvis jeg f.eks. vil have min menu i en af de andre menubjælker?
Private Sub Workbook_Activate() OpretMinCommandobar End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) SletMinCommandobar End Sub
Private Sub Workbook_Deactivate() SletMinCommandobar End Sub
Private Sub Workbook_Open() OpretMinCommandobar End Sub
I et modul:
Public Sub OpretMinCommandobar() Set AllmyMenuBar = CommandBars.ActiveMenuBar For Each D In AllmyMenuBar.Controls If D.Caption = "Forma&ter" Then Set ctrl1 = D.CommandBar.Controls _ .Add(Type:=msoControlButton, ID:=1) With ctrl1 .Caption = "Importerer noget" .TooltipText = "Importer nu" .Style = msoButtonCaption .OnAction = "Slet" 'navnet på makroen der skal afspilles End With Set ctrl2 = D.CommandBar.Controls _ .Add(Type:=msoControlButton, ID:=1) With ctrl2 .Caption = "Sletter noget" .TooltipText = "Slet nu" .Style = msoButtonCaption .OnAction = "Importer" 'navnet på makroen der skal afspilles End With End If Next End Sub
Public Sub SletMinCommandobar() Dim Y As Application Set myMenuBar = CommandBars.ActiveMenuBar For Each D In myMenuBar.Controls If D.Caption = "Forma&ter" Then With D .Reset End With End If Next End Sub
Sub Slet() MsgBox "Slet " & ThisWorkbook.Name End Sub
Sub Importer() MsgBox "Importer " & ThisWorkbook.Name End Sub
Hejsa - det var ikke lige den løsning jeg havde i tankerne - en den giver nye muligheder, som jeg ikke kendte. Det jeg tænke på var at få anbragt en knap på værktøjslinien: formatering. Er det muligt at bestemme hvor på værktøjslinien knappen placeres?
Nu går din kode på menulinien, kan du få den til at virke, hvis der oprettes en brugerdefineret værktøjslinie, hvorpå der skal indsættes 2 knapper? Det var jo mit oprindelige problem.
Private Sub Workbook_Activate() OpretSpecialknapper End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) SletSpecialknapper End Sub
Private Sub Workbook_Deactivate() SletSpecialknapper End Sub
I et modul:
Sub OpretSpecialknapper() Dim mnu As CommandBar For Each mnu In Application.CommandBars If mnu.Name = "Formatting" Then
Set NewKnap = mnu.Controls _ .Add(Type:=msoControlButton, ID:=1851) With NewKnap .Caption = "Jeg giver værdien på celle A1" .OnAction = "MinMakro1" End With
Set NewKnap = mnu.Controls _ .Add(Type:=msoControlButton, ID:=1851) With NewKnap .Caption = "Jeg giver værdien på celle A2" .OnAction = "MinMakro2" End With
End If Next
End Sub
Sub SletSpecialknapper() Dim mnu As CommandBar For Each mnu In Application.CommandBars If mnu.Name = "Formatting" Then With mnu .Reset End With End If Next 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
Ovennævnte kode var den som egentlig gav mig problemet med at fastholde knap og makro, når der arbejdes i flere ark, hvor arkene løbende åbnes/lukkes, men kombineres den med din kode fra 27/8, så ser det ud til at mit problem er løst. Point er på vej! Tak for hjælpen - den bragte mig videre :O)
Det er korrekt, men når du skifter mellem flere ark, kan den ikke finde makroen, som hører til arket, mao. mit oprindelige problem. Din sidste kode løste imidlertid dette forhold.
Hej Akyhne - jeg sætter lige nogle flere point på højkant, hvis du kan hjælpe med følgende: Når jeg har oprettet en værktøjslinie, hvilke muligheder har jeg så for at bestemme, hvor den bliver placeret. Jeg kender: Toolbars("Container").Position = xlTop, men den lægger blot værktøjslinien som en ny linie. Jeg vil gerne have den i forlængelse af en eksisterende. Kan jeg det?
Det er jeg faktisk ikke klar over. Med denne kode kan du i hvertfald se position og form af dine eksisterende toolbars.
Sub Makro2() Set s = Application.Toolbars For Each D In s If D.Visible = True Then MsgBox D.Name & ":" & vbLf _ & "Venstre.. " & D.Left & vbLf _ & "top.. " & D.Top & vbLf _ & "højde.. " & D.Height & vbLf _ & "bredde.. " & D.Width & vbLf _ & "" End If Next End Sub
Ud fra de data, kan du selvfølgelig positionere dine toolbars som du vil. Men det vil så ikke passe, såfremt brugerne har forskellig skærmopløsning.
Havde jeg vidst det, ville jeg sikekrt også kunne løse dit problem. Hvis der er en metode, er det sikkert noget med: Set newMenu = myMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=True) before "noget kode".
Sub test2() Set mybar = CommandBars("Standard") With mybar .Position = msoBarTop 'Fortæller at den skal ligge for oven .RowIndex = 1 'Rækkefølgen End With
Set mybar = CommandBars("Formatting") With mybar .Position = msoBarTop .RowIndex = 2 'Rækkefølgen End With
Set mybar = CommandBars("ikoner") With mybar .Position = msoBarTop .RowIndex = 3 'Rækkefølgen End With End Sub
Det er fint nok, det kan jeg godt arbejde videre med. Jeg opretter lige et spørgsmål med nogle point, som tak for hjælpen. :O)
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.