首先,我要感谢你们所有人。也许你没有注意到,但是你帮助我从头开始把VBA搞到一定程度。我还在学习过程中,所以我可能会遗漏一些非常简单的东西,请保持温和:)
首先,我想提供一个关于我的问题的小型背景更新。我一直在编写一个小程序来扫描传入的部件到我的工作,以便能够保持库存状态。该计划的最新外观如下:
图片上的数字最近是我的噩梦:
1。扫描的部件号:这是扫描仪输入值的文本框。收到输入后,我将数据转换为变量并清除文本框值,如下所示:
Private Sub PN_CurrentScan_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
EnteredPN = Replace(PN_CurrentScan.Value, Chr(32), "", 1) '<---PN_CurrentScan is the name of text box
EnteredPN = Left(EnteredPN, 12)
PN_CurrentScan.Value = ""
对扫描数据进行一些更正后,我基本上将其写入工作簿中的工作表。然后我在同一工作簿中也有一个数据透视表,它使用这个扫描数据作为源,并计算每个部件号扫描的部件数量。
2。当前状态:此ListBox包含扫描的所有部件号(来自上述数据透视表)和等待扫描(来自另一个工作表)。然后每次扫描新零件时它都会自动刷新。
第3。 ListBox滚动条:由于我有很长的部件号列表,因此我无法在屏幕上显示所有内容,这就是列表框创建此滚动条的原因。
我认为足够的背景:)
所以,如果我们关注我的话。由于我的拼贴使用无绳扫描仪进行此操作,有时他们没有机会看到屏幕,因此他们无法理解光标是否在扫描的部件号文本框中。或不。这就是为什么无论发生什么事情我都需要专注于那个盒子(当然,如果仓库烧毁,地震或海啸袭击这个地方我们什么也做不了,但不要考虑那些)。
我做过什么:
然后我对所有控件的制表位进行了删除:
Dim contr As Control
For Each contr In ScannerInterface.Controls
On Error Resume Next
contr.TabStop = False
Next
ScannerInterface.PN_CurrentScan.TabStop = True
为所有按钮点击添加了setfocus属性:
Me.PN_CurrentScan.SetFocus
将setfocus属性添加到列表框中点击:
Private Sub CurrentStatus_List_Click()
Me.PN_CurrentScan.SetFocus
End Sub
添加了设置焦点以进入和退出列表框的事件但是这不起作用:
Private Sub CurrentStatus_List_Enter()
Me.PN_CurrentScan.SetFocus
End Sub
Private Sub CurrentStatus_List_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Me.PN_CurrentScan.SetFocus
End Sub
所以,通过所有这些反制措施,我已经设法提升到某个点,只剩下的问题是当我点击列表框旁边的滚动条时,文本框失去焦点而没有点击文本框我无法设法重新设定焦点。我尝试了所有与listbox不同的事件。有什么方法可以解决这个问题,还是我需要处理这个问题?在此先感谢您的支持。
解决方案:
感谢@Rory,我们设法解决了我的问题。正如他在下面的答案中注意到并解释的那样,我的文本框和列表框都在框架中。我已经尝试了几个setfocus选项,但我总是将焦点放在文本框中。但是,解决方案是将焦点放在包含目标文本框的框架上:
Private Sub CurrentStatus_Frame_Enter() '<-- Enter event of the frame which contains listbox
Me.PN_CurrentScan.SetFocus '<-- Setfocus to target textbox
Me.Scanned_Frame.SetFocus '<-- Setfocus to frame which contains target textbox
End Sub
答案 0 :(得分:2)
让(最终)注意到你的两个控件都在容器框架控件内,你实际上可以使用包含列表框的Frame的Enter
事件来将焦点设置到包含文本框的Frame,而不是到文本框本身。