2014-07-07 152 views
0

我正在为具有多个文本框的表单创建一个commmon验证子例程。 对于每个文本框的我有触发以下的退出事件:Excel VBA错误13类型在Me.ActiveControl中不匹配

Private Sub formatoNumerico(Optional ByVal Cancel As MSForms.ReturnBoolean) 
    Dim tb As MSForms.TextBox 
    Set tb = Me.ActiveControl 

    ' Do something 

这是对码的第三线,为什么产生错误13类型不匹配?

在此先感谢您的帮助!

+1

当ActiveControl不是一个TextBox时,它被调用,添加'MsgBox TypeName(Me.ActiveControl)'作为第一行,看看主动控件是什么 –

+0

我得到MultiPage(因为文本框在一个) –

回答

2

选项卡主机控件是一个容器,因此它优先于其组成部分。

最简单的事情是通过文本框来formatoNumerico否则你将需要通过询问当前选项卡的ActiveControl识别文本框:

Private Sub formatoNumerico(Optional ByVal Cancel As MSForms.ReturnBoolean) 
    Dim tb As MSForms.TextBox 

    If Not (Me.ActiveControl Is Nothing) Then 
    If TypeOf Me.ActiveControl Is MultiPage Then 
     Set tb = Me.ActiveControl.Pages(Me.ActiveControl.Value).ActiveControl 
    Else 
     Set tb = Me.ActiveControl 
    End If 

    Debug.Print tb.Name 
    End If 

End Sub 

还要注意的是不同的选项卡控件之间切换不会提高_Exit

+0

宾果!这就是它。 –

1

当您退出时,Textbox不再是活动控件,因此,当您尝试为当前控件(可能是也可能不是该文本框)设置文本框类型变量时,会导致此错误。

您将需要修改代码以明确引用您想要修改的TextBox控件。你也许可以在初始化表单时使用一些全局变量来引用它,然后在代码中使用该引用。

+0

我想避免乘以变量的数量(在这种情况下是文本框),因为这种形式有很多。是否可以将由退出事件触发的文本框的引用传递给此通用过程? –

+0

我不确定你的使用场景,但也许'AfterUpdate'或'BeforeUpdate'可能更适合你的目的。谷歌这两个,你会发现MSDN的参考和相同的例子。 – hnk