Formato "Moneda" en TextBox y celda con Excel 2013

Hay mucho escrito sobre el tema, aquí en TodoExpertos o en Google, pero aún así, no logré solucionar el inconveniente y seguro hay algo que estoy haciendo mal y no lo puedo ver.

Se trata de los importes que se insertan en el textbox y cuando vuelven a la celda de excel, vuelven en modo

Texto.

Si no le doy formato al contenido de los textbox no hay problema, vuelven a excel como número o moneda, pero en cuanto le doy formato (para el ejemplo está el Textbox1 del siguiente código), vuelve a excel en modo texto:

Aquí el código:

Option Explicit

Private Sub CommandButton1_Click()

Dim cien, cincuenta, veinte, diez, cinco, dos, monedas As Currency
On Error Resume Next
cien = TextBox1
cincuenta = TextBox2
veinte = TextBox3
diez = TextBox4
cinco = TextBox5
dos = TextBox6
monedas = TextBox7

'On Error Resume Next

Cells(2, 2) = cien
Cells(3, 2) = cincuenta
Cells(4, 2) = veinte
Cells(5, 2) = diez
Cells(6, 2) = cinco
Cells(7, 2) = dos
Cells(8, 2) = monedas
Unload UserForm1

End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1 = Format(Val(TextBox1.Value), " $ #,##0.00")
' TextBox1 = FormatCurrency(TextBox1, 2)
End Sub

Private Sub TextBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox7 = Format(Val(TextBox7.Value), "##.00")
End Sub

1 respuesta

Respuesta
1

Te explico un poco lo que está pasando.

Cuando le aplicas el formato al texbox, entonces el dato que tienes en el texbox ya no puede ser reconocido como un valor, es decir, si pones un "5" y conviertes ese 5 a valor el resultado es un 5, pero si tienes un "5" y le aplicas el formato "$ 5", lo que tienes es un texto, si quieres convertir esto "$ 5" a valor, posiblemente te regrese un 0 o un error.

Lo que te estoy enviando es una función, para que antes de pasar el texto "$ 5" a la celda, convierta ese texto a un valor 5.

El código completo de tu formulario quedaría así:

Private Sub CommandButton1_Click()
'Mod.Por.DAM
    Cells(2, 2) = valor(TextBox1)
    Cells(3, 2) = valor(TextBox2)
    Cells(4, 2) = valor(TextBox3)
    Cells(5, 2) = valor(TextBox4)
    Cells(6, 2) = valor(TextBox5)
    Cells(7, 2) = valor(TextBox6)
    Cells(8, 2) = valor(TextBox7)
    Unload UserForm1
End Sub
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'Mod.Por.DAM
    TextBox1 = Format(Val(valor(TextBox1)), " $ #,##0.00")
End Sub
Private Sub TextBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    TextBox7 = Format(Val(valor(TextBox7)), "##.00")
End Sub
Function valor(v)
'Por.Dante Amor
    v = Replace(v, " ", "")
    v = Replace(v, "$", "")
    valor = Val(v)
End Function

Quité algunas líneas que no son necesarias.

Revisa cómo en este evento: 

   Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

También estoy utilizando la función "valor": 

   TextBox1 = Format(Val(valor(TextBox1)), " $ #,##0.00")

De esta forma cuando entres a modificar el texto, nuevamente te ponga el formato.

Prueba y me comentas.

Pasé por alto el separador de millares, si utilizas el punto como separador de millares, ej: 5.000.000,00, entonces la función de la macro debe quedar así:

Function valor(v)
'Por.Dante Amor
    v = Replace(v, " ", "")
    v = Replace(v, "$", "")
    v = Replace(v, ".", "")
    valor = Val(v)
End Function

Si por el contrario, utilizas la coma como separador de millares, ej: 5,000,000.00, entonces la función en la macro es así:

Function valor(v)
'Por.Dante Amor
    v = Replace(v, " ", "")
    v = Replace(v, "$", "")
    v = Replace(v, ",", "")
    valor = Val(v)
End Function

Saludos.Dante Amor

Recuerda valorar la respuesta.

Estimado Dante, tu propuesta funciona muy bien, sólo que me encontré ahora con otro problema, es que en el TextBox7, donde van las monedas, los centavos (ej. $ 22,60) no aparecen. Seguidamente te muestro el código adaptado; podrías ayudarme en esto?

Gracias otra vez !!!!

Private Sub CommandButton1_Click()

Dim cien, cincuenta, veinte, diez, cinco, dos, monedas As Currency
On Error Resume Next
cien = valor(TextBox1)
cincuenta = valor(TextBox2)
veinte = valor(TextBox3)
diez = valor(TextBox4)
cinco = valor(TextBox5)
dos = valor(TextBox6)
monedas = valor(TextBox7)

'On Error Resume Next

Cells(2, 2) = cien
Cells(3, 2) = cincuenta
Cells(4, 2) = veinte
Cells(5, 2) = diez
Cells(6, 2) = cinco
Cells(7, 2) = dos
Cells(8, 2) = monedas
Unload UserForm1

End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1 = Format(Val(valor(TextBox1.Value)), " $ #,##0.00")
End Sub

Private Sub TextBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox7 = Replace(TextBox7, ".", ",")
TextBox7 = Format(Val(valor(TextBox7.Value)), " $ #,##0.00")
End Sub

Function valor(v)
v = Replace(v, " ", "")
v = Replace(v, "$", "")
v = Replace(v, ".", "")
valor = Val(v)
End Function

No es necesario que pongas el textbox en una variable y luego pases la variable a la celda.

Como los centavos no tienen formato de moneda, solamente tienes esto "##.00", entonces no es necesario pararlo por la función "valor".

Debería quedar directo:

Cells(8, 2) = Val(TextBox7)

y

TextBox7 = Format(Val(TextBox7), "##.00")

Private Sub CommandButton1_Click()
'Mod.Por.DAM
    Cells(2, 2) = valor(TextBox1)
    Cells(3, 2) = valor(TextBox2)
    Cells(4, 2) = valor(TextBox3)
    Cells(5, 2) = valor(TextBox4)
    Cells(6, 2) = valor(TextBox5)
    Cells(7, 2) = valor(TextBox6)
    Cells(8, 2) = Val(TextBox7)
    Unload UserForm1
End Sub
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'Mod.Por.DAM
    TextBox1 = Format(Val(valor(TextBox1)), " $ #,##0.00")
End Sub
Private Sub TextBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    TextBox7 = Format(Val(TextBox7), "##.00")
End Sub
Function valor(v)
'Por.Dante Amor
    v = Replace(v, " ", "")
    v = Replace(v, "$", "")
    v = Replace(v, ",", "")
    valor = Val(v)
End Function

Saludos.Dante Amor

Entre más simple sea el código más eficiente y comprensible será.

No olvides valorar la respuesta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas