Unificar código en un Modulo para VBA Excel

Tengo este código en 4 textBox

'Solo numeros, guion y cantidad caracteres. Puede separarse uno del otro

Private Sub txtcli6_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
 KeyAscii = 0 '<--- El KeyAscii = 0 es para borrar la tecla presionada equivocadamente MsgBox "Ingrese SOLO números, en el campo, el guion entra automático", vbOKOnly + vbInformation, Title:="CARÁCTER NULO"
End If
 If Len(Me.txtcli6) = 12 Then KeyAscii = 0
 If Len(Me.txtcli6) = 12 Then MsgBox "LLego al máximo posible de caracteres": Exit Sub
 'Para Guion
 Select Case Len(txtcli6)
 Case 4
 txtcli6.Text = txtcli6.Text & "-"
 End Select
 End Sub

Solo cambia el numero del TextBox; Ej. Txtcli6 y 8, y txtmoc6 y 7

Quisiera meterlo en un modulo normal y desde ahí llamar el código, Ej

Sub Numero_caracter()

'''código

End Sub

En código del formulario en cada uno de los 4 control

Private Sub txtcli6_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

'llamarlo con

Call Numero_caracter

End Sub

Esto con la finalidad de no repetir el mismo (casi) código para los 4 controles y así aliviar el peso del libro

1 Respuesta

Respuesta
1

Pon el siguiente código en el formulario:

Dim colTbxs As Collection 'Collection Of Custom Textboxes
Private Sub UserForm_Initialize()
    Dim ctlLoop As MSForms.Control
    Dim clsObject As Clase1
     'Create New Collection To Store Custom Textboxes
    Set colTbxs = New Collection
     'Loop Through Controls On Userform
    For Each ctlLoop In Me.Controls
         'Check If Control Is A Textbox
        Select Case ctlLoop.Name
            Case "txtcli6", "txtcli8", "txtmoc6", "txtmoc7"
                 'Create A New Instance Of The Event Handler CLass
                Set clsObject = New Clase1
                 'Set The New Instance To Handle The Events Of Our Textbox
                Set clsObject.tbxCustom1 = ctlLoop
                 'Add The Event Handler To Our Collection
                colTbxs.Add clsObject
        End Select
    Next ctlLoop
End Sub
Private Sub UserForm_Terminate()
     'Destroy The Collection To Free Memory
    Set colTbxs = Nothing
End Sub

Ahora crea una clase, en VBa, insertar / Módulo de clase, revisa que la clase se llame "Clase1"

Inserta el siguiente código en la clase

Public WithEvents tbxCustom1 As MSForms.TextBox 'Custom Textbox
'Referencia
'http://www.ozgrid.com/forum/showthread.php?t=80631
Private Sub tbxCustom1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
        KeyAscii = 0 '<--- El KeyAscii = 0 es para borrar la tecla presionada equivocadamente
        MsgBox "Ingrese SOLO números, en el campo, el guion entra automático", vbInformation, "CARÁCTER NULO"
    End If
    'Para Guion
    Select Case Len(tbxCustom1)
        Case 4: tbxCustom1.Text = tbxCustom1.Text & "-"
        Case 12: KeyAscii = 0: MsgBox "LLego al máximo posible de caracteres": Exit Sub
    End Select
End Sub
Private Sub Class_Terminate()
     'Destroy The Class Object And Free Up Memory
    Set tbxCustom1 = Nothing
End Sub

Saludos. Dante Amor

Hola DAM, ¿como te ha ido?

Los formularios son 2 (error no mencionarlo antes) Los 4 controles mencionados en la abertura del tema, son 2 TextBox en cada form

El código lo coloco en cada formulario, ¿Cierto?

Se podría hacer de forma a usar un solo código sin tener que repetirlo en otro form?

Gracias DAM

¿Cómo te trata la vida?

Lo que te dije que va en el formulario, si lo tienes que poner en cada formulario, eso es para cargar los textbox.

En un formulario po esta línea

Case "txtcli6", "txtcli8"

Y en el otro formulario va esta línea

Case "txtmoc6", "txtmoc7"

Y solamente crearías una clase, la cual funcionaría para los 4 textbox.

Muy bien DAM, resuelto, Gracias

CUanto a mi, he estado un tanto dañado de salud, los pies me adormeció el talón del izquierdo y el derecho anda que anda

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas