2015-10-07 2 views
0

У меня есть пользовательская форма с десятками текстовых полей, где пользователь должен вводить только числа от 1 до 6. Когда форма будет завершена, пользователь нажимает кнопку «Сохранить», а числа добавляются в Excel Таблица.проверьте, IsNumeric использует Me.Controls()

Как текстовые поля довольно много, я использовал следующий код, чтобы прочитать их значение:

' 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.

+0

Что вы хотите, чтобы произошло, если один из них не проходит тест? Просто игнорируйте это значение или не пишите никаких значений или что-то еще? – Rory

ответ

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 
+0

Я не так хорош в VBA. Не могли бы вы привести пример? – Nicero

Смежные вопросы