2017-02-23 30 views
0

我試圖將表單上創建的文本框傳遞給子例程,以檢查文本框的內容並將文本框限制爲數字數據。由於VBA沒有重載,我使用可選參數來調用沒有任何參數的函數作爲TextBox_Exit事件的一部分,或者作爲一個獨立的調用,並將問題中的textBox作爲參數傳遞(我不得不解決事實如果焦點轉移到當前幀之外的控件,則不會拋出TextBox_Exit事件)。作爲參數傳遞的Excel VBA表單TextBox

我遇到的問題是,當我使用此代碼:

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編輯器創建的文本框如果我沒有將任何參數傳遞給OnlyNumbers,子程序的工作原理與預期的完全一致

如果我在tbLaserCutLength上放置對象瀏覽器是說對象/ TextBox不只是一個TextBox。我懷疑問題是在子例程中使用msForms.TextBlock類型 宣言。我試過了TextBlock,並得到了相同的結果。我應該使用另一個父類嗎?或者,我正在做其他一些根本錯誤的事情嗎?

回答

1

刪除括號!!!

OnlyNumbers (tbLaserCutLength)應該是OnlyNumbers tbLaserCutLength

使用方括號強制它嘗試將對象轉換爲值,然後將該值傳遞給子例程,但是您的子例程需要一個對象。

+0

@AlanH - 如果您在不同版本的Visual Basic之間切換,它會變得更加困難 - 這麼多的相似之處幾乎沒有什麼區別,它們真的會把你推上牆。 – YowE3K