Avatar billede janvogt Praktikant
22. april 2002 - 12:40 Der 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"?
Avatar billede rvm Nybegynder
22. april 2002 - 12:43 #1
Her er svaret på spørgsmål 2:

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 MainMenu
    CreateMainMenu strMenuName, strMenuNo, 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
Avatar billede rvm Nybegynder
22. april 2002 - 12:44 #2
Jeg kopierede det hele for at du kunne forstå strukturen der er brugt. Koden er lige til at kopiere ind i et kodemodul i Excel
Avatar billede rvm Nybegynder
22. april 2002 - 12:46 #3
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
Avatar billede janvogt Praktikant
22. april 2002 - 12:47 #4
VBA-koden tak :-)
Den almindelige tilretning af værktøjslinier kender jeg ....
Avatar billede rvm Nybegynder
22. april 2002 - 12:53 #5
Det mente jeg også *S*

->Spørgsmål 4: Lav nedenstående linie:
  CreateMenuItem "Item &1", "Menu01", "71", False
om til:
  CreateMenuItem "Item &1    Ctrl+N", "Menu01", "71", False
Avatar billede janvogt Praktikant
22. april 2002 - 13:06 #6
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.
Avatar billede rvm Nybegynder
22. april 2002 - 13:19 #7
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).
Avatar billede janvogt Praktikant
22. april 2002 - 13:38 #8
Spm. 1 med den vandrette streg har jeg selv løst:
PrintMenu.BeginGroup = True
Avatar billede rvm Nybegynder
22. april 2002 - 13:42 #9
Perfekt *S*
Avatar billede rvm Nybegynder
22. april 2002 - 13:54 #10
Her er koden til spørgsmål 3:

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

Det er "Enabled = False" der er det vigtige *S*
Avatar billede danfax Nybegynder
22. april 2002 - 13:57 #11
spm 4


Set myControl = CommandBars("Custom").Controls _
    .Add(Type:=msoControlButton, Id:= 17)
With myControl
    .OnAction = "MySub"
    .Caption = "Graph Results"
    .Control.ShortcutText = "CTRL+SHIFT+M"
End With

Hilsen Dan
Avatar billede rvm Nybegynder
22. april 2002 - 14:12 #12
-> danfax: Og det virker bare... *S*
22. april 2002 - 14:51 #13
Godt fundet rvm :-) http://www.eksperten.dk/spm/46746

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

Husk at denne også kaldes fra Workbook_Close()
Avatar billede rvm Nybegynder
22. april 2002 - 14:55 #14
-> flemmingdahl: Jeg har aldrig påstået det var min egen kode!
Avatar billede janvogt Praktikant
22. april 2002 - 14:55 #15
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.
Avatar billede rvm Nybegynder
22. april 2002 - 14:58 #16
Men hvis nu menuen kun skal være der i netop denne excelfil, så giver flemmings indlæg mening *S*
22. april 2002 - 15:02 #17
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.
Avatar billede janvogt Praktikant
22. april 2002 - 15:03 #18
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

Hvordan skal Activate-koden se ud?
22. april 2002 - 15:14 #19
22. april 2002 - 15:21 #20
Det kan godt være, at du skal have gang i denne her istedet for FindControls
CommandBars(("Worksheet Menu Bar").Controls("Vogt").Enabled = True
22. april 2002 - 15:22 #21
Spørgsmål 2 løser menu'en nu fint for dig - se efter
'SubMenu
    CreateSubMenu "&Group 1", True
        'SubMenuItem
        CreateSubMenuItem "GroupItem &1", "UMenu01", "71", False
Avatar billede janvogt Praktikant
22. april 2002 - 15:35 #22
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.
Avatar billede rvm Nybegynder
22. april 2002 - 17:47 #23
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 MainMenu
    CreateMainMenu strMenuName, strMenuNo, 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
Avatar billede rvm Nybegynder
22. april 2002 - 17:52 #24
Ups - så lige at alle undermenuerne nu bliver grå.
Avatar billede rvm Nybegynder
22. april 2002 - 18:05 #25
Nå - det løste jeg således:

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
Avatar billede rvm Nybegynder
22. april 2002 - 18:10 #26
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.

Det vigtige kommer fra 'SubMenu og nedefter *S*
Avatar billede bak Forsker
23. april 2002 - 20:20 #27
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
Avatar billede rvm Nybegynder
24. april 2002 - 09:06 #28
-> bak: Det var noget smartere end min kode *S* Nu er vi vist alle ved at være eksperter på menuer :-))
Avatar billede janvogt Praktikant
24. april 2002 - 09:11 #29
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 :-)
Avatar billede bak Forsker
24. april 2002 - 10:14 #30
Tak for det, Jan (og rvm) :-)
Avatar billede janvogt Praktikant
24. april 2002 - 12:20 #31
Danfax, din ShortcutText løste spm. 4, så hvis du også lige gider at lægge et svar ....
Avatar billede danfax Nybegynder
24. april 2002 - 12:28 #32
Nej Tak!!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester