我有一个包含3帧的用户形式,其中全部包含几个文本框。我希望能够在框架上标记文本框。
所以,类似的东西:frame1 -textbox1> frame2 -textbox1> frame3 -textbox1> frame1 -textbox2> frame1- frame1 -textbox3> frame2 -textbox2
根据所需的访问器,将文本框动态添加并存储在数组中,因此所需的顺序很容易获得。我只是找不到一种应用方法。
当然可以更改框架布局。但是,框架既用于控制文本框的放置,也可以在文本框超过框架区域的情况下添加单独的滚动条。
有可能吗?任何帮助或建议都非常感谢。
编辑:添加了3帧的图片帧
edit2:我认为Destination Datas评论使我走上正确的轨道。
我创建了一个类模块
Public WithEvents TxtBox1 As MSForms.TextBox
Private Sub TxtBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox ("Test")
End Sub
Private Sub TxtBox1_change()
MsgBox ("Test")
End Sub
,然后在生成文本框的子中,对于我想跳下框架的文本框:
Dim tabArray1() As New TabBox1
Dim inputfelt As MSForms.TextBox
Set inputfelt = Hovedvindu.SkjemaFrame.SenderFrame.Controls.Add("Forms.TextBox.1", "M" & i & "SenderNavn", True)
Set tabArray1(i).TxtBox1 = inputfelt
这将所有正确的文本框添加到数组中,以便我可以进行更改焦点的退出事件,我认为这不应该太困难。但是,我似乎无法使事件正确开火。当我用子用户更改文本框时,更改事件似乎可以正常工作,例如,当我测试通过循环并更改数组中的文本框的文本,将正确的文本框添加到数组中时。但是,当我手动更改文本框时,什么也不会发生。退出事件似乎根本不起作用。
我对事件处理的经验不太经验,所以我可能错过了一些东西。
我找到了一个可接受的解决方案。一旦我将tabarray()的定义移动到子之外,因此原始帖子的编辑2中描述的方法起作用,以便在潜艇结束后跟踪文本框。
我有一个数组,以及3个帧中每个框架上的"端"文本框的一个类模块。类模块在选项卡上跟踪键盘。这3类模块是相同的,只是它们存储了文本框的TabIndex,从焦点跳到用户形式的3个不同隐藏标签中的另一个帧。跟踪Tabindex可以让我知道当焦点返回框架时从哪里开始。
3类模块看起来像这样:
Public WithEvents TxtBox1 As MSForms.TextBox
Private Sub TxtBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = vbKeyTab Then
'store tabindex
Hovedvindu.Controls("SisteTab1").Caption =
Hovedvindu.SkjemaFrame.SenderFrame.ActiveControl.TabIndex
'call sub that moves the focus
flyttfokus (1)
End If
End Sub
移动焦点的子量如下所示。输入只是一个整数(1,2或3),具体取决于呼叫来自哪个类模块,从而从/到哪个帧。该子读取3个隐藏标签,以了解将焦点移至新帧时始于哪个文本框。在最后一个情况下,错误处理的是何时从3D帧中的最后一个文本框移动焦点时。这将尝试将焦点移至第一帧中不存在的文本框,这将丢弃一个可以忽略的错误。
Sub flyttfokus(SisteFrame As Integer)
Dim St1 As Integer
Dim St2 As Integer
Dim St3 As Integer
St1 = CInt(Hovedvindu.Controls("SisteTab1").Caption)
St2 = CInt(Hovedvindu.Controls("SisteTab2").Caption)
St3 = CInt(Hovedvindu.Controls("SisteTab3").Caption)
Select Case SisteFrame
Case 1
Hovedvindu.SkjemaFrame.MottakerFrame.Controls(St2 + 1).SetFocus
Case 2
Hovedvindu.SkjemaFrame.InfoFrame.Controls(St3 + 1).SetFocus
Case 3
On Error Resume Next
Hovedvindu.SkjemaFrame.SenderFrame.Controls(St1 + 1).SetFocus
On Error GoTo 0
End Select
End Sub
从第一个文本框开始时,此解决方案将根据需要工作。但是,如果用户在第二行上的文本框,然后开始选项卡,当焦点在帧之间移动时,焦点将移回第一行。这是因为在框架接收到焦点时,将Tabindex跟踪的变量(标签)仅在用户选项卡通过表格时更新。根据程序生成的文本框数量,可能可以将MousClick上的这些变量更新为文本框。就我的目的而言,这是不需要的。