Actualizar celdas con función personalizadas

He creado una función en excel 2007 y necesito que refresque el resultado dado un cambio en otras celdas. La ocupo en muchas otras celdas, pero al cambiar el valor de una no se como indicarle a la función que recalcule.
No le estoy pasando la celda propiamente tal, sino más bien una referencia a ella como un string, como le indico.
Function Calcula(Celda as string) As String
Dim R1 Range
Set R1 = Range(Celda )
If R1.Value > 10 then
calcula="algo"
elseIf R1.Value > 15
calcula="otra cosa"
end if
End Function

1 respuesta

Respuesta
1
Si entiendo bien el problema que tienes, la solución consiste en usar el evento
Worksheet_Change. Por ejemplo:
Private Sub Worksheet_Change(ByVal target As Range)
Application.EnableEvents = False
If Not Intersect(target, Range("A1")) Is Nothing Then
Worksheets(1).Rows(2).Calculate
End if
Application.EnableEvents = True
End sub
Esto fuerza el recalculo de la segunda fila en la primera hoja cuando cambia la celda A1 de la hoja actual.
También podrías pensar en el evento Worksheet_Calculate() que se disapara cuando hay un cálculo en la hoja.
Ojo. Ambos eventos han de programarse en una hoja, no en un módulo. Sí que es posible llamar desde ellos a funciones y procedimientos descritos en módulos.
Hola. Gracias por tu ayuda, funciona, pero tengo más dudas.
If Not Intersect(target, Range("A1")) Is Nothing Then
Worksheets(1).Rows(2).Calculate
Worksheets(1).Rows(3).Calculate
Worksheets(1).Rows(4).Calculate
Worksheets(1).Rows(5).Calculate
End if
Esas son todas las filas que se deberían actualizar si cambio una celda en alguna de esas filas, pero solo me funciona para una sola fila, las restantes no se actualizan, ya que si se modifica el valor de una celda de una de esas filas, influye en el resultado de las otras.
No se si me he espxlicado bien. Gracias por su ayuda.
En el código el recalculo se ejecuta cuando camnbia la celda A1. Si necesitas que se ejecute con otros cambios deberás cambiar ese rango por otro, por ejemplo las cuadro primeras filas, o las las cuatro primeras celdas de la columna 1 o quitar el If si quieres que cualquier cambio "dispare" el recalculo.
Ten en cuenta que al entrar en la función se desactivan los eventos y luego se vuelven a activar. Esto es para evitar referencias circulares. Es decir que un cambio no desencadena otros cambios, que a su vez desencadenan cambios nuevos y así sucesivamenete en un proceso que no acaba nunca y deja el programa sin respuesta. Si estas seguro que esto no pasa puedes quitarlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas