我正在使用许多RefEdit框在EXCEL 2016 VBA中开发用户窗体。当我使用MS开发的用户表单之一(例如,数据分析工具库中的描述统计用户表单)时,用户可以使用快捷键,如 Shift + ↓或 Shift + Ctrl + ↓进行选择。
目前,我的RefEdit框不支持此功能。是否可以在VBA中为典型的RefEdit框编码这些属性?如果是这样,有人可以提供示例代码吗?
非常感谢,
丹
答案 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