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

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

Author Comment

Comment Utility

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
Comment Utility
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

Comment Utility

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

Comment Utility
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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

This is an explanation of a simple data model to help parse a JSON feed
Although it can be difficult to imagine, someday your child will have a career of his or her own. He or she will likely start a family, buy a home and start having their own children. So, while being a kid is still extremely important, it’s also …
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 …
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…

744 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

15 Experts available now in Live!

Get 1:1 Help Now