Modificar formato de hora de número a "xx:xx:xx"

Tengo una columna con horas, pero en formato " 191814" y lo necesito en "19:18:14. En una de las preguntas de este foro, he encontrado una muy buena respuesta, pero el problema es que tal y como está creada, solo puedo introducir los datos uno a uno, en el momento que pego en la columna mas de una celda, me da error, por exceder el límite de dígitos. ¿Cómo podría hacerlo para pegar una columna de datos de este tipo y poder pasarlo al otro formato?

Os dejo el ejemplo que os he dicho con el que me lo cambia, pero de uno en uno

Un saludo y muchas gracias por la ayuda

Private Sub Worksheet_Change(ByVal Target As Range)

'x Elsamatilde

Dim celda As String
Dim horas As String
Dim minutos As String
Dim segundos As String
'solo controla la col B
If Target.Column <> 2 Then Exit Sub
'controla el largo del dato
If Len(Target) < 4 Or Len(Target) > 6 Then Exit Sub
celda = Target.Value
If Len(Target) = 4 Then
horas = 0
minutos = Mid(celda, 1, 2)
segundos = Right(celda, 2)
ElseIf Len(Target) = 5 Then
horas = Left(celda, 1)
minutos = Mid(celda, 2, 2)
segundos = Right(celda, 2)
Else
horas = Left(celda, 2)
minutos = Mid(celda, 3, 2)
segundos = Right(celda, 2)
End If
celda = horas & ":" & minutos & ":" & segundos
'para que no se vuelva a ejecutar el change
Application.EnableEvents = False
Target = celda

Application.EnableEvents = True

End sub

1 respuesta

Respuesta
2

Ese código se ejecuta al tipear un dato en una celda y convertirlo en formato hh:mm:ss para que el usuario no tuviese que escribir los separadores.

Para cambiar el formato en todo un rango, podrías utilizar la misma macro pero ajustada a la nueva situación. En mi ejemplo estoy considerando que tendrás un rango continuo a partir de la celda A2. Ajusta esta referencia a tu modelo.

Sub cambioFormato()
'x Elsamatilde
Dim celda As String
Dim horas As String
Dim minutos As String
Dim segundos As String
'ajusta el inicio de la col donde se pegaron los datos
[A2].Select
'se recorre esa col hasta encontrar una celda vacía.... fin de rango
While ActiveCell.Value <> ""
'controla el largo del dato
If Len(ActiveCell) < 4 Or Len(ActiveCell) > 6 Then GoTo sigo
celda = ActiveCell.Value
If Len(ActiveCell) = 4 Then
    horas = 0
    minutos = Mid(celda, 1, 2)
    segundos = Right(celda, 2)
ElseIf Len(ActiveCell) = 5 Then
    horas = Left(celda, 1)
    minutos = Mid(celda, 2, 2)
    segundos = Right(celda, 2)
Else
    horas = Left(celda, 2)
    minutos = Mid(celda, 3, 2)
    segundos = Right(celda, 2)
End If
celda = horas & ":" & minutos & ":" & segundos
'reemplaza el contenido de la celda
ActiveCell.Value = celda
sigo:
'pasa a la fila siguiente y repite el proceso
ActiveCell.Offset(1, 0).Select
Wend
End Sub

Si necesitas ayuda para ajustar el rango (quizás tengas rangos discontínuos) dejame una imagen de la hoja donde se vean los encabezados de fila/col.

Nota: Si solo necesitas que se 'muestre' con un formato de hora, y no necesitarás realizar ningún tipo de cálculo, hay un modo manual de formatear las celdas. En la imagen se observa el formato asociado al rango de números y en el campo 'Muestra' el resultado que obtendrás.

Aclaro un poco más por tratarse de otro tipo de macros.

En el Editor de Macros, inserta un módulo y allí copia toda la macro que te dejé.

Debes quitar la macro anterior que seguramente lo tendrás en un objeto HOJA.

Para ejecutarla tendrás varias opciones:

- Desde el menú Programador o Desarrollador, Macros, seleccionar ésta y Ejecutar.

- O dibujar un botón en la hoja, clic derecho sobre el botón, Asignar macro y le asignas a ésta.

- O asignar un atajo de teclado. Dejo imagen del paso a paso explicado en cap 4 de mi manual 500Macros.

Sdos.

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas