Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
4
respuestas

El código no funciona en un caso específico

Realizo este ensayo en julio 2024 con el código mostrado en clase:

    Cells(1, 1) = Format(Now(), Cells(1, 1) & "/mm/yyyy")
    Cells(2, 1) = Format(Now(), Cells(2, 1) & "/mm/yyyy")
    Cells(3, 1) = Format(Now(), Cells(3, 1) & "/mm/yyyy")
    Cells(4, 1) = Format(Now(), Cells(4, 1) & "/mm/yyyy")
    Cells(5, 1) = Format(Now(), Cells(5, 1) & "/mm/yyyy")
    Cells(6, 1) = Format(Now(), Cells(6, 1) & "/mm/yyyy")
    Cells(7, 1) = Format(Now(), Cells(7, 1) & "/mm/yyyy")

Con los datos de prueba obtengo la fecha esperada con todos menos con el 12, en donde me devuelve día y mes al revés.

| Valor original | Valor obtenido | | 12 | 07/12/2024 | | 12 | 07/12/2024 | | 13 | 13/07/2024 | | 13 | 13/07/2024 | | 15 | 15/07/2024 | | 15 | 15/07/2024 | | 12 | 07/12/2024 |

Además, noté que aunque la fecha del 12 se construye mal, en estas celdas el formato cambia a "Fecha" a diferencia de las demás que se forman de manera correcta pero su formato sigue siendo "General" (que es el que tienen todas originalmente).

Este código yo lo probé renglón por renglón en la Ventana Inmediata y ahí sí da las fechas correctas para todos los valores (incluso el 12).

Espero puedan ayudarme por favor, estuve probando otros códigos con el chatbot "Luri" pero nunca encontramos uno que solucionara este error y la verdad es que ya me dio mucha curiosidad por qué no funciona precisamente en el 12 o por qué solo en ese caso cambia el formato a fecha.

De antemano, gracias!

4 respuestas

¡Hola Guadalupe!

Entiendo tu problema con el código. Parece que el problema radica en el formato de la fecha para el valor 12. Una forma de solucionar esto es asegurarse de que el formato de la celda sea el adecuado antes de asignarle el valor. Puedes utilizar la función Format para asegurarte de que la fecha se formatee correctamente independientemente del valor.

Aquí tienes un ejemplo de cómo podrías modificar tu código para solucionar este problema:

For i = 1 To 7
    If Cells(i, 1) = 12 Then
        Cells(i, 1).NumberFormat = "dd/mm/yyyy"
    Else
        Cells(i, 1).NumberFormat = "General"
    End If
    Cells(i, 1) = Format(Now(), "dd/mm/yyyy")
Next i

En este ejemplo, se utiliza un bucle para recorrer las celdas y se verifica si el valor es 12. Si es así, se establece el formato de la celda como "dd/mm/yyyy" antes de asignarle la fecha formateada. Para los demás valores, se restablece el formato a "General" antes de asignar la fecha.

Espero que esta solución te ayude a resolver el problema. Si tienes alguna otra pregunta, no dudes en preguntar.

¡Espero haber ayudado y buenos estudios!

Hola, gracias por su respuesta.

Probé su código y para todos los datos me devuelve la fecha de hoy.

Sigo haciendo pruebas para encontrar la solución, por lo que construí una tabla con la siguiente estructura:

| Día | Fecha generada | Día generado | Mes generado |

En "Día" puse la secuencia del 1 al 31 para evaluarlos con mi código y obtener la "Fecha generada"; posteriormente, extraigo día y mes de esa fecha con las funciones DIA() y MES(), respectivamente. Además, agregué un formato condicional para indicar cuando los días generados son diferentes a los días originales.

Comparto mi código:

'Declaro variable string para obtener mes y año actuales 
Dim mesAnio As String
mesAnio = Format(Now, "mm/yyyy")

'Bucle para evaluar los 31 días
For i = 1 To 31
    'Concateno número original convirtiéndolo a string, con mes y año actuales
    Cells(i + 1, 2) = CStr(Cells(i + 1, 1)) & "/" & mesAnio
    'Formato final de fecha
    Cells(i + 1, 2).NumberFormat = "dd/mm/yyyy"
Next i

Con este ensayo, noté que el 12 no es el único caso en el cual intercambia día y mes, sino con todos los números del 1-12 (claro que en el 7 no nos afecta porque coinciden día y mes). Comparto mi pantalla para observarlo mejor.

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

Además, volví a revisar mi código en la ventana inmediata y ahí sí me devuelve 01/07/2024 para el primer número con la línea de código:

?Format(CStr(Cells(2,1))&"/"&Format(Now, "mm/yyyy"),"dd/mm/yyyy")

Sé que tal vez es un problema "sencillo" pero me causa mucho interés la causa de que no esté funcionando de manera uniforme este código, ojalá pudieran ayudarme a encontrar la razón de esto y la manera de repararlo, por favor.

¡Muchas gracias!

Hola, Guadalupe! estás bien? Ya pudiste solucionar el problema?

Buen día, no había visto su respuesta. Tuve que crear otro código. Lo comparto, este funciona bien.

    Dim i As Integer
    Dim dia As Integer
    Dim fecha As Date
    
    For i = 1 To 31
        dia = Cells(i + 1, 1).Value
        fecha = DateSerial(Year(Date), Month(Date), dia)
        Cells(i + 1, 2).Value = fecha
        Cells(i + 1, 2).NumberFormat = "dd/mm/yyyy"
    Next i