Add-In Keyboard Shortcut

M

mvyvoda

i am using an add-in to store macro's ("personal.xla" in C:\Documents and
Settings\mvyvoda\Application Data\Microsoft\AddIns). I need to have a
keyboard shortcut to one fuction within this add-in. The macro list (Alt-F8)
does not list any macro's in personal.xla.

i'm not even sure where to start.

thanks,
-m
 
P

Peter T

Application.OnKey "+^D", "MyMacro"

This should create a shortcut Shift-Ctrl-D. If there's any possibility
MyMacro may exist in any other workbook prefix with ThisWorkbook.Name & "!".
Call it from an Open event.

Not sure about naming your addin "Personal.xla" if there may also be a
Personal.xls open, guess it's OK but I wouldn't.

Regards,
Peter T
 
M

mvyvoda

Peter,

When I do this, and get rid of the menu already in place (but run your code)
I get an error:

The macro" C:\..\AddIns\personal.xla'!AddMenu' cannot be found

do you what this means?

Thanks,
-m
 
P

Peter T

Why do you "get rid of the menu already in place"

Is AddMenu a Sub with no arguments

Do you have a similarly named AddMenu sub in any other workbook (incl
addins), if so did you prefix the way I suggested.

Apart from your Personal.xla do you also have Personal.xls, if so try
renaming the addin.

Regards,
Peter T
 
M

mvyvoda

I got rid of the menu already in place to test to see if the ctrl+shift+D
would work if only personal.xla was in place and never ran. also, i did
rename the file, to no avail.

I don't have any other macro's that are similarly named.

AddMenu is a pretty typical routine that merely adds a menu, names it and
places arguments (attached to macros of course) within the menu.

Peter, I really appreciate all your help!!,
-m
 
M

mvyvoda

oh... I misnamed AddMenu. It works now, however I have a final question. I
have a scenario whereby I need this ctrl+shift+D to work in a situation where
someone has never ran the AddMenu routine. Is this possible? Or, do I have to
run AddMenu with the added ctrl+shift+D code before they can use ctrl+shift+D?

If you follow?

Thanks,
-m
 
P

Peter T

I'm glad you've got it working but not sure I understand your follow-up
question.

You need to run the code that assigns the shortcut to your AddMenu proc,
typically from an open event which might also add a menu. There's no need
for the proc to have run once before it will work from the shortcut.

It's unusual to have a shortcut that runs code to add menu items, at least I
assume that's what AddMenu does. More conventional would be to have both the
OnAction property of a menu item and your shortcut linked to a procedure
that starts some functional aspect of your addin.

Regards,
Peter T
 
M

mvyvoda

From the users standpoint, I have a series of macro's that can only run from
a menu (as opposed to going into the code and running the macro). However,
each iteration of my .xla file (which stores the macro's) I change this menu.

So, I want to be able to automatically (via ctrl+shift+d sounds great!) to
change their pre-existing menu to the current one i worked on.

you say it's unconventional to have an entire module dedicated to adding a
menu (AddMenu). You also say you think it wise to add a menu from within
another module. Is that what you're saying? I'm not sure if I follow... this
line of thinking.

I also think i'm in way over my head :-/ But, it's pretty close....

thanks a lot for your time and effort!!!!,
-m
 
P

Peter T

you say it's unconventional to have an entire module dedicated to adding a
menu (AddMenu).

No I didn't mean that (an entire module etc). I meant unusual to have a
shortcut to a procedure that in turn adds menu item(s), though I think I now
understand what you are doing.

I would suggest a different approach, and I'm assuming you are not deleting
the menus in the close event. In the tag property of your menus write
something that identifies your xla version, an id. In the open event try
setting a reference to your menus (under On Error Resume Next). If the id
refers to an old version delete it and create new menu(s). Also of course if
the menu doesn't exist create the menu.

Regards,
Peter T
 
M

mvyvoda

Peter T,

Haha, sounds like you have a better understanding of this menu dilemma than
I do. I'm afraid I would struggle for days trying to understand the
complexity of your answer. closed events vs. open, tag properties, etc. i
have an unfortunately long-ish AddMenu module. What are the chances of you
taking a peek at it? Is that asking too much of youru time and energy?

Thanks,
Mark
 
D

dgp

I'm sorry I don't follow any of the discussion about menus but I think
I can answer the orginal question. Here are two ways to add a keyboard
shortcut to an add-in subroutine:

Manually:
1) Open the macro listTools>Macro>Macros...
2) You won't see your subroutine listed, but when you type in the full
name of the macro the Options button will become enabled. Click the
Options button and enter your shortcut.
3) Be sure to save your add-in from the VBE window.

By Code:
1) Write a Private Sub in your add-in.
2) Enter the following code:
Application.MacroOptions Macro:="MyMacro", _
HasShortCutKey:=True, _
ShortcutKey:="V" 'Alt+Shift+v
3) Run this macro from the VBE window once and save the add-in.

Dave Parker
 
P

Peter T

Hi Mark,

From Auto_Open should add a MyMacro button to the Tools menu and optionally
delete any old MyMacro that wasn't deleted in a previous Auto_Close (if
indeed you want to delete menu on close). It also adds a version id to the
button's tag property.

Sub Auto_Open()
MyMenu True, 123
End Sub

Sub Auto_Close()
MyMenu False
End Sub

Sub MyMenu(bCreate As Boolean, Optional ver)
Dim cbcTools As CommandBarControl
Dim cbcNew As CommandBarControl

On Error Resume Next
'set a ref to Tools
Set cbcTools = _
Application.CommandBars("Worksheet Menu Bar").FindControl(Id:=30007)

'delete any/all MyMacro buttons
Do
cbcTools.Controls("MyMacro").Delete
Loop Until Err.Number

On Error GoTo 0

If bCreate Then
' you might not want temporary:=True
Set cbcNew = cbcTools.Controls.Add(Type:=1, temporary:=True)
cbcNew.Caption = "&MyMacro"
cbcNew.OnAction = "MyMacro"
cbcNew.Tag = "MyVer" & ver
End If

End Sub

Sub MyMacro()

MsgBox "MyMacro"
End Sub

Regards,
Peter T

PS I accidently posted this earlier today in another thread!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top