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 -->
 
Hola Greg de nuevo, mucho gusto!!!, cuanto tiempo!!!:),

De hecho si, bastante me han ayudado en este y otros foros y ahora se un poquito más que antes y
lo menos que puedo es tratar de agradecer de la misma forma, respondiendo cuando puedo a otras
personas que necesitan soporte en algunos temas. En casi todas las preguntas que trato de responder
hay algo que me gustaría hacerlo de otra forma e investigo cómo hacerlo y en el proceso trato de ayudar
y de paso aprendo algo nuevo de Excel.

Normalmente busco las preguntas sin respuesta porque los verdaderos expertos y toda la gente aquí
responden muy rápido y no dan tiempo de reaccionar jajaja, cuando empiezo a ver o empiezo a pensar
cómo solucionar algo, justo en ese momento alguien la está respondiendo
:biggrin:

Referente a la macro que nos enseñás, justo estuve pensando cómo establecer que comenzara a una
hora específica que definiera Juan después de abrir el libro y después de llegada esa hora que se repitiera
cada cierto intervalo de tiempo. Pues logré hasta ahora que me funcionara sólo con "Now" + intervalo.

He probado tu solución tratando de ver qué aprendo y no entendí muy bien qué hacés en la segunda
asignación de CelTarget
Code:
Set celTarget = .Offset(-(Len(.Formula) > 0))
Aparte de eso probé tu código y le agregué un With como se ve abajo para asegurar que la macro corre
sobre la hoja deseada(Hoja1 para ejemplificar). Entonces cCambié a intervalos de 10 segundos en lugar
de 3 horas, pero al iniciar el libro me tira miles de copias del valor de A1. Viendo esto, cambié el intervalo
a 10 minutos, pero en lugar de ejecutar la macro cada 10 minutos, lo hace cada 15 segundos mas o menos,
no sé el porqué de este comportamiento.

Code:
Sub ActualizarAHoraX()
 
    Const c_strMultiplesDeEsta As String = "00:10: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
 With Sheets("Hoja1") [COLOR=DarkGreen]'Esta línea para asegurar que la macro corre en "Hoja1", cambiar a la hoja real.[/COLOR]
    Set celTarget = .Range("B" & Rows.Count).End(xlUp)
 
    With celTarget
        Set celTarget = .Offset(-(Len(.Formula) > 0))
    End With
 
    celTarget.Value = .Range("A1").Value
 End With
    Let dtmIntervalo = wf.Ceiling(Now, TimeValue(c_strMultiplesDeEsta))
 
    Application.OnTime dtmIntervalo, c_strThisProcName
End Sub
Hola Juan de nuevo,

Referente a:
Juan_snbdo said:
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
Tenés razón, por alguna razón la copie mal al pegarla en el post, el error porque sólo copia una vez el
valor de A1 es por tener 1 en lugar de 0 en la línea mostrada abajo, que es la macro corregida.
Code:
Sub Actualizar_Cada_3_Horas()
Dim dTime As Date
  dTime = Now + TimeValue("00:00:10")
  Application.OnTime dTime, "Actualizar_Cada_3_Horas"

With Sheets("Hoja1") [COLOR=DarkGreen]'Esta línea para asegurar que la macro corre en "Hoja1", cambiar a la hoja real.[/COLOR]
    If IsEmpty(.Range("B1")) Then
[COLOR=Red]        UltLinea = 0[/COLOR]
    Else
        UltLinea = .Range("B" & Rows.Count).End(xlUp).Row
    End If
    
    Cells(UltLinea + 1, "B") = .Range("A1")
End With
End Sub
Favor probar nuevamente si así te funciona.

Saludos cordiales.
 
Upvote 0

Excel Facts

Which lookup functions find a value equal or greater than the lookup value?
MATCH uses -1 to find larger value (lookup table must be sorted ZA). XLOOKUP uses 1 to find values greater and does not need to be sorted.
...He probado tu solución tratando de ver qué aprendo y no entendí muy bien qué hacés en la segunda
asignación de CelTarget
Code:
Set celTarget = .Offset(-(Len(.Formula) > 0))
...

En la hoja en sí, Excel evalua CIERTO a un uno y FALSO a un cero. Pero en VBA, CIERTO tiene un valor de -1, no +1 (FALSO siempre es un cero). Entonces la seña de restar convierta la expresión a un uno positivo.

Póngase en una celda que tiene un valor y vaya a la ventana Immediate y ponga

? -(len(activecell.formula) = 0)

y usted verá un cero. Ahora seleccione una celda vacia y pruebe lo otra vez y verá un uno.

¿Y por qué probar el largo de la fórmula en vez de usar ISEMPTY() en VBA? Porque ISEMPTY() tanto como ISBLANK() puede devolver FALSO a pesar de que la celda está vacia.
 
Last edited:
Upvote 0
Gracias por la explicación Greg,

2 pájaros de un tiro:

1-) Nunca había usado/probado la ventana inmediato y ya sé al menos lo básico de para qué sirve y como usarla (? para print),
2-) Entiendo muy bien ahora lo que estás expresando y haciendo en esa expresión de
"-(Len(.Formula) > 0)" después de probar
en la ventana inmediato con el ejemplo que me sugeriste.

Por eso te digo, siempre tratando de ayudar a alguien, en el intento aprendo algo interesante que sirve para acrecentar mis
conocimientos y para hacer en la próxima vez, códigos más eficiente y en menos tiempo.


Muchas gracias de nuevo Greg por tu amable ayuda!!!

Saludos cordiales.
 
Upvote 0
Estimado Cesar

Disculpa la demora, pero me encontraba en terreno y no tengo tengo acceso al PC, probe el ultimo codigo que me enviaste y lamentablemente no funciona, ahora no copia el valor ni en la primera celda, perdona que sea majadero, pero yo conozco pocas instrucciones de VBA y de VB, pero esto se podría hacer con un ciclo FOR incrementando el valor de la celda y la función copiar cuando se cumpla la condición de hora, te lo escribo así por que no se la sintaxis del codigo, ojala me puedas ayudar

Un saludo

Juan
 
Upvote 0
...pero esto se podría hacer con un ciclo FOR incrementando el valor de la celda y la función copiar cuando se cumpla la condición de hora...

Si habla de dejar un bucle corriendo todo el tiempo, chequeando cada micro-segundo para ver si ya es la hora de hacer tal y tal, la respuesta sería ¡NO! [y :eeek: × 10 ] Usted no va a querer tener un bucle corriendo todo el tiempo poniendo su CPU al 100%. OnTime sí es la herramienta correcta.

Si entendí mal y habla de usar un bucle para encontrar la celda abierta, la forma que presenta César de utilizar .END(xlUp) es mucho más eficiente que un bucle para esto.

También para que sepa, ya en casos donde han habido varias versiones de código presentado y cambios hechos, siempre es buena idea poner el código es está usando en su post para asegurar que todos estémos en la misma página.
 
Upvote 0
Greg

Muchas gracias por su comentario, es bueno saber eso, puese como ejemplo lo del ciclo for para poder explicarme mejor, como lo comentaba anteriormente soy bastante debil en el conociemiento de los codigos y sintaxis de VBA, por eso hago preguntas bien basicas, lo que necesito es ir llenando columnas de 8 celdas cada 3 horas (una celda a la hora cero, la siguiente a la hora 3 y así), el valor viene de una celda fija que varia constantemente, por eso la comparación de horas, es para ir avanzando en la columna, si alguno desea le puedo enviar el archivo excel para que lo revisen y ahí pueden ver como es realmente.
Nuevamente les agradezco mucho su ayuda.

ATTE


Juan
 
Upvote 0
Hola Juan,

Entiendo que necesitás llenar un rango de celdas cada 3 horas para completar un día (3x8=24 horas). Lo que no entiendo aún es porqué no funciona el
código para vos, para mi funciona, no creo que sea la versión de Excel pero sería bueno saber qué versión de Excel tenés.

Aparte de eso sería bueno que subieras el archivo a algún servidor de archivos gratuito para que mostraras el enlace de descarga y poderlo bajar y así ver asegurar que funcione el archivo con que trabajás y agregar nuevamente detallado paso a paso el funcionamiento que se espera estaría mucho mejor.

Saludos cordiales
 
Upvote 0
Estimado Cesar

Hice funcionar el codigo que me mandaste en otro libro, funciona, realiza el copiado del valor de una celda a otras avanzando, pero no se detiene, continua avanzando.
Hice el ejercicio de poner en una celda el valor de la hora actual (use =ahora() )y ahí se detiene el avance del copiado, se queda quieta.
Creo que la rutina que me enviaste entra en conflicto con algo que tengo funcionanado en el libro, y debe ser el siguiente programita:

""""

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

""""

Que esta en el Workbook, ahí debe estar el problema, trata de enviarme tu correo para hacerte llegar el proyecto, ahí yo creo que veras bien mi problema.

ATTE

Juan
 
Upvote 0
Que bien que funcionó en tu caso de alguna forma, lo otro podría ser algo con el otro código que tenés como decís. Si querés enviar el archivo envié mi correo en mensaje privado.

Saludos
 
Upvote 0
Cesar, estoy probando el archivo que me enviaste, muchas gracias, en cuanto tenga novedades, te aviso.

ATTE

Juan
 
Upvote 0

Forum statistics

Threads
1,223,948
Messages
6,175,580
Members
452,653
Latest member
craigje92

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