在Userform中使用带有RefEdit框的键盘快捷键

时间:2018-01-30 20:00:11

标签: excel vba keyboard-shortcuts userform

我正在使用许多RefEdit框在EXCEL 2016 VBA中开发用户窗体。当我使用MS开发的用户表单之一(例如,数据分析工具库中的描述统计用户表单)时,用户可以使用快捷键,如 Shift + Shift + Ctrl + 进行选择。

目前,我的RefEdit框不支持此功能。是否可以在VBA中为典型的RefEdit框编码这些属性?如果是这样,有人可以提供示例代码吗?

非常感谢,

2 个答案:

答案 0 :(得分:0)

我刚刚创建了一个带有RefEdit的虚拟UserForm,我看到箭头键与Shift和Ctrl一起按预期工作,但前提是UserForm没有缩小以仅显示RefEdit。

我在UserForm中使用_KeyDown事件来捕获用户单击键盘箭头键的时间。也许你可以试试RefEdit的_KeyDown事件。

Private Sub RefEdit1_KeyDown(KeyCode As Integer, ByVal Shift As Integer)

End Sub

它会变得非常复杂,因为你需要看到RefEdit中显示的内容,以及最初在RefEdit中的内容,所以你知道箭头键是什么扩大或缩小特定方向的范围。

另一个复杂因素是RefEdit_KeyDown与其他_KeyDown事件不同。文本框的_KeyDown如下所示:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

End Sub

请注意,KeyCode的类型为MSForms.ReturnInteger,而在RefEdit中,类型为Integer。这是什么意思?好吧,左,上,右,下箭头键的ReturnInteger值为37,38,39和40.这些键的整数值为0,0,0和0.所以使用KeyCode As Integer, RefEdit无法区分单击了哪个箭头键(或者可能已经点击了哪个其他值= 0键,如果存在的话)。

如果您尝试将RefEdit1_KeyDown事件更改为使用ReturnInteger,则会出现编译错误。如果RefEdit具有焦点,则会收到_KeyDown事件,因此您无法使用_KeyDown进行任何其他控制来确定点击了哪个箭头。

我不会在任务关键型项目中使用RefEdits。它太脆弱了。有时它甚至不会出现在某些用户的UserForms中。计算机,通常只是表现得很糟糕。我在Alternative to Excel's Flaky RefEdit Control中描述了一种不同的方法。该方法也不支持箭头键。

答案 1 :(得分:0)

当我使用RefEdit对象初始化任何表单时,我运行以下代码。 FixedRefEditKeys只是全局Boolean

  

注意:Cannot use keyboard shortcuts to select ranges in RefEdit control in Excel

Public Sub FixRefEditKeys()
Dim sKey As String
'http://support.microsoft.com/kb/291110
    If Not FixedRefEditKeys Then
        sKey = "HKEY_CURRENT_USER\software\microsoft\office\" & Application.Version & "\Excel\Options\"
        If Not RegKeyExists(sKey & "QFE_Richmond") Then RegKeySave sKey & "QFE_Richmond", 1, "REG_DWORD"
    End If
End Sub

使用“ my”(又称Internet)Registry模块中的以下内容:

'returns True if the registry key i_RegKey was found
'AND False if not
Function RegKeyExists(i_RegKey As String) As Boolean
Dim myWS As Object

  On Error GoTo ErrorHandler
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'try to read the registry key
  myWS.RegRead i_RegKey
  'key was found
  RegKeyExists = True
  Exit Function

ErrorHandler:
  'key was not found
  RegKeyExists = False
End Function

'sets the registry key i_RegKey to the
'value i_Value with type i_Type
'if i_Type is omitted, the value will be saved as string
'if i_RegKey wasn't found, a new registry key will be created
Sub RegKeySave(i_RegKey As String, _
               i_Value As String, _
      Optional i_Type As String = "REG_SZ")
Dim myWS As Object

  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'write registry key
  myWS.RegWrite i_RegKey, i_Value, i_Type
End Sub