Re: VBA Dynamic Keybinding
Yes you can do that. Here's a simple example to bind a style to CTRL+1.
Code:
KeyBindings.Add KeyCode:=BuildKeyCode(wdKey1, wdKeyControl), _
KeyCategory:=wdKeyCategoryStyle, Command:="Style Name Here"
Re: VBA Dynamic Keybinding
Hi dmaruca,
KeyBindings.Add KeyCode:=BuildKeyCode(wdKey1, wdKeyControl), _
KeyCategory:=wdKeyCategoryStyle, Command:="Style Name Here"
I have also used the above concept only. But I have stored in database the stylename ans styleshortcuts. I have also given the user a interface to change the stylename and their corresponding shortcuts whenever he needed. When the user changes the stylename, shortcuts it doesn't matter, we can passes it thorugh argument to the general procedure but the command is the problem. How it is possible to assign different procedures for all stylenames??? Below is the code for your persual.
Public Sub DynamicKeyBind()
Dim lCtl As Long
Dim lAlt As Long
Dim lShift As Long
Dim lKey As Long
Dim sSql As String
Dim sShort As String
Dim sShortKey As String, aShortKey() As String
Dim sShortVal As String, aShortVal() As String
sShortKey = "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z"
sShortVal = "65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|"
aShortKey = Split(sShortKey, "|")
aShortVal = Split(sShortVal, "|")
modConnection.Open_Connection
Set Rs = New ADODB.Recordset
sSql = "select StyleName,ShortcutKey from Mst_Styles where ShortcutKey<>''"
Rs.Open sSql, modConnection.Conn, adOpenStatic, adLockReadOnly
Do While Not Rs.EOF
sStyleKey = Rs(0)
sShort = Rs(1)
For i = 0 To UBound(aShortKey)
If LCase(Right(sShort, 1)) = aShortKey(i) Then
lKey = CLng(aShortVal(i))
End If
Next i
'Control+Shift+Alt combination
If InStr(1, sShort, "ctrl", vbTextCompare) > 0 And InStr(1, sShort, "shift", vbTextCompare) > 0 And InStr(1, sShort, "alt", vbTextCompare) > 0 Then
lCtl = wdKeyControl
lAlt = wdKeyAlt
lShift = wdKeyShift
KeyBindings.Add KeyCategory:=wdKeyCategoryMacro, _
Command:="DynaKeyBndEvntHandler", KeyCode:=BuildKeyCode(lCtl, lAlt, lShift, lKey)
'Control+Shift combination
ElseIf InStr(1, sShort, "ctrl", vbTextCompare) > 0 And InStr(1, sShort, "shift", vbTextCompare) > 0 Then
lCtl = wdKeyControl
lShift = wdKeyShift
KeyBindings.Add KeyCategory:=wdKeyCategoryMacro, _
Command:="DynaKeyBndEvntHandler", KeyCode:=BuildKeyCode(lCtl, lShift, lKey)
'Control+Alt combination
ElseIf InStr(1, sShort, "ctrl", vbTextCompare) > 0 And InStr(1, sShort, "alt", vbTextCompare) > 0 Then
lCtl = wdKeyControl
lAlt = wdKeyAlt
KeyBindings.Add KeyCategory:=wdKeyCategoryMacro, _
Command:="DynaKeyBndEvntHandler", KeyCode:=BuildKeyCode(lCtl, lAlt, lKey)
'Control combination
ElseIf InStr(1, sShort, "ctrl", vbTextCompare) > 0 Then
lCtl = wdKeyControl
KeyBindings.Add KeyCategory:=wdKeyCategoryMacro, _
Command:="DynaKeyBndEvntHandler", KeyCode:=BuildKeyCode(lCtl, lKey)
'Alt combination
ElseIf InStr(1, sShort, "alt", vbTextCompare) > 0 Then
lAlt = wdKeyAlt
KeyBindings.Add KeyCategory:=wdKeyCategoryMacro, _
Command:="DynaKeyBndEvntHandler", KeyCode:=BuildKeyCode(lAlt, lKey)
'Shift combination
ElseIf InStr(1, sShort, "shift", vbTextCompare) > 0 Then
lShift = wdKeyShift
KeyBindings.Add KeyCategory:=wdKeyCategoryMacro, _
Command:="DynaKeyBndEvntHandler", KeyCode:=BuildKeyCode(lShift, lKey)
End If
Rs.MoveNext
Loop
End Sub
Public Sub DynaKeyBndEvntHandler()
Dim oNode As Object
If bFrmStylesLoaded = True Then
For Each oNode In frmStyles.trvBack.Nodes
If oNode.Text = sAStyle Then
modStyling.StyleSelection CInt(Replace(oNode.Key, "key", ""))
Exit For
End If
Next oNode
End If
End Sub
Here using the above method I can able to bind all the keys at runtime. But after binding while pressing any assigned shortcut the control will directly to DynaKeyBndEvntHandler procedure. Here I dont know which shortcut key as pressed to assign the style name.
regards,
Senthil. S