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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Marianoh
15/02/2006 - 06:35 | Informe spam
Bueno KL, gracias por tu interés.
Aclaro dudas, pego el ccódigo, y te comento hasta donde llegué:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
Dim NISDummy As String

If Target.Cells.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Select Case Sh.CodeName
Case "PRMT"
If Intersect(Target, Range("NIS")) Is Nothing Then Exit Sub
Case "PRBA"
If Intersect(Target, Range("NISBA")) Is Nothing Then Exit Sub
Case "CAMBIO"
If Intersect(Target, Range("CAMBIONIS")) Is Nothing Then Exit
Sub
Case Else: Exit Sub
End Select

'Esta Función verifica si la cadena ingresada cumple con determinadas
'condiciones y si es así la transforma en otra más larga que es la
que necesito
NISDummy = ValidarNIS(Target.Value)

If Target.Value <> NISDummy Then
Target.Value = ValidarNIS(Target.Value)
End If
End Sub

Private Sub Workbook_Activate()
Application.OnKey "{Enter}", "Tabular"
End Sub

Private Sub Workbook_Deactivate()
Application.OnKey "{Enter}"
End Sub

'Y en un modulo normal...
Private Sub Tabular()
SendKeys "{Tab}"
End Sub

Ahora:
1- No tengo código en las hojas, ya que luego del proceso corre una
macro que copia las hojas que interesan al cliente en otro libro y lo
envía por mail. El cliente no acepta libros con macros.
2- No había escrito el código correctamente, como verás hay
varias hojas y los rangos están nombrados y son distintos en cada
hoja.
La idea es que en todos los lugares de mi libro donde se incluye un
código de este tipo, pueda escribirlo en forma abreviada y numérica,
y la macro lo transforme en el código final, largo y alfanúmerico. De
hecho esto está en funcionamiento.

Una duda y un problema: 1- Este libro está lleno de Lookups y
demas, por lo que Excel calcula todas las fórmulas dependientes (que
por supuesto dan error), luego llama al evento, cambia el valor de la
celda y calcula nuevamente todas las fórmulas esta vez correctamente.
No encuentro un evento donde poner la macro para evitar esta
situación. Mi duda es si esto es así.

2- Mi problema: Bueno está relacionado con SendKeys, asique lo
pongo en otro post (Digamos: SendKeys y Num Lock) para abrir el tema.

Desde ya muchas gracias...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida