Macros para graficos y horas

Juan_snbdo

New Member
Joined
Jun 29, 2011
Messages
11
Estimados señores, esperando see encuentren bien, necesito ver si me pueden ayudar en lo siguiente: tengo una macros que hace un grafico de un rango fijo y lo despliega en otra hoja (la siguiente):

Sub Graf_TK1()
Range("N23:Q31").Select
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=Sheets("Hoja1").Range("N23:Q31"), PlotBy:=xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Graf_TK_1"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Estanque N°1"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With
End Sub

Funciona bien, pero aún no encuentro la forma que al realizar el grafico vuelva a la hoja1 celda A1, se queda en la hoja Graf_TK_1 y cuando selecciona la hoja1, está en la celda que corresponde al área de datos del grafico.

Otra cosa, es que esos datos son obtenidos desde un servidor OPC, y necesito llenar las celdas que dependiendo de la hora (ya solucione el problema de la hora), he tratado con la función =Si(“condición”, verdadero, falso) el caso es que necesito que cuando sea la condición sea falsa no ponga cero si no que actualice el valor cuando sea verdadero solamente, o sea, que copie el valor y lo mantenga hasta que llegue a esa hora nuevamente.

Otra cosa, es saber cómo se puede hacer que una macros se ejecute sola, una vez habilitadas las macros.
Espero no ser majadero y agradezco su respuesta

<!-- google_ad_section_end -->
 

Excel Facts

How to calculate loan payments in Excel?
Use the PMT function: =PMT(5%/12,60,-25000) is for a $25,000 loan, 5% annual interest, 60 month loan.
Funciona bien, pero aún no encuentro la forma que al realizar el grafico vuelva a la hoja1 celda A1, se queda en la hoja Graf_TK_1 y cuando selecciona la hoja1, está en la celda que corresponde al área de datos del grafico.
Hola Juan,

Para esto agregale después del "End With" estas dos líneas:

Code:
Sheets("Hoja1").Activate
Range("A1").Activate
y para no ver los cambios que hace la macro agregate al inicio de la macro esta línea(después de Sub Graf_TK1):
Code:
Application.ScreenUpdating = False
y al final (antes de End Sub) esta otra:
Code:
Application.ScreenUpdating = True
Otra cosa, es que esos datos son obtenidos desde un servidor OPC, y necesito llenar las celdas que dependiendo de la hora (ya solucione el problema de la hora), he tratado con la función =Si(“condición”, verdadero, falso) el caso es que necesito que cuando sea la condición sea falsa no ponga cero si no que actualice el valor cuando sea verdadero solamente, o sea, que copie el valor y lo mantenga hasta que llegue a esa hora nuevamente.
Habría que ver cómo tenés los datos, o sea, en qué rango está el nuevo dato a tomar y en que rango el dato que será cambiado dependiendo la hora. Sería bueno que mostraras un archivo de muestra con datos lo más similares posible. Podría ser con VBA o con una fórmula como esta:
Code:
En A1=SI(HORA(AHORA())&":"&MINUTO(AHORA())="14:32",B1,C1)
en B1=3, en C1 =5
*Cambiar la hora para probar
Otra cosa, es saber cómo se puede hacer que una macros se ejecute sola, una vez habilitadas las macros.
Espero no ser majadero y agradezco su respuesta
<!-- google_ad_section_end -->
Se puede hacer que una macro corra por eventos y posiblemente por otros medios, pero depende de cuál va a ser el disparador que tendrás para que la macro se ejecute. Al cambiar un dato en algún rango de cierta hoja, al llegar cierta hora o cada cierto período, etc.

Espero sea de ayuda,

Saludos cordiales.
 
Last edited:
Upvote 0
Estimado Cesar
Agradeciendo mucho tu respuesta, mira te cuento, la Hora la tengo en formato de numeros del 0.00-23.99 , lo que necesito es disparar la copia del dato que tengo en una celda "a10" lo copie en la celda "b15" a las 0.00, el dato de "a10" lo copie en la celda "b16" a las 3.00, de esa forma necesito copiar los datos y eso que se repita durante todo el día en intervalos de tres horas, esto para generar el gráfico.
respecto a que una macros se ejecute al abrir un libro, es por esta macros:

Sub reloj()
'Mostramos la hora
ActiveSheet.Range("a1500") = Format(Now, "hh:mm:ss")
Application.OnTime (Now + TimeSerial(0, 0, 1)), "reloj"
End Sub

Que cada vez que abro el libro debo darle ejecutar y eso no es tan instuitivo para todos.
Ojala me puedas ayudar.

ATTE


Juan Sepúlveda
 
Upvote 0
Estimado Cesar
Agradeciendo mucho tu respuesta, mira te cuento, la Hora la tengo en formato de numeros del 0.00-23.99 , lo que necesito es disparar la copia del dato que tengo en una celda "a10" lo copie en la celda "b15" a las 0.00, el dato de "a10" lo copie en la celda "b16" a las 3.00, de esa forma necesito copiar los datos y eso que se repita durante todo el día en intervalos de tres horas, esto para generar el gráfico.
Por nada, un placer Juan.

Referente a tu solicitud, esto se podría hacer con un código VBA que recalcule cada 3 horas las fórmulas que tenés en las hojas, pero tengo dudas aquí:
¿Actualizar B15 y B16 cada 3 horas? o,
¿Actualizar B15 a las 0:00, B16 a las 03:00, B15 a las 06:00, B16 a las 09:00, B15 a las 12:00 etc...?
¿La macro que genera el gráfico correría cada 3 horas o sólo actualizar los datos de origen del gráfico cada 3 horas?

respecto a que una macros se ejecute al abrir un libro, es por esta macros:

Sub reloj()
'Mostramos la hora
ActiveSheet.Range("a1500") = Format(Now, "hh:mm:ss")
Application.OnTime (Now + TimeSerial(0, 0, 1)), "reloj"
End Sub

Que cada vez que abro el libro debo darle ejecutar y eso no es tan instuitivo para todos.
Ojala me puedas ayudar.
Para que se ejecute la macro al abrir el libro, debés agregar el código que necesitás que corra dentro del módulo "ThisWorkbook", que está al lado izquierdo del editor de VBA. Das doble click en ese módulo y arriba donde dice "General" seleccionar "Workbook". Con esto te aparecerá automáticamente el "Private Sub Workbook_Open()". Una vez hecho esto, colocá el código dentro de este Workbook_Open, dale guardar, cerrar y probate abrir el archivo para saber si funciona como necesitás.

Espero ayude.

Saludos cordiales
 
Upvote 0
Estimado

Muchas gracias nuevamente, la idea es ir llenando cada tres horas una columna por ejemplo B1 ; B2...;B8 cada tes horas, o sea, el dato que hay en a1 que pase a las 0.00 a b1 , el dato de a1 que pase a b2 a las 3.00 , el dato de a1 que pase a b3 a las 6.00 eso es lo que necesito, asi podre llenar los datos para el gráfico cada tres horas, no es problema que al día siguiente se cambien los datos, la idea es una grafico diario.
Ojla me puedas ayudar y nuevamente te agradezco mucho tu ayuda.

ATTE

Juan Sepúlveda
 
Upvote 0
Juan,

Una opción para hacer lo que mencionás sería:

1-) En un módulo normal pegá este código:
(Aquí podés cambiar el intervalo de 3 horas a unos cuantos segundos para probar como funciona)

Code:
Sub Actualizar_Cada_3_Horas()
Dim Intervalo As Date, UltLinea as Integer

  Intervalo = Now + TimeValue("03:00:00") 'Para actualizar cada 3 horas
  Application.OnTime Intervalo , "Actualizar_Cada_3_Horas"

    If IsEmpty(Range("B1")) Then
        UltLinea = 1
    Else
        UltLinea = Range("B" & Rows.Count).End(xlUp).Row
    End If
    
    Cells(UltLinea + 1, "B") = Range("A1")
End Sub
2-) En módulo "ThisWorkBook" pegá este otro código:
Code:
Private Sub Workbook_Open()

     Call Actualizar_Cada_3_Horas

End Sub

3-) Ahora guardar libro y cerrarlo.
4-) Abrir libro y ver como inmediatamente coloca un valor en la siguiente celda vacía de columna B.
(La macro se actualizará automáticamente cada intervalo después que es abierto el archivo)

Espero te funcione correctamente.

Saludos cordiales.
 
Last edited:
Upvote 0
Estimado Cesar

Junto con saludarte, te agradezco tu apoyo, te comento que la rutina que me enviaste solo copia el priemr valor en la celda, deje un intervalo de 30 seg, pero solo copia en una celda y actualiza la misma no va avanzando por la columna, me puedes ayudar con eso, la idea es que avance por 8 celdas de una columna, otra cosa, son catorce columnas las que debo llenar desde 14 celdas iniciales, ese codigo habría que copiarlo 14 veces, una copia por columna?
Y nuevamente gracias por tu ayuda

Juan Sepúlveda
 
Upvote 0
Cesar, si es posible te envío el archivo EXCEL donde estoy trabajando, para que veas de que se trata.
te escribo mi correo ja.sepulveda«arroba»gmail.com
Gracias

Juan Sepulveda
 
Last edited by a moderator:
Upvote 0
Hola César,

Me alegra ver que usted haya seguido tratando de mejorar sus habilidades en Excel y que esté tratando de ayudar a otros en los foros.

Un par de comentarios - si entendí bien, Juan quiere que la rutina corra a las 3, a las 6, etc., no de ahora en 3, de ahora en 6, ...

Podemos usar la función de hoja CEILING() para calcular la próxima hora correcta.
Code:
Sub ActualizarAHoraX()
 
    Const c_strMultiplesDeEsta As String = "03:00:00", _
          c_strThisProcName     As String = "ActualizarAHoraX"
 
    Dim celTarget       As Excel.Range, _
        dtmIntervalo    As Date, _
        lngLineaNueva   As Long, _
        wf              As Excel.WorksheetFunction
 
    Set wf = Application.WorksheetFunction
 
    '// {falta código que asegura que el cuaderno correcto
    '//  esté activado y que la hoja correcta esté activada}
 
    Set celTarget = Range("B" & Rows.Count).End(xlUp)
 
    With celTarget
        Set celTarget = .Offset(-(Len(.Formula) > 0))
    End With
 
    celTarget.Value = Range("A1").Value
    Let dtmIntervalo = wf.Ceiling(Now, TimeValue(c_strMultiplesDeEsta))
 
    Application.OnTime dtmIntervalo, c_strThisProcName
End Sub

También noten que si vamos a correr una rutina de forma automatizada, es prudente asegurar que afectamos el cuaderno y la hoja deseada y no los que están activados en el momento que corre.

Dejo a usted y Juan trabajar en eso. :)

Hola Juan,

Ya edité a su post aquí para que su dirección de correo-e no sea completo. Si usted pone su dirección complete y exacta, los "bots" la capta y usted recibirá una avalancha de "spam".
 
Last edited:
Upvote 0
Muchas gracias Greg, por lo del correo, no tenia idea de eso, agradezco su aporte, ahora voy a probar el codigo, ya que debo adaptarlo a lo que tengo realmente y no me manejo muy bien en este tema, les aviso si tengo exito o no, muchas gracias nuevamente, saludos.

Juan
 
Upvote 0

Forum statistics

Threads
1,213,510
Messages
6,114,037
Members
448,543
Latest member
MartinLarkin

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top