检查IsNumeric是否使用Me.Controls()

时间:2015-10-07 09:02:48

标签: excel-vba vba excel

我有一个带有几十个文本框的用户表单,用户只能输入1到6的数字。表单完成后,用户单击“保存”并将数字添加到Excel表格中。

由于文本框非常多,我使用以下代码来读取它们的值:

' Text boxes name are: txt_a01, txt_a02, txt_a03...
For i = 1 To 5
    ws.Cells(iRow, i).Value = Me.Controls("txt_a0" & i).Value
Next

' Here text boxes name are: txt_b01, txt_b02, txt_b03...
For i = 6 To 10
    ws.Cells(iRow, i).Value = Me.Controls("txt_b0" & i - 5).Value
Next

etc.

而不是写几十次:

ws.Cells(iRow, 1).Value = Me.txt_a01.Value
ws.Cells(iRow, 2).Value = Me.txt_a02.Value
ws.Cells(iRow, 3).Value = Me.txt_a03.Value
ws.Cells(iRow, 4).Value = Me.txt_a04.Value
ws.Cells(iRow, 5).Value = Me.txt_a05.Value

现在我想检查 - 在输入过程中 - 如果用户确实添加了一个数字,如果它在1到6之间。通常我会这样做:

Private Sub txt_a01_AfterUpdate()
    If Not IsNumeric(txt_a01.Value) Then
        MsgBox ("Only numbers accepted")
    End If
End Sub

但是当我使用FOR - LOOP和Me.Controls()来读取文本框值时,我不明白如何写下_AfterUpdate Sub。

1 个答案:

答案 0 :(得分:1)

您可以在表单加载时动态附加事件处理程序,也可以使用事件创建自定义控件。 我个人更喜欢使用自定义控件和KeyPressEventHandler来拒绝所有不允许使用的字符。

您可以创建一个类来处理事件:

Private WithEvents m_oTextBox as TextBox

Public Property Set TextBox(ByVal oTextBox as TextBox)
Set m_oTextBox = oTextBox
End Property

Private Sub m_oTextBox_Change()
' Do something
End Sub

然后,对于每个控件:

Dim myEventHandler As TextBoxEventHandler
        Set myEventHandler = New TextBoxEventHandler

        Set myEventHandler.TextBox = oControl

        m_oCollectionOfEventHandlers.Add myEventHandler