想要在 TextBox 中使用向上和向下箭头来更改 ListBox 选择
Want up and down arrow in TextBox to change ListBox selection
在 macOS Mojave 上使用 Microsoft Excel 2011,我有一个带有文本框(名为 NameEntry)、列表框(名为 NameList)和两个命令按钮的用户窗体。当 TextBox 具有焦点时,我希望向上和向下箭头键的作用就像 ListBox 具有焦点一样,即 select ListBox 中的下一个或上一个项目,同时将焦点留在 TextBox 上(并作为奖金,在顶部和底部包裹,如果也按下 shift,则一直向上或向下移动)。这是我的代码:
Private Sub NameEntry_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i As Long
If KeyCode = vbKeyUp Or KeyCode = vbKeyDown Then
i = NameList.ListIndex
Select Case KeyCode
Case vbKeyUp
If Shift And 1 Then
i = 0
Else
i = i - 1
If i < 0 Then
i = NameList.ListCount - 1
End If
End If
Case vbKeyDown
If Shift And 1 Then
i = NameList.ListCount - 1
Else
i = i + 1
If i >= NameList.ListCount Then
i = 0
End If
End If
End Select
NameList.ListIndex = i
End If
End Sub
这对向上箭头非常有效。 selection 向上移动一行,从顶部到底部环绕,并向上移动箭头 selects 第一项。 TextBox 保留焦点。 Shift down arrow 也可以完美地工作,selecting 最后一项。向下箭头 有点 有效。下一项为 selected,如果最后一项为 selected,则第一项为 selected,但焦点始终转移到 ListBox。我试过在 NameEntry_KeyDown
子的末尾添加 NameEntry.SetFocus
,我已经添加了 KeyPress 和 KeyUp 子并观察它们何时被调用,但到目前为止我感到困惑。 Up、上移和下移使 TextBox 保持焦点,而 down 使焦点保持在 ListBox 上。如何使用向下箭头将焦点留在 TextBox 上?
(我可能可以拥有一个全局 DoingArrowStuff
变量,如果已设置则取消从 TextBox 退出,但如果由于某种原因未调用 NameEntry_Exit
,则该变量将保留设置并防止稍后退出。这似乎是一个脆弱的解决方案。)
我稍微调整了您的代码以使其更简洁,但主要添加的内容是 KeyCode = 0
行:
Private Sub NameEntry_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyUp
KeyCode = 0
If Shift = 1 Then
NameList.ListIndex = 0
Else
If NameList.ListIndex > 0 Then
NameList.ListIndex = NameList.ListIndex - 1
Else
NameList.ListIndex = NameList.ListCount - 1
End If
End If
Case vbKeyDown
KeyCode = 0
If Shift = 1 Then
NameList.ListIndex = NameList.ListCount - 1
Else
If NameList.ListIndex < NameList.ListCount - 1 Then
NameList.ListIndex = NameList.ListIndex + 1
Else
NameList.ListIndex = 0
End If
End If
End Select
End Sub
KeyCode = 0
的作用是忽略击键并执行您的逻辑。
在 macOS Mojave 上使用 Microsoft Excel 2011,我有一个带有文本框(名为 NameEntry)、列表框(名为 NameList)和两个命令按钮的用户窗体。当 TextBox 具有焦点时,我希望向上和向下箭头键的作用就像 ListBox 具有焦点一样,即 select ListBox 中的下一个或上一个项目,同时将焦点留在 TextBox 上(并作为奖金,在顶部和底部包裹,如果也按下 shift,则一直向上或向下移动)。这是我的代码:
Private Sub NameEntry_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i As Long
If KeyCode = vbKeyUp Or KeyCode = vbKeyDown Then
i = NameList.ListIndex
Select Case KeyCode
Case vbKeyUp
If Shift And 1 Then
i = 0
Else
i = i - 1
If i < 0 Then
i = NameList.ListCount - 1
End If
End If
Case vbKeyDown
If Shift And 1 Then
i = NameList.ListCount - 1
Else
i = i + 1
If i >= NameList.ListCount Then
i = 0
End If
End If
End Select
NameList.ListIndex = i
End If
End Sub
这对向上箭头非常有效。 selection 向上移动一行,从顶部到底部环绕,并向上移动箭头 selects 第一项。 TextBox 保留焦点。 Shift down arrow 也可以完美地工作,selecting 最后一项。向下箭头 有点 有效。下一项为 selected,如果最后一项为 selected,则第一项为 selected,但焦点始终转移到 ListBox。我试过在 NameEntry_KeyDown
子的末尾添加 NameEntry.SetFocus
,我已经添加了 KeyPress 和 KeyUp 子并观察它们何时被调用,但到目前为止我感到困惑。 Up、上移和下移使 TextBox 保持焦点,而 down 使焦点保持在 ListBox 上。如何使用向下箭头将焦点留在 TextBox 上?
(我可能可以拥有一个全局 DoingArrowStuff
变量,如果已设置则取消从 TextBox 退出,但如果由于某种原因未调用 NameEntry_Exit
,则该变量将保留设置并防止稍后退出。这似乎是一个脆弱的解决方案。)
我稍微调整了您的代码以使其更简洁,但主要添加的内容是 KeyCode = 0
行:
Private Sub NameEntry_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyUp
KeyCode = 0
If Shift = 1 Then
NameList.ListIndex = 0
Else
If NameList.ListIndex > 0 Then
NameList.ListIndex = NameList.ListIndex - 1
Else
NameList.ListIndex = NameList.ListCount - 1
End If
End If
Case vbKeyDown
KeyCode = 0
If Shift = 1 Then
NameList.ListIndex = NameList.ListCount - 1
Else
If NameList.ListIndex < NameList.ListCount - 1 Then
NameList.ListIndex = NameList.ListIndex + 1
Else
NameList.ListIndex = 0
End If
End If
End Select
End Sub
KeyCode = 0
的作用是忽略击键并执行您的逻辑。