VBA用户窗体箭头键处理复选框

时间:2018-07-17 14:21:38

标签: vba

我到处都是,找不到答案,所以我猜我不知道我在寻找什么-希望有人在这里能帮到我。

我创建了一个带有一系列复选框的用户表单,用于每天的出勤记录。每个要求的与会者都有一个复选框,宏将其转储到excel的日志中,依此类推,等等。

一切都很好,除了-使用箭头键在复选框之间移动会使其变为选中状态!

使用tab循环浏览不会这样做。

我注意到这只是在释放箭头键时。我很茫然。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我有同样的问题。这是我解决的方法:

  • 声明一个公共变量(例如键盘)
  • 对于userForm中的每个复选框,为_KeyUp创建事件Subs
  • 在每个这些Subs中,检查是否已按下箭头键之一;如果是这样,转     键盘为真。
  • 创建事件Subs,以检查键盘是否为true,如果是,则撤消.value = true为 .value = false

我使用了一个函数(arrowModerator)来处理所有这一切,因为对于其他复选框,如果arrowModerator为true,则发生其他事情。这是我的两个复选框的外观:

Public keyboard As Boolean      ‘or Private keyboard as Boolean


Private Sub CB_3_Change()
    Call arrowModerator(Visit2, -1, "3")        ‘Visit2 is the name of my userForm 
End Sub
Private Sub CB_4_Change()
    Call arrowModerator(Visit2, -1, "4")
End Sub


Private Sub CB_3_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Call arrowModerator(Visit2, CInt(KeyCode))
End Sub
Private Sub CB_4_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Call arrowModerator(Visit2, CInt(KeyCode))
End Sub


Public Function arrowModerator(ByRef uForm As UserForm, keyboardInt As Integer, Optional cbString As String)
    If keyboardInt = -1 Then
        If keyboard = True Then
            uForm.Controls("CB_" & cbString).value = False
            keyboard = False
        ElseIf uForm.Controls("CB_" & cbString).value = True Then
            arrowModerator = True
        End If
    ElseIf keyboardInt > 36 And keyboardInt < 41 Then
        keyboard = True
    End If
End Function

当它们与_keyPress,_keyDown和_keyUp绑定在一起时,我发现(formName)_Change,_AfterUpdate,_Exit,_Enter的顺序非常混乱。我发现_Change事件发生在_keyUp事件之后,因此基本上上述过程捕获了“更改”(也就是将复选框转到.value = true)并将其反转。

答案 1 :(得分:0)

  • 在VBEditor中选择用户窗体
  • F4
  • 按类别排序
  • 在“周期”下方找到“已启用”
  • 选择“假”

enter image description here