22. april 2002 - 12:40Der er
29 kommentarer og 3 løsninger
VBA menu
Jeg har via VBA oprettet et menupunkt under "Worksheet Menu Bar" (Excels standard menu bar) med dertil hørende underpunkter. Jeg har i den forbindelse nogle spørgsmål:
1) Hvordan laver man den vandrette "adskiller-streg"?
2) Hvordan laver man en undermenu - altså f.eks. som under FILER->UDSKRIFTSOMRÅDE, hvor der kommer en undermenu med punkterne "Sæt udskriftsområde" og "Fjern udskriftsområde".
3) Hvordan inaktiverer og grå-scallerer man et menupunkt?
4) På nogle af mine makroer har jeg en genvejstast med CTRL-tasten. Hvordan viser jeg denne genvejstast under menu-punktet - f.eks. lige som under FILER->NY, hvor der står "Ctrl+N"?
Public MenuObject As CommandBarPopup Public SubMenu As CommandBarPopup Public MenuItem As Object Public SubMenuItem As CommandBarButton Public Const strMenuName As String = "MyMenu" Public Const strMenuNo As String = 11 Public Const intBarsNo As Integer = 1
Sub Auto_Open() ' Make sure the menus aren't duplicated DeleteMenu strMenuName, intBarsNo
'Add to MainMenu - ControlPopup and ControlButton 'MenuItem CreateMenuItem "Item &1", "Menu01", "71", False CreateMenuItem "Item &2", "Menu02", "72", False 'SubMenu CreateSubMenu "&Group 1", True 'SubMenuItem CreateSubMenuItem "GroupItem &1", "UMenu01", "71", False End Sub
Private Sub CreateMainMenu(strMenuName, strMenuNo As String, intBarsNo As Integer) 'En ny hovedmenu Set MenuObject = Application.CommandBars(intBarsNo).Controls.Add(Type:=msoControlPopup, _ Before:=strMenuNo, Temporary:=True) MenuObject.Caption = strMenuName End Sub
Private Sub CreateMenuItem(strCaption, strOnAction, strFaceId As String, bolBeginGroup As Boolean) 'Et menupunkt punkt direkte i hovedmenu'en 'MenuItem Set MenuItem = MenuObject.Controls.Add(Type:=msoControlButton) With MenuItem .Caption = strCaption .OnAction = strOnAction .FaceId = strFaceId .BeginGroup = bolBeginGroup End With End Sub
Private Sub CreateSubMenu(strCaption As String, bolBeginGroup As Boolean) 'En menugruppe i hovedmenuen 'SubMenu Set SubMenu = MenuObject.Controls.Add(Type:=msoControlPopup) With SubMenu .Caption = strCaption .BeginGroup = bolBeginGroup End With End Sub
Private Sub CreateSubMenuItem(strCaption, strOnAction, strFaceId As String, bolBeginGroup As Boolean) 'Et menupunkt i en menugruppe 'SubMenu Item - UnderMenuPunkt Set SubMenuItem = SubMenu.Controls.Add(Type:=msoControlButton) With SubMenuItem .Caption = strCaption .OnAction = strOnAction .FaceId = strFaceId .BeginGroup = bolBeginGroup End With End Sub
Private Sub Menu01() 'Macro for menu testing MsgBox "This is a do-nothing macro." End Sub
Private Sub Menu02() 'Macro for menu testing MsgBox "This is a do-nothing macro." End Sub
Private Sub UMenu01() 'Macro for menu testing MsgBox "This is a do-nothing macro." End Sub
Jeg kom lige til at læse dit spørgsmål igen og blev i den forbindelse i tvivl om det var VBA koden du mangler eller om det "bare" er almindelig brug af værktøjslinier
rvm->Vedr. spm 4.: Det må kunne gøres nemmere. Bemærk, at punkterne i f.eks. Excel står pænt under hinanden selv om der er brugt en font, hvor karaktererne ikke er lige brede.
Du har ret, men... der ingen mulighed for at ændre font (minus til spg. 3) eller indsætte en ekstra tekst (som det er gjort som standard i Excel til genveje) - det ligger desværre ikke i objektmodellen.
Alternativ til spørgsmål 3: Slet menuen og opret den igen med med ny tekst i menuen f.eks. "Fjern udskriftsområde er ikke tilgænglig" og uden nogen makro tilknytet (det kan du gøre så hurtigt at brugeren ikke ser det).
Private Sub CreateMenuItem(strCaption, strOnAction, strFaceId As String, bolBeginGroup As Boolean) 'Et menupunkt punkt direkte i hovedmenu'en Set MenuItem = MenuObject.Controls.Add(Type:=msoControlButton)
With MenuItem .Caption = strCaption .OnAction = strOnAction .FaceId = strFaceId .BeginGroup = bolBeginGroup 'true .Enabled = False End With End Sub
Jan - husk at du skal have denne her med, for at at virker rigtigt.
Sub DeleteMenu(strMenuName As String, intBarsNo As Integer) ' This sub should be executed when the workbook is closed ' Deletes the Menus On Error Resume Next Application.CommandBars(intBarsNo).Controls(strMenuName).Delete On Error GoTo 0 End Sub
Flemming det behøver man vel egentlig ikke? Jeg lægger koden i Workbook_open() og sætter temporary:=True - så er menuen væk næste gang man starter Excel op.
rvm - please look at the smiling face :-) Det er dog en god idet, at henvise til kilden spørgsmålet, idet der kunne stå noget spændende. Derfor må du gerne få pointene for at finde det jan ikke fandt.
Spm. 1 og 4 er løst, men jeg knokler lidt med 2 og 3.
Måske d'herrer kan hjælpe lidt med 3) Mit problem er, at jeg fra starten inaktiverer et menu-punkt, men hvis brugeren aktiverer et bestemt ark, skal menupunktet aktiveres igen. Dette regner jeg med at kunne gøre v.h.a. Worksheet_Activate, men jeg kan ikke rigtig få peget rigtigt på objektet.
Min Command Bar er "Worksheet Menu Bar" (Excel standard) Mit menupunkt hedder "AdvisorMenu" og mit aktive/inaktive menupunkt hedder MenuElementInsertAspect
Flemming, det er også noget i retning af CommandBars("Worksheet Menu Bar").Controls("Vogt").Enabled = True jeg har prøvet, men jeg kan ikke få det til at virke. Hvordan vil koden præcis se ud med mine oplysninger: Min Command Bar er "Worksheet Menu Bar" (Excel standard) Mit menupunkt hedder "AdvisorMenu" og mit aktive/inaktive menupunkt hedder MenuElementInsertAspect
Det er jo kun et undermenupunkt som skal aktiveres/inaktiveres.
Nu har jeg fået spørgsmål 3 til at virke, men måske ikke på den smarteste måde *S*
Har oprettet en public variabel der hedder "Aktiver" (boolean)
Sub Worksheet_Activate() Aktiver = True 'Nu skal menuen kunne bruges OpretMenu ' kører nu flere gange end bare på AutoOpen - derfor er den nu lagt for sig selv End Sub
'Et andet ark Sub Worksheet_Activate() Aktiver = False 'Nu skal menuen være grå OpretMenu ' kører nu flere gange end bare på AutoOpen - derfor er den nu lagt for sig selv End Sub
Sub OpretMenu() ' som den hele tiden har været ' Make sure the menus aren't duplicated DeleteMenu strMenuName, intBarsNo
'Add to MainMenu - ControlPopup and ControlButton 'MenuItem CreateMenuItem "Item &1", "Menu01", "71", False CreateMenuItem "Item &2", "Menu02", "72", False 'SubMenu CreateSubMenu "&Group 1", True 'SubMenuItem CreateSubMenuItem "GroupItem &1", "UMenu01", "71", False end sub
'Har ændret lidt i denne Sub CreateSubMenuItem(strCaption, strOnAction, strFaceId As String, bolBeginGroup As Boolean) 'Et menupunkt i en menugruppe 'SubMenu Item - UnderMenuPunkt Set SubMenuItem = SubMenu.Controls.Add(Type:=msoControlButton) With SubMenuItem .Caption = strCaption .OnAction = strOnAction .FaceId = strFaceId .BeginGroup = bolBeginGroup .Enabled = Aktiver 'Her sættes om den skal kunne bruges eller ej End With End Sub
Hos mig går det så hurtigt, at jeg ikke kan nå at se menuen blive slettet og oprettet
Indsatte en ekstra variabel i CreateSubMenuItem og indsatte variablen ved "Enabled" :
Sub CreateSubMenuItem(strCaption, strOnAction, strFaceId As String, bolBeginGroup As Boolean, Aktiver1 As Boolean) ' ikke et originalt navn 'Et menupunkt i en menugruppe 'SubMenu Item - UnderMenuPunkt Set SubMenuItem = SubMenu.Controls.Add(Type:=msoControlButton) With SubMenuItem .Caption = strCaption .OnAction = strOnAction .FaceId = strFaceId .BeginGroup = bolBeginGroup .Enabled = Aktiver1 End With End Sub
og ændrede koden i OpretMenu:
Sub OpretMenu() ' Sørger for der ken er en Disa menu DeleteMenu strMenuName, intBarsNo CreateMainMenu strMenuName, strMenuNo, intBarsNo
'Tilføjer emner til hovemenu CreateMenuItem "Opret containorliste", "OpretContainerListe", "71", False
CreateMenuItem "Indtast/Hent container eller bil", "VisFrmContainerNavn", "72", False
CreateMenuItem "Indtast/Hent container eller bil", "VisFrmContainerNavn", "72", False
'SubMenu CreateSubMenu "Menu", True 'SubMenuItem CreateSubMenuItem "Undermenu1", "UMenu01", "73", False, True ' Her er den nye kode If Aktiver = False Then CreateSubMenuItem "GroupItem &1", "UMenu01", "74", False, False 'Den ekstra variabel Else CreateSubMenuItem "GroupItem &1", "UMenu01", "74", False, True End If End Sub
Nu tror jeg jeg stopper for i dag. Koden jeg lige postede virker, men læg lige mærke til at den første del i "OpretMenu()" er foranderet, da jeg sidder og tester på en gammel sag og glemte at anonymisere den - tsk, tsk.
Sub worksheet_Activate() CommandBars("Worksheet Menu Bar").Controls("Vogt").Controls("Advisormenu").Enabled = False end sub Sub worksheet_Deactivate() CommandBars("Worksheet Menu Bar").Controls("Vogt").Controls("Advisormenu").Enabled = True end sub
Perfekt, så nåede vi vist helt til bunds med spørgsmålene. Tak for hjælpen til alle. Som rvm skriver: "Nu er vi vist alle ved at være eksperter på menuer!"
Bak, smid lige et svar så du kan få del i pointene. De er velfortjente :-)
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.