Cuándo usar un módulo o un userform o módulo de clase o cuándo poner el código en los eventos de la hoja. La experiencia es la que te va a indicar en dónde es la mejor opción.
----
Te agrego unos comentarios:
Si estás trabajando en un userform y el código es muy extenso, entonces puedes pasar algunos códigos a un módulo.
Si el código del userform lo utilizas en varios lugares, entonces puedes pasar algunos códigos a un módulo.
Ejemplo:
Actualmente tienes esto en el userform:
Option Explicit
Dim a As Variant 'Al inicio del código
Sub FilterData()
Dim txt1 As String
Dim i As Long, j As Long, k As Long
'
ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
listcargaproductos.Clear
For i = 1 To UBound(a, 1) 'linea que mellega al ultimo registro
If txtbuscapro.Value = "" Then txt1 = a(i, 1) Else txt1 = txtbuscapro.Value
If LCase(a(i, 2)) Like "*" & LCase(txt1) & "*" Then 'linea que me lleva a la columna requerida
j = j + 1
For k = 1 To UBound(a, 2)
b(j, k) = a(i, k)
If k = 5 Or k = 6 Then
b(j, k) = Format(b(j, k), "$ #,##0.00")
End If
Next
End If
Next i
If j > 0 Then listcargaproductos.List = b
End Sub
Private Sub txtbuscapro_Change()
Call FilterData
End Sub
Puedes cambiarlo a esto en el userform:
Option Explicit
Private Sub txtbuscapro_Change()
Call FilterData
End Sub
Private Sub txtprecio1_Change()
txtprecio1 = Format(txtprecio1, "$#")
If Not IsNumeric(txtprecio1.Text) And _
txtprecio1.Text <> "" Then
Beep
MsgBox "El dato Precio es Numerico"
txtprecio1.Text = ""
txtprecio1.SetFocus
End If
End Sub
Y esto en un módulo:
Option Explicit
Public a
Sub FilterData()
Dim txt1 As String
Dim i As Long, j As Long, k As Long
'
ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
With frmproductos
.listcargaproductos.Clear
For i = 1 To UBound(a, 1) 'linea que mellega al ultimo registro
If .txtbuscapro.Value = "" Then txt1 = a(i, 1) Else txt1 = .txtbuscapro.Value
If LCase(a(i, 2)) Like "*" & LCase(txt1) & "*" Then 'linea que me lleva a la columna requerida
j = j + 1
For k = 1 To UBound(a, 2)
b(j, k) = a(i, k)
If k = 5 Or k = 6 Then
b(j, k) = Format(b(j, k), "$ #,##0.00")
End If
Next
End If
Next i
If j > 0 Then .listcargaproductos.List = b
End With
End Sub
Cuando trabajas cualquier macro va en un módulo.
Hay botones, como los de controlactiveX que el código va en la hoja.
Los objetos en excel pertenecen a una Clase, por ejemplo un textbox pertenece a una Clase (internamente en vba-excel), en esa clase están indicadas las propiedades y métodos que puedes utilizar con el textbox.
Pero también puedes crear una clase, esta clase se crea en un módulo de clase, donde puedes indicar los métodos y las propiedades que tú desees.
Aquí unos ejemplos de una clase:
Evento Change para cualquier TextBox en un formulario.
Colocar solo números en textbox
Hacer que solo se puedan poner números en muchos textbox