23 octubre, 2021

AÑADIR CEROS A LA IZQUIERDA EN VBA

Hoy escribiré una entrada corta y sobre en una pregunta que me trasladaba la semana pasada un lector. Se trata de añadir ceros a la izquierda cuando necesitamos rellenar «x» posiciones en una base de datos.

Esto ya lo expliqué con fórmulas en la siguiente entrada: Añadir ceros a la izquierda, pero la consulta incidía en la necesidad de pasar la fórmula a código dado que la quería implementar en un proceso. Después de varios correos, finalmente me comentó que el dato sobre el que necesitaba añadir los ceros sería el número de documento de identidad (dni) y que estaba realizando pruebas.

Teniendo en cuenta esto, finalmente elaboré un pequeño programa que genera números de dni de forma aleatoria y luego le añade los ceros hasta completar 15 posiciones.

Sub GenerarDni()
Dim j As Double
'Limpiamos datos de hoja1 menos los encabezados
Worksheets(1).Range("A2:B65000") = Empty
'Contamos las celdas en blanco hasta el rango que nos interesa, "A31"
Fin = WorksheetFunction.CountBlank(Worksheets(1).Range("a2:A31"))
For j = 2 To Fin
'Generamos un número aleatorio entre 1 y 8 cifras
NUMERO = WorksheetFunction.RandBetween(1, 99999999)
'Generamos letras (mayúsculas) de forma aleatorio con la función carácter (Chr)
LETRA = Chr(WorksheetFunction.RandBetween(65, 90))
'Concatenamos el número y la letra
Sheets(1).Cells(j, 1) = NUMERO & LETRA
Next
End Sub

Con esta macro podremos generar fácilmente números aleatorios de DNI que nos resultarán muy útiles para realizar pruebas con nuestras bases de datos. A continuación debemos añadir los ceros a la izquierda, para ello tendremos que echar mano de la siguiente macro:

Sub CeroIzq()
Dim i As Double
With Sheets(1)
Final = Application.CountA(.Range("A:A"))
For i = 2 To Final
'aplicamos formato texto a las celdas seleccionadas
.Cells(i, 2).NumberFormat = "@"
'Con esta función añadimos tantos ceros como sean necesarios
'hasta completar una longitud de 15 posiciones
.Cells(i, 2) = WorksheetFunction.Rept("0", 15 - Len(.Cells(i, 1))) & .Cells(i, 1)
Next
End With
End Sub

La función es simple, repetimos el «0» 15 veces menos (-)  el largo actual del texto a rellenar, de forma que siempre controlaremos la longitud de los ceros en relación a los datos. Así queda la información, al pulsar el botón genera 30 dni y añade los ceros.

CEROS A LA IZQUIERDA EN VBA

Para no tener que ejecutar cada macro con un botón, podemos ejecutar las dos añadiendo en la primera macro una llamada a la segunda, llamando a la macro, literalmente: Call CeroIzq (os lo dejo así en el archivo).

Descarga el archivo de ejemplo pulsando en: CEROS A LA IZQUIERDA EN VBA

 

Comparte este post

9 comentario en “AÑADIR CEROS A LA IZQUIERDA EN VBA

  1. NO Funciona ci las celdas de encima no tienen números ejemplo si ubico los números a rrellenar con ceros en la FILA F:10 COLUMNA 6 )NO funciona, Deben estar las celdas (F1:F9) , con valores.

    1. Hola Juan:

      Es lógico que no funcione, el ejemplo en el que estás intentando agregar ceros a la izquierda funciona en un loop que va recorriendo una fila a la que previamente hemos asignado una cantidad de items (por lo que deben existir valores previamente). Si quieres que te funcione directamente como una función más debes eliminar el loop y hacer referencia a la celda en la que se encuentra el valor: es decir sustituir el valor de la i por el número de la fila en la que se encuentra el valor).

      With Sheets(1)
      .Cells(fila de tu valor, 2) = WorksheetFunction.Rept("0", 15 - Len(.Cells(fila de tu valor, 1))) & .Cells(fila de tu valor, 1)
      End with

      De todas formas si esto es complejo, puedes visitar este post donde lo realizo con funciones en la hoja:

      https://excelsignum.com/2013/12/14/anadir-ceros-a-la-izquierda-en-excel/

      Saludos.

    1. Hoja Andrés:

      Pues puedes eliminarlos o bien, si la cadena contiene solo números, multiplicando por 1 o bien si es alfanumérica, utilizando la función extrae().

      Saludos

    1. Hola Andrés:

      Con esta función añades un cero según el caracter que indiques. EN este caso es la letra A.

      Copia la función en la hoja y aplícalo a una cadena de texto o alfanumérica y realizará lo que estás preguntando.

      Saludos.

      Public Function AÑADE_0(Micelda As String)
      With Sheets(1)
      Dim i As Double, j As Double
      Dim letr As String
      'lo que vamos a hacer es realizar un bucle for next dentro de la celda,
      'de forma que vaya acumulando los valores NO numéricos en la variable "letr"
      For i = Len(Micelda) To 1 Step -1
      If Mid(Micelda, i, 1) = "A" Then
      D = 0
      End If
      letr = Mid(Micelda, i, 1) & D & letr
      D = vbNullString
      Next i
      AÑADE_0 = (letr)
      End With
      End Function

      Sub extrae_letr()
      'Realizamos otro bucle for next para recorrer todas las fichas llamando a la función "Letras"
      'de forma que extraiga las letras hasta el final
      Dim c As Double
      With Sheets(1)
      fin = Application.CountA(.Range("A:A"))
      For c = 2 To fin
      .Cells(c, 3) = AÑADE_0(.Cells(c, 1))
      .Cells(c, 3).NumberFormat = "@"
      Next
      End With
      End Sub

  2. Buena tarde,

    Muchas gracias por el ejercicio me sirvió.
    Tengo una consulta, si tengo 2 o mas Filas y quiero que para cada una actué independiente el relleno, como lo haría?

    1. Utiliza la fórmula: =CONCATENAR(REPETIR("0";11-LARGO(A2));A2)

      O en caso de utilizar el VBA elimina el loop, puedes ver la contestación que le doy a Juan.

      Saludos

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies