Macro pega valores actualizados al final

Les tengo la siguiente consulta:
Tengo una consulta a una base de datos que se actualiza cada 5 minutos automáticamente. Esta actualización entrega un valor. En la celda A1 de la Hoja1.
Necesito que cada vez que se actualize la base, ese nuevo valor (celda A1 de Hoja1) me lo pegue en la hoja2 en la columna B, es decir, la primera vez que actualice debe copiar y pegar el valor en la celda B1 de la hoja2. La segunda vez que se actualice debe copiar el valor y pegarlo a continuación del anterior, es decir en la celda B2 y así sucesivamente. De esta forma podré tener los distintos valores en el tiempo. Además necesito que en la columna C, al lado de cada valor pegado, se copie la fecha y hora de la actualización: celda B1=valor actualización1, celda C1=fecha y hora actualizació1.   Celda B2= valor actualización2, celda C2=fecha y hora actualizació2.

1 respuesta

Respuesta
1
Prueba el siguiente código:
'--------------
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$A$1" Then
      Sheets("hoja2").Select
      Sheets("hoja2").Range("B65536").End(xlUp).Offset(1, 0).Select
      Selection = Range("a1")
      Selection.Offset(0, 1) = Date & " - " & Time
   End If
End Sub
'----------------------
Pincha en la pestaña de la hoja1 con el ratón derecho y selecciona VER CÓDIGO, en la pantalla nueva que te saldrá, pega el código que te he puesto en la parte de arriba y cierra la pantalla para volver a Excel. De esta forma cada vez que se cambie el valor de la celda A1 se te copia en la hoja2 el valor y la fecha y hora.
Si tienes dudas o quieres alguna otra mejora, puedes solicidar aclaraciones.
Yo pienso que sería mejor que pusieras la fecha en la columna C y la hora en la D. Pero ese tema lo valoraras tú mejor que yo.
Suerte
Excelente! Era justo lo que necesitaba, mil gracias.
Ahora quería aprovechar para consultar algo similar y que tiene relación con otra consulta que hice.
Tengo la siguiente macro:
rgo = ActiveSheet.Range("AD92").Value
Sheets("Ubic.").Range(rgo) = ActiveSheet.Range("AD94").Value
Esta macro copia el valor de la celda AD94 y la pega en la celda indicada en la casilla AD92 (la celda AD92 indica la ubicación donde se debe pegar el valor).
Lo que necesito es que después de esta instrucción, el valor de la celda AD94 lo pegue en la Hoja2 en la columna A y cada vez que se ejecute la macro, pegue el nuevo valor de AD92 al final de la columna A (quedando como último valor de la columna). En el fondo es similar a la instrucción que me indican salvo que no la ejecuta automáticamente al cambiar el valor sino que al ejecutar la macro de arriba.
Nuevamente muchísimas gracias.
Cristobal
Si no lo entiendo mal, solo tendrías que añadir esta linea a tu macro
Sheets("hoja2"). Range("a65536").End(xlUp).Offset(1, 0) = Range("ad92")
De tal forma que te quedaría algo así:
rgo = ActiveSheet.Range("AD92").Value
Sheets("Ubic.").Range(rgo) = ActiveSheet.Range("AD94").Value
Sheets("hoja2"). Range("a65536").End(xlUp).Offset(1, 0) = Range("ad92")
Entiendo que el rango "ad92" esta en la hoja que te encuentras situado, de no ser así, tendrías que ponerle delante el nombre de la hoja, que sería lo más correcto
Sheets("hoja2"). Range("a65536").End(xlUp).Offset(1, 0) = sheets("nombrede la hoja"). Range("ad92")
Gracias, resulto perfecto.
Ahora tengo una duda respecto de la primera respuesta.
La Macro que me indicas:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$A$1" Then
      Sheets("hoja2").Select
      Sheets("hoja2").Range("B65536").End(xlUp).Offset(1, 0).Select
      Selection = Range("a1")
      Selection.Offset(0, 1) = Date & " - " & Time
   End If
End Sub
No se ejecuta al actualizarse automáticamente la consulta a la base de datos, si se ejecuta cuando me paro sobre la celda A1 y presiono "Enter", pero te aclaro que la planilla no la toco en absoluto, ya que ésta se actualiza cada 2 minutos en forma automática.
Ahora, si no hay solución directa a eso, se podría hacer que en la celda A2 colocara la fórmula AHORA() de manrea de que cuando se actualice la base automáticamente, cambiaría el valor de esa celda, entonces la macro debiera correr al cambiarse el valor de la celda A2. ¿Se puede?
Otra alternativa es que la macro corra cada 5 minutos, ¿eso se puede? Entonces le digo a la macro que se ejecute cada 5 minutos y me copie el valor de la celda A2 en la última fila libre de la hoja2...
Espero que me puedas ayudar con esto.
Mil gracias.
Pregunta:
El libro de la plantilla que se actualiza cada 2 minutos, ¿Esta abierto, o esta cerrado? Cuando se actualiza. Etc..
Necesitaría saber como funcionáis con ese fichero para ver las posibilidades... o alternativas.
El libro esta siempre abierto, es decir, se abre en las mañananas y se comienza con las actualizaciones automáticas cada 2 minutos.
¿Cómo había preguntado arriba, se puede hacer una macro que se ejecute cada dos minutos?
La idea final de esto es poder graficar el valor de la celda A1 en el tiempo. Es una celda que me entrega el numero de ordenes de venta con problemas, y necesito saber como se comporta esto durante el día, saber los horarios donde este valor es menor, cuantas horas permanece en un valor determinado, etc, y teniendo un listado de los valores de A1 con el horario de cada uno de esos valores, puedo llevarlo a un gráfico.
Espero que con esto puedas entender bien la idea.
Muchas gracias.
Cristobal
He revisado la macro y no veo por que no te funciona, pero prueba esto, ya que en la anterior te volvía a dejar en una hoja que no era la misma de inicio. Como puedes ver he cambiado algo el código, pero el funcionameinyo tendría que ser el mismo.
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$A$1" Then
      fila = Sheets("hoja2").Range("B65536").End(xlUp).Offset(1, 0).Row
      ThisWorkbook.Sheets("hoja2").Cells(fila, 2) = ThisWorkbook.Sheets("hoja1").Range("a1")
      ThisWorkbook.Sheets("hoja2").Cells(fila, 3) = Date & " - " & Time
   End If
End Sub
Espero haber acertado. Yo modifico el valor de la celda A1 de la primera hoja con una macro de tal forma que podría ser lo mismo que haces tú al realizar las actualizaciones y cuando este valor se cambia, automáticamente se ejecuta el código y lo añade en la hoja2..
No me funciona, prueba lo siguiente y te vas a dar cuenta de lo que hablo:
En la celda A1 escribe la fórmula AHORA().
En cualquier otra celda escribe un número y presiona enter. Al presionar enter el valor de A1 cambiará, pero la macro no se ejecuta. Ahora, si me paro en la celda A1 y le doy un enter a la fórmula, entonces si funciona la macro. Al parecer la macro se ejecuta y si uno se posiciona en la celda A1 además esta cambia.
Probé como tu con una macro que me pegaba un valor en la celda A1 y funciona, pero de la forma que lo hice yo no.
Espero que me puedas ayudar.
Saludos.
De nuevo Cristobal:
He realizado varias pruebas y he sacado esta conclusión, Te he modificado la macro de tal forma que si hay una diferencia de 5 minutos en la fecha se actualizan los valores. Para que se ejecute la macro ACTUALIZA, le he puesto tres condiciones, una que se active la hoja1, otra, que realice cualquier cálculo, o que se produzca un cambio en la hoja, con una de estas condiciones verifica la fecha y si es igual o mayor de 5 minutos, hace el copiado.
Private Sub Worksheet_Activate()
 actualiza
End Sub
Private Sub Worksheet_Calculate()
  actualiza
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
  actualiza
End Sub
Sub actualiza()
   fila = Sheets("hoja2").Range("c65536").End(xlUp).Row
   If Sheets("hoja2").Cells(fila, 3) + TimeValue("00:05:00") <= Now Then
      If Sheets("hoja2").Cells(fila, 3) <> Now Then
          ThisWorkbook.Sheets("hoja2").Cells(fila + 1, 3) = Now
          ThisWorkbook.Sheets("hoja2").Cells(fila + 1, 2) = ThisWorkbook.Sheets("hoja1").Range("a1")
      End If
   End If
End Sub
Espero haber acertado, es un poco difícil ver las condiciones de tu fichero sin tenerlo..

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas