Evitar que calcule dos veces

14/02/2006 - 12:02 por Marianoh | Informe spam
Hola a todos:

Tengo un libro donde se hace ingreso intensivo de datos, en una columna
del mismo se ingresa un código. Lo que he hecho es utilizar el evento
Workbook_SheetChange para:

A. Identificar la hoja donde el usuario escribió:
If Sh.Codename="EstaHojaMeInteresa" Then ...

B. Identificar la celda:
If Not Intersect(Range("EstaCeldaMeInteresa"), Target) Is Nothing
Then...

C. Tomar el valor ingresado: MiVariable=Target.Value...
D. Transformar ese valor en otra cadena sin hacer uso de ningún objeto
de Excel.
E. Devolver el valor a la celda: Target.Value=MiVariableTransformada...

Aparte de esto solo tengo un OnKey que cambia el enter del teclado
númerico por Tab.

Mi Problema:
Cada vez que el usuario ingresa un código la Num Lock del teclado
parpadea, y como el usuario ya está ingresando un número en la
siguiente celda, si escribe rápido ingresa por ejemplo AvPag en vez de
"3", lo que hace que termine cargando datos en cualquier parte.

Lo que observé, es que Excel calcula las fórmulas relacionadas
"antes" de lanzar el evento Woorkbook_SheetChange y, luego de que
cambia el valor por código, vuelve a calcular, lo que demora bastante.
Lamentablemente parece que no hay un evento Workbook_SheetBeforeChange
o algo parecido que me permita recibir el ingreso del usuario antes que
la hoja.

Cualquier ayuda realmente se agradece.

Saludos
 

Leer las respuestas

#1 KL
14/02/2006 - 23:20 | Informe spam
Hola Marianoh,

No creo entender completamente lo que hace tu macro (siempre mas vale un codigo completo que 1000 explicaciones :-)). Intuyo que lo
que buscas es esto:

Private Sub Workbook_SheetChange( _
ByVal Sh As Object, ByVal Target As Range)
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
' Tu codigo aqui...
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub

Tambien me llaman la atencion dos cosas:

1) If Sh.Codename="EstaHojaMeInteresa" Then
Si solo hay una hoja afectada (cosa que no se puede apreciar con seguridad por falta de codigo completo) es mejor usar el evento
Change de la hoja desde su respectivo modulo.

2) If Not Intersect(Range("EstaCeldaMeInteresa"), Target) Is Nothing
Usas el objeto Range no calificado incorrectamente. Si el rango cambiado no se encuentra en la hoja activa (p.ej. cambio de datos
por macro), ocurrira error por intentar buscar interseccion entre dos rangos que estan en hojas distintas: uno en la hoja activa y
otro en la hoja cambiada. Es mejor poner:

If Not Intersect(Sh.Range("EstaCeldaMeInteresa"), Target) Is Nothing

Saludos,
KL


"Marianoh" wrote in message news:
Hola a todos:

Tengo un libro donde se hace ingreso intensivo de datos, en una columna
del mismo se ingresa un código. Lo que he hecho es utilizar el evento
Workbook_SheetChange para:

A. Identificar la hoja donde el usuario escribió:
If Sh.Codename="EstaHojaMeInteresa" Then ...

B. Identificar la celda:
If Not Intersect(Range("EstaCeldaMeInteresa"), Target) Is Nothing
Then...

C. Tomar el valor ingresado: MiVariable=Target.Value...
D. Transformar ese valor en otra cadena sin hacer uso de ningún objeto
de Excel.
E. Devolver el valor a la celda: Target.Value=MiVariableTransformada...

Aparte de esto solo tengo un OnKey que cambia el enter del teclado
númerico por Tab.

Mi Problema:
Cada vez que el usuario ingresa un código la Num Lock del teclado
parpadea, y como el usuario ya está ingresando un número en la
siguiente celda, si escribe rápido ingresa por ejemplo AvPag en vez de
"3", lo que hace que termine cargando datos en cualquier parte.

Lo que observé, es que Excel calcula las fórmulas relacionadas
"antes" de lanzar el evento Woorkbook_SheetChange y, luego de que
cambia el valor por código, vuelve a calcular, lo que demora bastante.
Lamentablemente parece que no hay un evento Workbook_SheetBeforeChange
o algo parecido que me permita recibir el ingreso del usuario antes que
la hoja.

Cualquier ayuda realmente se agradece.

Saludos

Preguntas similares