VBA Add Shortcut Keys to Dynamic Menu on the Userform

Posted on 2009-07-01
Last Modified: 2012-05-11
Does anyone know how to create shortcut Keys to the API dynamic menu on the Userform? For example: I have a item "New" on the menu and I want to assign the shortcut Ctrl+N to it and "Ctrl+N" will sit beside "New" on the menu.

I have attached my file

Question by:eyeweyew
  • 3
  • 2
LVL 22

Expert Comment

ID: 24762502
Append it to the Caption separated by vbTab and it should be recognized as a Shortcut.
"New" & vbTab & "Ctrl+N"

Author Comment

ID: 24765749

Ok, so now it aligns properly on the menu. Thanks for that!

But how can I assign the the actual short key so when the user press Ctrl with N, it will call a certain Sub.
LVL 22

Accepted Solution

danaseaman earned 500 total points
ID: 24766028
You need to store the accelerators somewhere and subclass WM_MENUCHAR message of your Menu.
This is just an example and will have to be modified depending on which subclass code you implement.


         ' Check that this is my menu:

         lFlag = wParam \ &H10000

         If ((lFlag And MF_SYSMENU) <> MF_SYSMENU) Then

            hMenu = lParam

            iChar = (wParam And &HFFFF&)

            Debug.Print "WM_MENUCHAR", hMenu, Chr$(iChar)

            ' See if this corresponds to an accelerator on the menu:

            lR = pvParseMenuChar(hMenu, iChar)

            If lR > 0 Then

               bHandled = True

               lReturn = lR

            End If

         End If

         If Not bHandled Then

            'ISubclass_WindowProc = CallOldWindowProc(hWnd, iMsg, wParam, lParam)

            lReturn = ssc_CallOrigWndProc(lng_hWnd, uMsg, wParam, lParam)

         End If

Private Function pvParseMenuChar( _

   ByVal hMenu As Long, _

   ByVal iChar As Long) As Long

   Dim lPos             As Long

   Dim i                As Long

   Dim iModifier        As Long

   iModifier = GetShiftMask

   Debug.Print "iChar Before", iChar

   If iChar > 96 Then

      iChar = iChar - 32 'LCase to UCase

   ElseIf iChar < 65 Then

      iChar = iChar + 64 'Ctrl to Ucase

   End If

   Debug.Print "iChar After", iChar

   For i = 0 To UBound(MenuID)

      If MenuID(i).hMenu = hMenu Then

         If MenuID(i).ShortcutKey = iChar Then

            If MenuID(i).ShortcutModifier = iModifier Then

               pvParseMenuChar = &H20000 + MenuID(i).Position - 1

               Exit Function

            End If

         End If

      End If


End Function

Open in new window


Author Comment

ID: 24766933

Don't really understand how to implement this. Could you provide me a simple macro which has this in it? So I can try to figure out how it works.

Your help would be appreciated!
LVL 22

Expert Comment

ID: 24767055
For subclassing you can use the one from

SubClassing With The SSubTmr6 DLL 

When Popmenu is created you will need to store the handle and shortcuts in an array or collection.
I store the Ascii character value, Shift state, and menu item position which is later searched when you receive msg WM_MENUCHAR.
Note: GetShiftMask gets current kybd shift state and that is compared to shift state of your accelerator.

I don't have plug-in code that will work in Excel.

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article descibes how to create a connection between Excel and SAP and how to move data from Excel to SAP or the other way around.
Computer science students often experience many of the same frustrations when going through their engineering courses. This article presents seven tips I found useful when completing a bachelors and masters degree in computing which I believe may he…
This Micro Tutorial demonstrates in Microsoft Excel how to consolidate your marketing data by creating an interactive charts using form controls. This creates cool drop-downs for viewers of your chart to choose from.
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now