Primero quiero comentarte un par de cosas: Los "TextBox" como lo dice su nombre (en inglés), son cajas de texto, por lo tanto todo lo que hay en ellos para el VBA es texto y, cuando de número se trata y más aún cuando de operaciones aritméticas se trata, hay que tratarlo con relativo "cuidado". Lo del separador de decimales y miles, es otro cantar, ya que el VBA, como buen hijo de EE. UU., considera los "US Centric", así que yo, por si acaso, uso mucho el "Format" y el "Cdbl" en el ejemplo.
Ahora, este ejemplo es solo tomando en cuenta tus TextBox16, TextBox17, TextBox18, TextBox19 y TextBox20, entonces, primero borra TODOS los eventos asociados a ellos. Lo otro es que yo prefiero usar el evento, en casos como este, "KeyDown" para que al presionar "Enter" ocurra lo que necesites. Sé que algunas personas les gusta, hasta para estas cosas, el evento "change" pero te aseguro que podrá darte "sorpresas" y gasta "algo" más de memoria (insisto, para estos casos).
Entonces, prueba solo así:
Private Sub TextBox16_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim Buscador As Variant
Dim Ubicacion As String
Dim Valor As Double
If KeyCode <> vbKeyReturn Then
Exit Sub
End If
With Sheets("Hoja2").Range("B2:B41")
Set Buscador = .Find(TextBox16)
If Buscador Is Nothing Then
MsgBox "No existe"
Exit Sub
Else
Let Ubicacion = Buscador.Address
MsgBox Ubicacion
TextBox17 = Sheets("Hoja2").Range(Ubicacion).Offset(0, 1)
Valor = Sheets("Hoja2").Range(Ubicacion).Offset(0, 2)
TextBox18 = Format(CDbl(Valor), "#,##0.00")
End If
End With
End Sub
Private Sub TextBox19_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim Valor As Double, Valor2 As Double, Total As Double
If KeyCode = vbKeyReturn Then
Let Valor = CDbl(TextBox18)
Let Valor2 = CDbl(TextBox19)
Let Total = CDbl(Valor * Valor)
TextBox20 = Format(CDbl(Total), "#,##0.00")
End If
End Sub
Así, solo dos eventos. Ah, declararía las variables como del módulo, pero bueno, dado que es ejemplo las dejo ahí.
Comentas
Abraham Valencia