viernes, 3 de diciembre de 2010

Parpadeo de un dato elegido


(No sigas leyendo si no te interesa la programación de macros en OpenOffice.org)

En algunas situaciones prácticas podemos tener una gran abundancia de datos que hagan casi imposible su exploración visual. Entre ellos pueden existir algunos cuya ubicación nos interese. Por ejemplo, un lector me indicaba que para él sería útil que se destacaran los pagos que vencieran en la fecha actual. Así, cada vez que abriera la hoja, encontraría parpadeando los que hubieran llegado a su fecha.

No es fácil conseguir que parpadeen las celdas que contengan un dato que nos interese. Por eso nos vamos a tener que basar en unos datos previos que le indiquen a la hoja de cálculo qué tiene que buscar, dónde y cuántos segundos ha de mantener el parpadeo. Con más calma quizás se pudiera prescindir de alguno de ellos, pero el tema no merece más atención.

En la imagen vemos una posible cabecera. En las celdas situadas debajo podemos imaginarnos que existen grandes cantidades de datos, y que entre ellos está el elegido. En este caso hemos usado una fecha 07/11/45 y deberán parpadear todas las celdas inferiores que la contengan.



La macro que construyamos deberá leer las celdas y asignarles una variable. Supongamos que en E6 se lee Valor, en G6 Fila, H6 Columna y J6 Pausa. Esas son las variables que usaremos en el código Basic.

Una vez leídas se inician también t0, que leerá el reloj interno (timer) e indi, que llevará la cuenta de las celdas que contienen el dato elegido. También hay que preparar memorias fil y col que nos indiquen dónde está situado el dato.

Así, la estructura de nuestra macro podría ser:

(A) Se leen las variables 

Leemos Valor, Fila, Columna y Pausa, el reloj en t0 y se pone a cero el contador de veces que aparece el dato (indi) y las memorias fil y col

pausa=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(9,5).value
valor=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(4,5).value
fila=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(6,5).value
columna=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(7,5).value
t0=timer
t1=t0
indi=0
for i=0 to 50:fil(i)=0:col(i)=0:next i


(B) Se recorren las filas y columnas. 

Cuando se encuentre el dato elegido se incrementa indi y se rellenan fil(indi) y col(indi) con la referencia de la celda.

(C) Se programa una pausa temporal. 

Se puede hacer con esta rutina:

t1=t0
while t1
‘Se realiza el trabajo de recorrer celdas y parpadear
t1=timer
wend


La hora del reloj está almacenada en t0. La otra variable t1 va leyendo el timer y cuando sobrepasa la pausa se detiene. Dentro del bucle se realiza el parpadeo.

(D) Parpadeo de las celdas elegidas

Consistirá simplemente en asignar dos colores distintos a las celdas y separarlos mediante un pequeño intervalo de tiempo:

if indi>0 then
for i=1 to indi
StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(col(i),fil(i)).cellbackcolor=rgb(255,100,200)
next i
end if

‘colorea de rojo apagado

for i=1 to 1e4:next i

‘mantiene ocupado el ordenador por un tiempo

if indi>0 then
for i=1 to indi
StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(col(i),fil(i)).cellbackcolor=rgb(255,255,255)
next i


‘Vuelve a colorear de blanco

Como ejercicio de programación es divertido. Seguro que alguien lo puede mejorar. 

Copiamos a continuación todo el código en Basic de OpenOffice.org

Sub parpadeo
dim pausa,valor,fila,columna,celda
dim t0,t1,i,j,k,indi
dim fil(50),col(50)

pausa=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(9,5).value
valor=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(4,5).value
fila=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(6,5).value
columna=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(7,5).value

t0=timer
t1=t0
indi=0
for i=0 to 50:fil(i)=0:col(i)=0:next i
for i=8 to fila
for j=1 to columna
celda=StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(j,i).value
if celda=valor then

indi=indi+1
fil(indi)=i:col(indi)=j
end if
next j
next i
while t1

if indi>0 then
for i=1 to indi
StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(col(i),fil(i)).cellbackcolor=rgb(255,100,200)
next i
end if
for i=1 to 1e4:next i
if indi>0 then
for i=1 to indi
StarDesktop.CurrentComponent.sheets(0).GetCellByPosition(col(i),fil(i)).cellbackcolor=rgb(255,255,255)
next i
end if
t1=timer
wend

End Sub

1 comentario:

Anónimo dijo...

Muy buena información.
Muchisimas gracias.