Macro para recorrer una columna y formateando los valores de sus celdas

Estoy tratando de realizar una macro en Excel que recorra todas las celdas de una columna, por ejemplo a partir de A5 hasta el final o hasta la celda que contenga datos en blanco, validando que cada celda contenga 4 carácteres numéricos, es decir, que no permita celdas que tengan 333 o AAA, y en caso de encontrarse alguna, que escriba un 0 o un carácter en blanco a su izquierda.

Llevo varios días intentándolo y no lo consigo. ¿Alguna

2 Respuestas

Respuesta
2

H o l a:

En tu ejemplo puedes tener números 333 y también puedes tener letras AAA, en ese caso se le agrega un 0 (cero) antes del valor que tenga la celda, es decir, quedaría así:

0333

0AAA


Te preparé la macro para los casos cuando la celda tiene 3 caracteres, 2 caracteres e incluso 1 caracter. Si la celda tiene 4 o más caracteres la macro no le hace nada.

Sub Formatear()
'Por.Dante Amor
    For i = 5 To Range("A" & Rows.Count).End(xlUp).Row
        Select Case Len(Cells(i, "A"))
            Case 1: Cells(i, "A") = "'000" & Cells(i, "A")
            Case 2: Cells(i, "A") = "'00" & Cells(i, "A")
            Case 3: Cells(i, "A") = "'0" & Cells(i, "A")
        End Select
    Next
    MsgBox "Fin"
End Sub

' : )
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
' : )

Muchísimas gracias Dante Amor!!!!

Tu macro es justo lo que necesitaba!! Sin embargo, tengo un pequeño problema. Necesito que si la celda en cuestión tiene más de 4 caracteres, me muestre un mensaje de error o algo así con la celda en la que se encuentra el error. ¿Sería esto posible?

Otra duda que tengo es también si en la celda tengo un valor en formato fecha de tipo 06/12/2015 lo convierta en 061215, es decir, sin los caracteres "/" y el año sin 4 dígitos, si no 2 dígitos tan solo. 

Prueba con lo siguiente, en caso de que la celda tenga una longitud de 5,6,7,9, en la columna Z te va a poner el mensaje "La celda tiene más de 4 caracteres"

Solamente en los casos que tenga 8 o 10 te va poner 6 caracteres.

Sub Formatear()
'Por.Dante Amor
    For i = 5 To Range("A" & Rows.Count).End(xlUp).Row
        Select Case Len(Cells(i, "A"))
            Case 1: Cells(i, "A") = "'000" & Cells(i, "A")
            Case 2: Cells(i, "A") = "'00" & Cells(i, "A")
            Case 3: Cells(i, "A") = "'0" & Cells(i, "A")
            Case 4
            Case 5, 6, 7, 9, Is > 10
                Cells(i, "Z") = "La celda tiene más de 4 caracteres"
            Case 8
                Cells(i, "A") = "'" & Left(Cells(i, "A"), 4) & Right(Cells(i, "A"), 2)
            Case 10
                d = Left(Cells(i, "A"), 2)
                m = Mid(Cells(i, "A"), 3, 2)
                a = Right(Cells(i, "A"), 2)
                Cells(i, "A") = "'" & Left(Cells(i, "A"), 2) & Mid(Cells(i, "A"), 4, 2) & Right(Cells(i, "A"), 2)
        End Select
    Next
    MsgBox "Fin"
End Sub

sal u dos

Respuesta
1

Tal vez te pueda ser útil esto:

For i =5 to Range("a1048576"). End(xlup).row

If Len(Range("a" & i).value) <> 4 then

Range ("a"&i).value =0

End if

Next

Espero te sea de utilidad y si necesitas algo más avisame!

Muchas gracias Radu por tu prontísima respuesta. 

Sin embargo, lo que pretendía es que si en la celda había un valor 325 lo transformase en 0325, o si había un valor 74 lo transformase en un valor 0074, no sé si me explico. Al final siempre necesito que la celda contenga cuatro caracteres, ni uno más ni uno menos. 

Ok, ya entendí, dentro del bucle hay que escribir un select case

Te paso el código:

For i =5 to Range("a1048576"). End(xlup).row

If Len(Range("a" & i).value) < 4 then

  Select case len(Range ("a"&i).value)

   Case is = 1

          Range ("a"&i).value = "'000'" & Range ("a"&i).value

Case is = 2

          Range ("a"&i).value = "'00'" & Range ("a"&i).value

Case is = 3

          Range ("a"&i).value = "'0'" & Range ("a"&i).value

End select

End if

Next

¡Gracias! 

Ahora si me funcionó, como la otra solución del compañero. En tu caso, al formatearme el número me pone un ' en medio, es decir, si encuentra un 12, me formatea a 00'12, pero ya he dado como solucionarlo en tu código. 

Como le dije también al otro compañero que me respondió amablemente, el problema viene cuando el usuario me ingresa un número más largo de 4 caracteres, es decir, que por error pone por ejemplo 12532 en lugar de 2532 por ejemplo. En ese caso debería mostrar un mensaje de error parando informando de la celda en la que se produce, o algo así. Supongo que se añade con otro CASE, pero no sé exactamente el código. 

También tengo el problema de las celdas en las que añade una fecha. En ese caso el usuario la escribe así: 06/12/2015 y me gustaría que la macro lo formatease para que quedase así: 061215. 

No sé si me he explicado demasiado bien. No obstante, muchas gracias por tus respuestas y por tu tiempo!

Es cierto, hay una comilla que sobra, es un poco incomodo escribir desde el móvil, pero que bueno que te sirvió!

Para que formatee la fecha utiliza Format

Ejemplo

For i =5 to Range("a1048576"). End(xlup).row

Range("a" & i).value = format(Range("a" & i).value, "DDMMYY")

Next

Saludos y cualquier duda con gusto lo revisamos!

Con respecto al primer problema, te recomiendo agregar al case la excepción

For i =5 to Range("a1048576"). End(xlup).row

If Len(Range("a" & i).value) < 4 then

  Select case len(Range ("a"&i).value)

   Case is = 1

          Range ("a"&i).value = "'000" & Range ("a"&i).value

Case is = 2

          Range ("a"&i).value = "'00" & Range ("a"&i).value

Case is = 3

          Range ("a"&i).value = "'0" & Range ("a"&i).value

Case else

Msgbox "longitud no valida en el rango (a" & i &")", vbcritical

End select

End if

Next

¡Gracias! 

Correcto, sin esa comilla funciona perfectamente. El Case else no termina de funcionarme, lo pasa y sigue formatenado el resto de la celda hacia abajo, pero no me muestra ningún mensaje. 

En el caso de la fecha me sucede algo extraño, o que no consigo entender. Si la fecha es por ejemplo 01/12/1983 al pasar la macro me la convierte a 21/11/1930, cuando debería convertírmela en 011283. ¿Alguna idea?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas