Problemas con código en Worksheet_Change y en Worksheet_Calculate

una vez mas. Vuelvo a molestar por otro problema que me ha surgido...

Recientemente preguntaba cómo detener la ejecución de una fórmula cuando se alcanza determinado valor. Esta pregunta fue excelentemente resuelta por Dante Amor como podéis comprobar si leéis la pregunta y la respuesta correspondiente... (gracias una vez más Dante). Ahora bien, resulta que, en la hoja de cálculo que utilizo, hay 4 columnas para introducir las horas de entrada y de salida (dos entradas y dos salidas, para la mañana y la tarde...) Estas columnas tienen el formato hh:mm. Bien, me gustaría poder introducir las horas sin necesidad de teclear los dos puntos, es decir, si yo pongo 0700, que aparezca como 07:00, para facilitar así la introducción de datos... Encontré en este magnífico foro la solución a mi problema, gracias a un código colgado por Elsa Matilde (quien, por cierto, también me ha solucionado un par de dudas de manera extraordinaria... Muchas gracias también a ti Elsa) y que había que colocar en el evento Worksheet_Change de la hoja. El que me explico Dante, había que colocarlo en el evento Worksheet_Calculate de la misma hoja, ya que los dos códigos se ejecutarían en esa hoja. Si solo pongo uno de los dos, funciona maravillosamente (sea cual sea el que ponga), pero si pongo los dos para conseguir los efectos deseados (los dos efectos), o bien resulta que el código de Dante para detener la ejecución de la fórmula produce resultados no deseados (en el sentido de que, en la celda donde sólo debería aparecer un resultado si el valor de otra celda es >= 20:00:00, aparece un resultado en número con decimales independientemente del valor de la otra celda, y, al cambiar o borrar ese dato, aparece un valor con formato año hora:minutos:segundos, que nunca es el deseado) o bien entra en una especie de bucle que bloquea toda ejecución de los códigos...

Seguramente esto se entendería mejor si colocase aquí los dos códigos, pero no me atrevería jamás a "colgar" (ni aquí ni en ningún otro foro) unos códigos que, si bien me han brindado generosamente sus autores a fin de solucionar mis problemas, NO me pertenecen en absoluto, a no ser que los propios autores me comuniquen que puedo hacerlo para aclarar este galimatías, ya que me parecería una falta de respeto hacia ellos...

Es por eso que hago esta pregunta de forma tan embarullada, con la esperanza de que, una vez más, podáis ayudarme...

1 respuesta

Respuesta
1

Por mi parte no hay problema. Si bien, soy el autor de los códigos, al subirlos a la nube, ya no me pertenecen; ahora el código es público y puede ser utilizado por cualquiera.


Si el cálculo de horas va en función de lo que vas capturando, entonces ya no es necesario el evento Calculate. Te anexo la macro para capturar las horas sin los dos puntos.

Reemplaza las macros que tienes por la siguiente macro, actualiza el rango de celdas donde vas a capturar las horas en esta parte: Range("C7:C37")


Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Range("C7:C37")) Is Nothing Then
        If IsNumeric(Target) Then
            Application.EnableEvents = False
            largo = Len(Target)
            Select Case largo
                Case 1: Target = "00:0" & Target
                Case 2: Target = "00:" & Target
                Case 3: Target = "0" & Left(Target, 1) & ":" & Right(Target, 2)
                Case 4: Target = Left(Target, 2) & ":" & Right(Target, 2)
                Case 5: Target = "0" & Left(Target, 1) & ":" & Mid(Target, 2, 2) & ":" & Right(Target, 2)
                Case 6: Target = Left(Target, 2) & ":" & Mid(Target, 3, 2) & ":" & Right(Target, 2)
            End Select
            Application.EnableEvents = True
            If [B39] = "" Then
                If [C39] >= [A39] Then
                    [B39] = [C39] - [A39]
                End If
            End If
        End If
    End If
End Sub

Ejemplos de captura:

Si pones 2, la macro pone 00:02 (0 horas 2 minutos)

Si pones 21, la macro pone 00:21 (0 horas 21 minutos)

Si pones 205, la macro pone 2:05 (2 horas 5 minutos)

Si pones 1815, la macro pone 18:15 (18 horas 15 minutos)

Si pones 23418, la macro pone 2:34:18 (2 horas 34 minutos 18 segundos)

Si pones 161523, la macro pone 16:15:23 (16 horas 15 minutos 23 segundos)


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

¡Gracias! Perfecto Dante. No solo funciona a las mil maravillas, sino que, además simplifica bastante el código que yo tenía... Simplemente ¡Genial!

Muchísimas gracias una vez más

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas