2014-07-07 154 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