Excel VBA表单TextBox作为parameter passing

我试图将一个窗体上创build一个文本框传递给子例程来检查文本框的内容,并将文本框限制为数字数据。 由于VBA没有重载我使用可选参数来调用没有任何参数的函数作为TextBox_Exit事件的一部分,或者作为一个独立的调用与作为parameter passing的问题的文本框(我必须解决事实如果焦点转移到当前帧之外的控件,则不会抛出TextBox_Exit事件)。

我遇到的问题是当我使用这个代码:

Private Sub fLaser_Exit(ByVal Cancel As msForms.ReturnBoolean) OnlyNumbers (tbLaserCutLength) OnlyNumbers (tbPartWidth) OnlyNumbers (tbPartLength) OnlyNumbers (tbLaserBendQty) oPart.LaserCutLength = CDec(tbLaserCutLength.Value) oPart.SheetMetalWidth = CDec(tbPartWidth.Value) oPart.SheetMetalLength = CDec(tbPartLength.Value) oPart.LaserCutLength = CInt(tbLaserBendQty.Value) UpdateCosts End Sub Private Sub OnlyNumbers(Optional ByRef tb As msForms.TextBox = Nothing) On Error GoTo ErrorHandler: If (tb Is Nothing) Then Set ac = ActiveControl Do While (TypeOf ac Is msForms.Frame) Set ac = ac.ActiveControl Loop If TypeOf ac Is msForms.TextBox Then With ac If Not IsNumeric(.Value) Then .Value = 0 End If End With End If Else: With tb If Not IsNumeric(.Value) Then .Value = 0 End If End With End If ErrorHandler: End Sub 

问题是OnlyNumbers(tbLaserCutLength)调用(和随后的OnlyNumber调用。我得到一个运行时错误'424':Object required error。tbLaserCutLength是一个使用Excel VBA Form编辑器创build的TextBox。如果我不将所有parameter passing给OnlyNumbers子程序的工作和预期完全一样。

如果我在tbLaserCutLength上放置一个手表,对象浏览器就是说对象/文本框不只是一个文本框。 我怀疑问题是子程序声明中使用的msForms.TextBlocktypes。 我只尝试了TextBlock,并得到了相同的结果。 是否有另一个父类应该使用? 或者,我是否做了其他的根本错误?

删除括号!!!

OnlyNumbers (tbLaserCutLength)应该是OnlyNumbers tbLaserCutLength

用方括号强制它尝试将对象转换为一个值,然后将该值传递给子例程,但是您的子例程需要一个对象。