2012-02-16 14 views
5

Tengo una fórmula en C2, por ejemplo =A2+B2. Siempre que C2 cambie el valor (valor real, no fórmula) quiero que la fecha y hora actual se actualicen en D2.Actualización automática de fecha en una celda cuando cambia el valor de otra celda (según lo calculado por una fórmula)

He intentado muchos códigos y trucos de VBA y ninguno de ellos funciona si se ingresa una fórmula en C2. PERO si escribo un valor manualmente en C2, la fecha y la hora se actualizan según sea necesario. Esto es, por supuesto, porque se ingresa/cambia un valor real, donde la fórmula permanece igual, por así decirlo.

Pregunta: ¿Es posible crear un código VBA (o algo más) que actualiza D2 cuando el resultado de la fórmula de cambios C2?

Si es posible, necesito que esto sea activo para las células C2: C30 (+ D2: D30 para la fecha + hora)

Uso de Excel 2010.

+1

"He intentado con muchos códigos VBA". Pregúntanos [¿qué has intentado?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

Respuesta

10

Se podría llenar la celda dependend (D2) por una función definida por el usuario (función de macro de VBA) que toma el valor de la celda C2 como parámetro de entrada, devolviendo la fecha actual como salida.

Tener C2 como parámetro de entrada para la UDF en D2 le dice a Excel que necesita reevaluar D2 cada vez que C2 cambia (es decir, si el cálculo automático de las fórmulas está activado para el libro).

EDIT:

Aquí hay un código:

Para la UDF:

Public Function UDF_Date(ByVal data) As Date 

     UDF_Date = Now() 

    End Function 

Como fórmula en D2:

=UDF_Date(C2) 

que tendrá que dar el D2-Cell un formato de fecha y hora, o mostrará un representante numérico tación del valor de la fecha.

Y puede ampliar la fórmula sobre el rango deseado arrastrándola si mantiene la referencia de C2 en la fórmula D2 relativa.

Nota: Esto todavía podría no ser la solución ideal, ya que cada vez que Excel actualiza el libro de la fecha en D2 se restablecerá al valor actual. Para hacer que D2 solo refleje la última vez que se modificó C2, tendría que haber algún tipo de seguimiento de los valores anteriores de C2. Esto podría implementarse, por ejemplo, en la UDF proporcionando también la dirección al lado del valor del parámetro de entrada, almacenando los parámetros de entrada en una hoja oculta, y comparándolos con los valores previos cada vez que se llama al UDF.

Adición:

Aquí está un ejemplo de implementación de una UDF que rastrea los cambios de los valores de celda y devuelve la fecha y hora en que se detectó los últimos cambios. Al usarlo, Tenga en cuenta que:

  • El uso de la UDF es el mismo que el descrito anteriormente.

  • El UDF funciona solo para rangos de entrada de celda única.

  • La célula valores se realiza un seguimiento mediante el almacenamiento del último valor de celda y el fecha-hora en que se detecta el cambio en las propiedades del documento de la libro. Si la fórmula se utiliza en grandes conjuntos de datos, el tamaño del archivo puede aumentar considerablemente, ya que para cada celda rastreada por la fórmula aumenta los requisitos de almacenamiento (último valor de celda + fecha del último cambio). Además, tal vez Excel es no es capaz de manejar cantidades muy grandes de propiedades del documento y el código podría frenar en un cierto punto.

  • Si se cambia el nombre de una hoja de trabajo, se pierde toda la información de seguimiento de las celdas allí contenidas.

  • El código puede frenar para valores de celda para los cuales la conversión a cadena no es determinista.

  • El código siguiente es no probado y debe considerarse solo como prueba del concepto . Úselo bajo su responsabilidad.

    Public Function UDF_Date(ByVal inData As Range) As Date 
    
        Dim wb As Workbook 
        Dim dProps As DocumentProperties 
        Dim pValue As DocumentProperty 
        Dim pDate As DocumentProperty 
        Dim sName As String 
        Dim sNameDate As String 
    
        Dim bDate As Boolean 
        Dim bValue As Boolean 
        Dim bChanged As Boolean 
    
        bDate = True 
        bValue = True 
    
        bChanged = False 
    
    
        Dim sVal As String 
        Dim dDate As Date 
    
        sName = inData.Address & "_" & inData.Worksheet.Name 
        sNameDate = sName & "_dat" 
    
        sVal = CStr(inData.Value) 
        dDate = Now() 
    
        Set wb = inData.Worksheet.Parent 
    
        Set dProps = wb.CustomDocumentProperties 
    
    On Error Resume Next 
    
        Set pValue = dProps.Item(sName) 
    
        If Err.Number <> 0 Then 
         bValue = False 
         Err.Clear 
        End If 
    
    On Error GoTo 0 
    
        If Not bValue Then 
         bChanged = True 
         Set pValue = dProps.Add(sName, False, msoPropertyTypeString, sVal) 
        Else 
         bChanged = pValue.Value <> sVal 
         If bChanged Then 
          pValue.Value = sVal 
         End If 
        End If 
    
    On Error Resume Next 
    
        Set pDate = dProps.Item(sNameDate) 
    
        If Err.Number <> 0 Then 
         bDate = False 
         Err.Clear 
        End If 
    
    On Error GoTo 0 
    
        If Not bDate Then 
         Set pDate = dProps.Add(sNameDate, False, msoPropertyTypeDate, dDate) 
        End If 
    
        If bChanged Then 
         pDate.Value = dDate 
        Else 
         dDate = pDate.Value 
        End If 
    
    
        UDF_Date = dDate 
    End Function 
    
+0

+ 1 esta es una buena manera de hacerlo, realmente no se puede usar una fórmula ya que todas las funciones relacionadas con el tiempo son volátiles y se pueden recalcular en cualquier momento –

+0

Hola y gracias por la respuesta rápida. Intenté lo que publicaste pero obtuve un # nombre? incluso si la celda ha sido formateada para mostrar una fecha. – AlienHand

+0

#Name? probablemente significa que Excel no encuentra el UDF. ¿Dónde ha almacenado la función VBA, está declarada pública y el nombre corresponde a lo que ha escrito en D2? – Roman

0
Private Sub Worksheet_Change(ByVal Target As Range) 

    If Target.Address = "$C$2" Then 

     ActiveSheet.Range("D2").Value = Now() 

    End If 

End Sub 
4

Hacer la inserción de la fecha condicionada a la gama.

Esto tiene la ventaja de no cambiar las fechas a menos que se cambie el contenido de la celda, y está en el rango C2: C2, incluso si la hoja está cerrada y guardada, no recalcula a menos que la celda adyacente cambios.

Adaptado de this tip y S @ Pablo respuesta

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim R1 As Range 
Dim R2 As Range 
Dim InRange As Boolean 
    Set R1 = Range(Target.Address) 
    Set R2 = Range("C2:C20") 
    Set InterSectRange = Application.Intersect(R1, R2) 

    InRange = Not InterSectRange Is Nothing 
    Set InterSectRange = Nothing 
    If InRange = True Then 
    R1.Offset(0, 1).Value = Now() 
    End If 
    Set R1 = Nothing 
    Set R2 = Nothing 
End Sub 
+0

Esto parece muy elegante. Lo probaré. ¡Gracias! ; o) – AlienHand

+0

Probando esto ... – AlienHand

+0

Esto solo funciona si cambia manualmente los datos dentro del rango (y es perfecto para eso). Pero si tiene una fórmula en la celda (como yo) no actualizará/cambiará la fecha en que se realizan los cambios. Ergo, no puedo usarlo. Lo siento. – AlienHand

-1

La forma más sencilla es añadir =IF(B3="","Not Allocated",Now()) y cambiar el formato de la columna para el formato de fecha y hora requerida. Pero aquí si se edita la columna B, la fecha y hora de la columna respectiva que necesita la actualización se actualizará automáticamente para todas las columnas ya que no se verifica el valor anterior. Pero si está bien obtener la hora actual, esto se puede usar fácilmente.

Cuestiones relacionadas