Worksheet_Calculate

11/10/2006 - 19:40 por ~ jose ~ | Informe spam
Hola,

Tengo una hoja que en la columna 'P' hay formulas, y quiero que se
ejecute una macro cuando cambian los valores.
He probado con esto pero no funciona.

Private Sub Worksheet_Calculate()
If Not (Intersect(Target, [P2:P65536]) Is Nothing) Then
Call Actualizar_almacen.Actualizar_almacen
End If
End Sub

Supongo que está mal la instrucción 'If', esta instrucción la he
empleado con exito en el evento change para otras cosas pero aquí no
se como aplicarla.

Un saludo,
jose

Preguntas similare

Leer las respuestas

#1 ~ jose ~
11/10/2006 - 21:05 | Informe spam
Hola, antes habia escrito un post sobre 'Worksheet_Calculate', pero voy
a cambiar la forma de exponerlo ya que igual me decis otra forma en vez
de utilizar 'Worksheet_Calculate'.

Tengo en la columna 'P' formulas y quiero que cuando cambien el valor
de estas, se ejecute una macro. Que codigo me hace falta y donde tengo
que colocarlo?

Gracias,
jose


~ jose ~ wrote:
Hola,

Tengo una hoja que en la columna 'P' hay formulas, y quiero que se
ejecute una macro cuando cambian los valores.
He probado con esto pero no funciona.

Private Sub Worksheet_Calculate()
If Not (Intersect(Target, [P2:P65536]) Is Nothing) Then
Call Actualizar_almacen.Actualizar_almacen
End If
End Sub

Supongo que está mal la instrucción 'If', esta instrucción la he
empleado con exito en el evento change para otras cosas pero aquí no
se como aplicarla.

Un saludo,
jose
Respuesta Responder a este mensaje
#2 Héctor Miguel
12/10/2006 - 01:59 | Informe spam
hola, jose !

[hasta donde se]... si el 'cambio' en las celdas es por resultado de formulas/funciones...

1) el evento '_change' NO se dispara
2) necesitas usar el evento '_calculate'
3) si necesitas 'controlar' -solo- 'ciertas' celdas con formulas...
a) podrias utilizar variables 'estaticas' o...
b) podrias usar el evento '_change'... si [y siempre y cuando] hagas referencia a las celdas 'precedentes' ;)

si expones las formulas y las celdas... :D
saludos,
hector.

__ esta consulta __
... sobre 'Worksheet_Calculate'... voy a cambiar la forma de exponerlo ya que igual me decis otra forma en vez de... 'Worksheet_Calculate'.
Tengo en la columna 'P' formulas y quiero que cuando cambien el valor de estas, se ejecute una macro.
Que codigo me hace falta y donde tengo que colocarlo?



__ de la consulta anterior __
Private Sub Worksheet_Calculate()
If Not (Intersect(Target, [P2:P65536]) Is Nothing) Then
Call Actualizar_almacen.Actualizar_almacen
End If
End Sub
... esta instruccion la he empleado con exito en el evento change para otras cosas pero aqui nose como aplicarla
Respuesta Responder a este mensaje
#3 ~ jose ~
12/10/2006 - 13:42 | Informe spam
Hola,

3) si necesitas 'controlar' -solo- 'ciertas' celdas con formulas...
a) podrias utilizar variables 'estaticas' o...



Como seria un ejemplo para utilizar variables estáticas?
El rango o columna donde tengo las formulas son en 'P2:P65536'

Un saludo,
jose
Respuesta Responder a este mensaje
#4 Héctor Miguel
13/10/2006 - 02:45 | Informe spam
hola, jose !

3) si necesitas 'controlar' -solo- 'ciertas' celdas con formulas...
a) podrias utilizar variables 'estaticas' o...



Como seria un ejemplo para utilizar variables estaticas?
El rango o columna donde tengo las formulas son en 'P2:P65536'



1) 'asumo' que el rango que comentas ['P2:P65536'] es -solo- para 'cubrir' n_celdas/formulas... 'por si las dudas' -???-
[o lo que es lo mismo] no creo que de ~65k formulas, la 'unica ?' que pudiera variar en su resultado fuera -solo- la ultima -???-
[dicho de otro modo]... 'mantener' ~65k variables... -> estaticas ? [no seria 'sano'... y mucho menos... 'funcional'] :D

2) [probablemente] resultaria mas rapido actualizar y comparar una matriz [de tipo 'Variant' por la posible diversidad de datos]
y mediante un bucle de 'revision'... detectar -solo- el primer elemento/celda/formula/... donde hubiera ocurrido algun 'cambio'

3) estoy suponiendo que -todas- las celdas de un rango 'especifico' [indicado por numero de fila -p.e. 2 a 500] son formulas -?-
[probablemente se pueda agilizar si se condiciona la comparacion a que la celda 'en revision' -efectivamente- tenga formula] ?

4) te paso codigo [de ejemplo] para pegar en el modulo de codigo de 'la hoja' donde esta el rango con las formulas ;)
y algunos comentarios que necesitaras revisar... 'hablando' de matrices, tipos de datos, limites. memoria, rapidez, etc. etc. etc.

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

A) copia/pega las siguientes lineas -> en el modulo de codigo de 'esa' hoja...
solo detecta cambios en celdas/formulas de la columna 'P' en las filas 2 a 501
puedes modificar si lo consideras necesario/apropiado/... [NO olvides revisar las 'notas' y enlaces] :D

Private Valores(500)
Dim Fila As Long
Private Sub Worksheet_Calculate()
If Valores_cambiaron Then
MsgBox "Se han detectado cambios en los resultados..."
Toma_valores ' para actualizar la matriz a los 'nuevos' valores '
' aqui puedes ejecutar otras acciones en caso de cambios en resultados de formulas '
End If
End Sub
Private Function Toma_valores()
For Fila = 2 To 501
Valores(Fila - 2) = Me.Range("p" & Fila)
Next
End Function
Private Function Valores_cambiaron() As Boolean
For Fila = 2 To 501
If Valores(Fila - 2) <> Me.Range("p" & Fila) _
Then Valores_cambiaron = True: Exit For
Next
End Function

B) notas:
las matrices de cualquier tipo de datos requieren 20 bytes de memoria
- mas cuatro bytes para cada dimension de matriz
- mas el numero de bytes que ocupan los propios datos [p.e.]
una matriz unidimensional de cuatro elementos tipo Integer de dos bytes cada uno -> 'consume' memoria en 32 bytes
- 8 bytes que requieren los datos mas los 20+4 bytes necesarios para la matriz
una matriz de tipo 'Variant' requiere 12 bytes mas que la matriz por si sola

C) enlaces:
Limitaciones de pasar matrices a Excel
http://support.microsoft.com/kb/q177991/
Respuesta Responder a este mensaje
#5 ~ jose ~
13/10/2006 - 21:03 | Informe spam
Madre mia que trabajo te he hecho hacer!!!
creia que iba a ser una respuesta tipo a:

Private Sub Worksheet_Calculate()
If Not (Intersect(Target, [P2:P65536]) Is Nothing) Then
Call miMacro 'o el código
End If
End Sub


Gracias, voy a probarlo,
un saludo,
jose
PD: hablamos de 3680 filas, son muchas filas para lo que hablamos?

Héctor Miguel wrote:
hola, jose !

>> 3) si necesitas 'controlar' -solo- 'ciertas' celdas con formulas...
>> a) podrias utilizar variables 'estaticas' o...
>
> Como seria un ejemplo para utilizar variables estaticas?
> El rango o columna donde tengo las formulas son en 'P2:P65536'

1) 'asumo' que el rango que comentas ['P2:P65536'] es -solo- para 'cubrir' n_celdas/formulas... 'por si las dudas' -???-
[o lo que es lo mismo] no creo que de ~65k formulas, la 'unica ?' que pudiera variar en su resultado fuera -solo- la ultima -???-
[dicho de otro modo]... 'mantener' ~65k variables... -> estaticas ? [no seria 'sano'... y mucho menos... 'funcional'] :D

2) [probablemente] resultaria mas rapido actualizar y comparar una matriz [de tipo 'Variant' por la posible diversidad de datos]
y mediante un bucle de 'revision'... detectar -solo- el primer elemento/celda/formula/... donde hubiera ocurrido algun 'cambio'

3) estoy suponiendo que -todas- las celdas de un rango 'especifico' [indicado por numero de fila -p.e. 2 a 500] son formulas -?-
[probablemente se pueda agilizar si se condiciona la comparacion a que la celda 'en revision' -efectivamente- tenga formula] ?

4) te paso codigo [de ejemplo] para pegar en el modulo de codigo de 'la hoja' donde esta el rango con las formulas ;)
y algunos comentarios que necesitaras revisar... 'hablando' de matrices, tipos de datos, limites. memoria, rapidez, etc. etc. etc.

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

A) copia/pega las siguientes lineas -> en el modulo de codigo de 'esa' hoja...
solo detecta cambios en celdas/formulas de la columna 'P' en las filas 2 a 501
puedes modificar si lo consideras necesario/apropiado/... [NO olvides revisar las 'notas' y enlaces] :D

Private Valores(500)
Dim Fila As Long
Private Sub Worksheet_Calculate()
If Valores_cambiaron Then
MsgBox "Se han detectado cambios en los resultados..."
Toma_valores ' para actualizar la matriz a los 'nuevos' valores '
' aqui puedes ejecutar otras acciones en caso de cambios en resultados de formulas '
End If
End Sub
Private Function Toma_valores()
For Fila = 2 To 501
Valores(Fila - 2) = Me.Range("p" & Fila)
Next
End Function
Private Function Valores_cambiaron() As Boolean
For Fila = 2 To 501
If Valores(Fila - 2) <> Me.Range("p" & Fila) _
Then Valores_cambiaron = True: Exit For
Next
End Function

B) notas:
las matrices de cualquier tipo de datos requieren 20 bytes de memoria
- mas cuatro bytes para cada dimension de matriz
- mas el numero de bytes que ocupan los propios datos [p.e.]
una matriz unidimensional de cuatro elementos tipo Integer de dos bytes cada uno -> 'consume' memoria en 32 bytes
- 8 bytes que requieren los datos mas los 20+4 bytes necesarios para la matriz
una matriz de tipo 'Variant' requiere 12 bytes mas que la matriz por si sola

C) enlaces:
Limitaciones de pasar matrices a Excel
http://support.microsoft.com/kb/q177991/
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida