Función UDF para insertar fecha estática en una tabla excel

Agradecería vuestra ayuda en un tema que me tiene un poco perdido. Tengo una tabla con 4 columnas. Cada una recoge una fecha en función de los datos que registro en otras columnas de la tabla. Dado que la funciÓN AHORA() es volátil y yo requería que la fecha permaneciera fija (siempre y cuando las columnas de las que dependen recogieran datos), busqué y encontré la posibilidad de crear una UDF para usar en las formulas de la tabla. En concreto encontré este código...

FUNCTION MIFECHA()

   VOLATILE = FALSE

   MIFECHA = DATE

END FUNCTION

... Una vez creada en un módulo y de vuelta a la tabla, la fórmula que recogería dicha UDF sería básicamente así...

(EN LA CELDA B1 POR EJEMPLO)...  =SI(A1<>"";MIFECHA();"")

... A primera vista funciona correctamente y muestra la fecha, al igual que la deja de mostrar si en A1 borro el dato, pero a pesar de haber marcado "VOLATILE" como "FALSE", la fecha se actualiza a cada día que abro el libro.

Si alguien pudiera indicarme si estoy haciendo algo mal o me falta algo dentro del código de la UDF o simplemente es imposible hacerlo mediante UDF, sería una gran ayuda porque es importante

3 respuestas

Respuesta
1

[Hola

No se puede evitar eso, así coloques el método "Volatile" en False, al abrir el libro (y en algunas otras circunstancias) siempre se actualizará.

Para que no cambie el ingreso de la fecha tiene que ser:

- Digitándolo directamente
- Ingresándolo con "CTRL" + ";"
- Colocándolo mediante una rutina (sub) NO con una UDF

Comentas

Abraham Valencia

Gracias Abraham por contestar...

Si mediante UDF no es posible entonces los condicionales para que dicha fecha aparezca deberé ingresarlos dentro de la rutina (sub). El objetivo era crear la función y utilizarla dentro de los condicionales de las fórmulas por resultarme más fácil y conocido el tema.

Si adjunto el libro, ¿podría ser posible que me guiaras dado que no soy más que iniciado en esta materia?

Sea como sea te agradezco muchísimo la atención prestada

Coloca tu archivo en algún "Drive" y comparte el enlace por aquí.

Abraham Valencia

Respuesta
1

Para dejar una fecha fija en una celda en función del dato de otra celda, y que además sea en automático, podrías hacerlo con un código VBA pero en el evento de tu hoja.

Por ejemplo, si quieres validar la columna A y poner el resultado en la columna B.

Pon el siguiente código en los eventos de tu Hoja:

Private Sub Worksheet_Change(ByVal Target As Range)
'Por Dante Amor
    'Pone la fecha en B, si se escribe un valor en A
    '
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        If Target.Count > 1 Then Exit Sub
        If Target.Value = "" Then
            Target.Offset(0, 1).Value = ""
        Else
            If Target.Offset(0, 1).Value = "" Then
                Target.Offset(0, 1).Value = Date
            End If
        End If
    End If
End Sub

Lo anterior pone la fecha en la columna B cuando modificas la columna A. Si borras el dato de la columna A, se borra la fecha de B. Si modificas el dato de A, y ya existe una fecha en B, no modifica la fecha.


Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

Me está dando error para responder al mensaje... Me puedes leer? 

Corto y pego....

El aporte fantástico. Hace exactamente lo que describes. Trasteando y dado que tenia varias columnas en la misma situación, he duplicado el código adaptando los parámetros de la columna que contiene la condición y la dirección de la columna donde se inserta la fecha y ha funcionado en todas (no sé si bien o mal hecho pero ha funcionado). 

Sólo me restan 2 dudas, si no es molestia... la última de las columnas que requería de fecha tiene un condicional más complejo q con toda seguridad variará el código vba. Si te parece bien y solo si te lo parece, lo comentamos? Sea como sea, te agradezco de veras las ayuda que me has proporcionado a mi personalmente.

Quedo a la espera de tu respuesta. Un abrazo

Con todo gusto reviso la condicional.

Explícame con ejemplos, cuáles son las condiciones y lo que esperas de resultado y adapto el código.

También pega la macro que adecuaste para sobre ese código poner la actualización.

Buenos días...

Inicialmente la formula de la columna que te comentaba contenía la siguiente fórmula…

=SI(O(Y(Tabla13[[#Esta fila];[ Pedido]]=0;Tabla13[[#Esta fila];[Resta]]=0);Y(Tabla13[[#Esta fila];[ Pedido]]>0;Tabla13[[#Esta fila];[Resta]]>0);Y(Tabla13[[#Esta fila];[ Pedido]]<0;Tabla13[[#Esta fila];[Resta]]<0;Tabla13[[#Esta fila];[Estado]]="");Y(Tabla13[[#Esta fila];[**]]="U";Tabla13[[#Esta fila];[Modalidad]]="*"));"";SI(K2="";HOY();K2))

… evidentemente existía referencia circular porque no averigüé otra manera de hacerlo hasta ahora gracias a ti. La referencia circular me obligaba a activar el cálculo iterativo pero el trabajo con el libro se hizo muy pesado por los tiempos de espera.

Te paso a detallar las columnas afectadas por la fórmula…

  • Columna K = Abonado (columna donde se debe insertar la fecha)
  • Columna Q = Pedido
  • Columna V = Resta
  • Columna Y = Estado
  • Columna J = **
  • Columna AE = Modalidad

El funcionamiento es el siguiente… Buscamos que cuando un pedido esté cobrado o compensado se inserte la fecha en la columna K (Abonado). Para ello en la fórmula indiqué los casos en los que NO quería insertar fecha y en caso contrario que la insertara…

  • Si importe pedido es nada Y    la resta es 0No queremos fecha
  • …O Si importe pedido es >0    Y    la resta es >0No queremos fecha
  • …O Si importe pedido es <0    Y    la resta <0    Y    el estado es nadaNo queremos fecha
  • …O Si en la columna ** indicamos la letra U    Y    la modalidad es *No queremos fecha

… para el resto de casos si debe aparecer la fecha estática respetando el mismo comportamiento que me enseñaste en el código anterior, es decir, en caso de modificación de cualquiera de las columnas  y siempre que se cumplan los requisitos para que se refleje la fecha ésta no se modificará, pero si se dejan de cumplir los requisitos dicha fecha dejará de mostrarse hasta que nuevamente se cumplan los requisitos, en cuyo caso la fecha se actualizará al momento de cumplirlos.

Te adjunto el código tal y como me pediste ya ajustado a mi tabla restando incluir únicamente el código para ésta última columna (K), aunque si ves que hay algo que es erróneo o mi explicación arroja dudas me comentas… y como siempre MUCHAS GRACIAS!!!!

Private Sub Worksheet_Change(ByVal Target As Range)

'Por Dante Amor

'Pone la fecha en D, si se escribe un valor en L

    If Not Intersect(Target, Range("L:L")) Is Nothing Then

        If Target.Count > 1 Then Exit Sub

        If Target.Value = "" Then

            Target.Offset(0, -8).Value = ""

        Else

            If Target.Offset(0, -8).Value = "" Then

                Target.Offset(0, -8).Value = Date

            End If

        End If

    End If

'Pone la fecha en E, si se escribe un valor en F

    If Not Intersect(Target, Range("F:F")) Is Nothing Then

        If Target.Count > 1 Then Exit Sub

        If Target.Value = "" Then

            Target.Offset(0, -1).Value = ""

        Else

            If Target.Offset(0, -1).Value = "" Then

                Target.Offset(0, -1).Value = Date

            End If

        End If

    End If

'Pone la fecha en AB, si se escribe un valor en Y

    If Not Intersect(Target, Range("Y:Y")) Is Nothing Then

        If Target.Count > 1 Then Exit Sub

        If Target.Value = "" Then

            Target.Offset(0, 3).Value = ""

        Else

            If Target.Offset(0, 3).Value = "" Then

                Target.Offset(0, 3).Value = Date

            End If

        End If

    End If

End Sub

Prueba con lo siguiente. Agrupé las columnas F, L, Y

Y entro If puse la condición para la columna K

Private Sub Worksheet_Change(ByVal Target As Range)
'Por Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("F:F,L:L,Y:Y")) Is Nothing Then
        Select Case Target.Column
            Case Columns("F").Column: col = "E"  'Pone la fecha en E, si escribe valor en F
            Case Columns("L").Column: col = "D"  'Pone la fecha en D, si escribe valor en L
            Case Columns("Y").Column: col = "AB" 'Pone la fecha en AB, si escribe valor en Y
        End Select
        If Target.Value = "" Then
            Cells(Target.Row, col).Value = ""
        Else
            If Cells(Target.Row, col).Value = "" Then
                Cells(Target.Row, col).Value = Date
            End If
        End If
    End If
    '
    'Pone la fecha en K, si escribe valor en Q,V,Y,J,AE
    If Not Intersect(Target, Range("Q:Q,V:V,Y:Y,J:J,AE:AE")) Is Nothing Then
        fila = Target.Row
        If (Cells(fila, "Q").Value = "" And Cells(fila, "V").Value = 0) Or _
           (Cells(fila, "Q").Value > 0 And Cells(fila, "V").Value > 0) Or _
           (Cells(fila, "Q").Value < 0 And Cells(fila, "V").Value < 0) Or _
           (Cells(fila, "J").Value = "U" And Cells(fila, "V").Value = "*") Then
            Cells(fila, "K").Value = ""
        Else
            Cells(fila, "K").Value = Date
        End If
    End If
End Sub

[Sal u dos

Buenas tardes...

He probado el código y funciona perfectamente con las columnas que ya funcionaban. Con la última no ha funcionado. En cuanto llegue a casa hago unas pruebas y saco unas imágenes para que puedas ver el resultado. No obstante he estado pensando y tal vez añadir una columna auxiliar a la tabla con una fórmula estándar que indique un resultado binario SI o NO para que en función del valor que muestre esa columna se inserte la fecha en la columna QUE puede que resulte más fácil a nivel de código vba.

¿Qué opinas?

Un saludo

Termina de realizar las pruebas y dime en cuál condición está teniendo problemas.

Toma en cuenta que debes capturar datos en las columnas Q, V, Y, J, AE, sin alguna de esas columnas tienes fórmulas, el evento Change no se activa, por lo tanto, la macro no se ejecuta.

Entonces por ahí viene el problema, la columna V contiene fórmula. Lamento no haberte aportado ese detalle. Se puede alterar el código para dicha circunstancia? 

Eso mismo responde a la alternativa q te planteaba como idea porque la nueva columna iba a llevar fórmula. 

Sigues necesitando pantallazos? 

Crea una nueva pregunta y me plantes con detalle lo que tienes y lo que esperas de resultado.

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas