Rellenar con ceros un capo
Antes de nada agradecer vuestra ayuda, me gustaría saber si es posible que a la hora de introducir una cuenta contable en un campo de un formulario de Access no sea necesario introducir todos los caracteres; las cuentas se separan por un punto o una coma y la aplicación rellena con ceros los dígitos que faltan. Ejemplo que al escribir 4.25 el campo se rellene a 9 dígitos 400000025.
1 respuesta

Existen muchas formas, yo crearía una función pública para esto, algo como: (En un módulo inserte esta función)
Public Function strRellena(dblnro As Variant) As String
strRellena = Left(dblnro, 1) & Format(Mid(dblnro, 3, 2), "00000000")
End Function
Y la llama así:
StrRellena(parámetro) donde parámetro es el contenido del campo:
Ej. StrRellena(4.25) retorna 400000025 (texto).
NOTA: El parámetro lo defino como Variant porque no sé si el valor es numérico o texto.

Si quiere una función más completa de tal forma que también pase como parámetro el número de ceros, esta le sirve:
Public Function strRellena2(dblnro As Variant, Optional intCeros As Integer) As String
'Rellena con ceros
If intCeros = 0 Then
strRellena2 = dblnro
Else
strRellena2 = Left(dblnro, 1) & Format(Mid(dblnro, 3, 2), String(intCeros, "0"))
End If
End Function
Sintaxis de llamada:
strRellena2(número,cantidad_de_ceros)
Ejemplo:
StrRellena2(4.25,4) ---- retorna ---- 40025
StrRellena2(4.25,5) ---- retorna ---- 400025
StrRellena2(4.25,6) ---- retorna ---- 4000025
StrRellena2(4.25,7) ---- retorna ---- 40000025
StrRellena2(4.25,8) ---- retorna ---- 400000025
StrRellena2(4.25,10) ---- retorna ---- 40000000025

Gracias Eduardo de nuevo por el aporte, pero he notado que solo funciona cuando escribo un solo dígito antes del punto y dos dígitos después del punto, pero en realidad pueden ser varios los dígitos antes y después, ejemplo:
4.25 400000025
41.25 410000025
41.125 410000125
401.5 401000005
405.2564 405002564
lo único seguro es que pueden ser hasta cuatro dígitos antes del punto y hasta cuatro dígitos después del punto.

Pruebe con esta función:
Public Function strRellena3(dblnro As Variant, Optional intCeros As Integer) As String
'Rellena con ceros hasta completar 9 digitos
Dim posicion As Integer
posicion = InStr(1, dblnro, ".")
If intCeros = 0 Then
strRellena3 = dblnro
Else
strRellena3 = Left(dblnro, posicion - 1) & _
Format(Mid(dblnro, posicion + 1, Len(dblnro - posicion)), String(intCeros - posicion + 1, "0"))
End If
End Function
Ejemplos de llamada:
StrRellena3("405.2564", 9) ---> Retorna 405002564 Observe que se debe pasar es una cadena de caracteres
StrRellena3(Str(405.2564), 9) ---> Retorna 405002564 Observe que se si es un número se debe pasar convertido a cadena. Esto debido a la configuración regional.

Debido a que encontré inconsistencias cuando se pasaba el parámetro y este lleva coma (,) en lugar de punto (.) Cambia algunas cosas, esta es la nueva función.
Public Function llena_ceros(dblnro As Variant, Optional intCeros As Integer) As String
'Función para rellenar con ceros después del punto(.) O coma (,) hasta 9 dígitos
'dejando la parte numérica al final, pero anteponiendole ceros.
'Elaborado por: Eduardo Pérez Fernández
'Fecha: 23/12/2020 - Colombia
'El parámetro puede ser: texto o número
' texto ejemplo "41.25" o "41,25"
' numérico ejemplo 41.25
' Ejemplos de llamada:
' Parámetro texto con punto llena_ceros("41.2564", 9) --> Retorna 410002564
' Parámetro número con punto llena_ceros(41.2564,9) --> Retorna 410002564
' Parámetro texto con coma llena_ceros("41,2564", 9) --> Retorna 410002564
' Parámetro texto con punto llena_ceros("41624.25", 9) --> Retorna 416240025
' Parámetro texto con coma llena_ceros("41624,25", 9) --> Retorna 416240025
' Parámetro número con punto llena_ceros(41624.25,9) --> Retorna 416240025
Dim posicion As Integer
Dim encuentra As Integer
'Determino el parámetro se pasó con un punto o una coma
'si se pasó un coma (,)
encuentra = InStrRev(dblnro, ",")
If encuentra > 0 Then ' hay decimal y es una coma (,)
' remplazo por un punto (.)
dblnro = Replace(dblnro, ",", ".", 1)
End If
posicion = InStr(1, dblnro, ".")
If intCeros = 0 Then
llena_ceros = dblnro
Else
llena_ceros = Left(dblnro, posicion - 1) & _
Format(Mid(dblnro, posicion + 1, Len(dblnro - posicion)), String(intCeros - posicion + 1, "0"))
End If
End Function
Espero le sirva, si alguien la puede mejorar le agradezco hacerlo saber.

Buenos días Eduardo, de nuevo darte las gracias por dedicarme tu tiempo. Me da un error cuando abro el formulario, el campo es un cuadro de texto llamado CUENTA que no pertenece a ninguna tabla, es donde introduzco el numero de cuenta para posteriormente abrir un formulario basado en el campo de resultado con los ceros añadidos, pero me da el siguiente error
Al no tener ningún valor el campo CUENTA aparece el error y si le quito al campo Texto2 el valor de =llena_ceros([cuenta]) u omito el error, en el campo Texto3 le he definido que después de actualizar el Campo CUENTA que me realice el siguiente evento
Private Sub CUENTA_AfterUpdate()
Me.Texto3 = llena_ceros([cuenta])
End Sub
lo que hace es que me devuelve el valor del campo CUENTA igual solo cambiando la coma por el punto pero no añade los ceros
por favor dime que hago mal, mil gracias de nuevo.

El parámetro dblnro es obligatorio. Si puede envíeme la base de datos o el formulario a [email protected] y lo reviso.

Eduardo, en un formulario que no esta basado en ninguna tabla, creo un campo de texto donde introduzco el numero de cuenta y necesito que en otro campo de texto que tampoco esta basado en ninguna tabla me de el resultado de añadir los ceros, perdona mi torpeza tampoco estoy muy ducho en esto, por eso te agradecería que indicases lo mas sencillo posible el procedimiento, de verdad que te agradezco muchísimo tu ayuda.

No puede hacer en el otro campo "Origen de datos"=llena_ceros(campo;9) por que le arroja el error, debe llamar la función es en el evento Después de Actualizar del primer cuadro de texto, algo como:
Private Sub ctlcuenta_AfterUpdate()
Me.ctlrelleno = llena_ceros(Me.ctlcuenta, 9)
End Sub
En donde ctlcuenta es el cuadro de texto donde digita el número de la cuenta y ctlreleeno es el cuadro de texto que recibe la cuenta con ceros. Mire la imagen.
Y da lo mismo si dígito 42.24 con punto.
- Compartir respuesta
