el uso de clases, como la respuesta anterior sugiere, es una buena estrategia para hacer frente a muchos controles de una manera concisa y elegante, sin embargo:
1) No veo problemas para crear 25 eventos con 1 línea, llamando a una rutina privada de usuario común, a menos que la cantidad de controles sea dinámica. Es una filosofía KISS.
2) En general, considero que el evento Change es muy perturbador porque hace todos los cálculos que ingresó cada dígito. Es más sensato y moderado hacer esto utilizando la salida evento o antes de la actualización caso, porque hace que el nuevo cálculo solamente al decidir sobre un valor. Por ejemplo, el Google Instant me molesta al intentar devolver respuestas, consumiendo recursos, sin que el usuario haya definido la pregunta.
3) Hubo un problema de validación. Acepto que puede evitar las claves incorrectas con el evento Modificar; sin embargo, si necesita validar los datos, no puede saber si el usuario continuará escribiendo o si los datos están listos para su validación.
4) Usted debe recordar que Cambio o salida eventos no obliga al usuario a pasar en los campos de texto, por lo que necesita el sistema de volver a validar y volver a calcular cuando se trata de salir del formulario sin cancelar.
El siguiente código es simple pero eficaz para las formas estáticas.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call AutoCalc(Cancel)
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call AutoCalc(Cancel)
End Sub
.....
Private Sub TextBox25_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call AutoCalc(Cancel)
End Sub
Private Function Valid
.....
End Function
Private Sub AutoCalc(Canc As Variant)
If Not Valid() Then Canc=True
' Calculation
End Sub
Es que son adictos a ahorrar tiempo, puede crear una rutina genérica VBA con el fin de generar el código para los eventos relacionados con los controles en una forma que encaja una máscara. Este código puede estar en una hoja de borrador (es más seguro generar código directamente, que tiene errores en algunas versiones de Excel) y copiar y pegar en un módulo de formulario.
Sub GenerateEvent(Form As String, Mask As String, _
Evento As String, Code As String)
' Form - Form name in active workbook
' Mark - String piece inside control name
' Evento - Event name to form procedure name
' Code - Code line inside event
Dim F As Object
Dim I As Integer
Dim L As Long
Dim R As Range
Dim Off As Long
Set F = ThisWorkbook.VBProject.VBComponents(Form)
Set R = ActiveCell ' Destination code
Off = 0
For I = 0 To F.Designer.Controls.Count - 1
If F.Designer.Controls(I).Name Like "*" & Mask & "*" Then
R.Offset(Off, 0) = "Private Sub " & _
F.Designer.Controls(I).Name & "_" & Evento & "()"
R.Offset(Off + 1, 0) = " " & Code
R.Offset(Off + 2, 0) = "End Sub"
Off = Off + 4
End If
Next I
End Sub
Sub Test()
Call GenerateEvent("FServCons", "tDt", "Exit", _
"Call AtuaCalc(Cancel)")
End Sub
Hola, ¿cuál es la necesidad de crear tbCollection? ¿Qué hace? – Ashok
La colección se usa para almacenar y conservar los objetos de cuadro de texto creados. –