FUNCION(es) UDFs ???

10/02/2009 - 06:54 por Orfao | Informe spam
Hola Grupo !

En una fila 20 tengo desde la columna AN hasta la BK diferentes valores,
Algunas de las celdas tienen color de fondo verde (indican que sus
cantidades ya se han relacionado) y deseo sumar solo las que no tengan fondo
verde.
para lograrlo cree algunas UDFs.
Y utilizo lo siguiente:
=Scolor(AN20,BK20,$F$6)

donde F6 indica la nombre de la hoja donde aplico la funcion ej: "BB-O"


La pregunta es: Como optimizar esta funcion ?
como introducir directamente el rango en forma AN20:BK20 ?
o, en caso de ser varias filas ??
o simplemente varias filas y una sola columna ???
alguna otra forma/metodo/ for endfor do while with xext ,???etc. para
agilizar el calculo ??

el calculo lo realizo en cerca de cien hojas y en aproc doscientas filas es
decir que la funcion scolor() aparece en aprox 20000 celdas
? como crear una funcion que 'funcione" con algo asi como esto:
= sumar.si (color(an20:ak20),an20:ak20,0) o introucida en forma matricial ???
Cuando ejecuto paso a paso he notado que se recalculan todas las formulas
scolor,
como hacer para que se recalculen solamente las de la hoja activa???
como introducirlo de la forma scolor(Fila inicial,Columna inicial,Fila
Final,Columna Final,Hoja as name)


En un modulo coloque:
****
Option Explicit
Function scolor(A As Range, B As Range, H As Range)
Application.Volatile
Dim X As Integer
Dim V As Variant
Dim C As Integer
Dim F As Variant
Dim G As Variant
Set F = Application.ThisWorkbook.Worksheets(H.Value)
scolor = 0
C = A.Row
For X = A.Column To B.Column
V = F.Cells(C, X).Interior.color
scolor = scolor + IIf(V = RGB(255, 255, 255), F.Cells(C, X), 0)
Next
End Function
' En este caso solo suma las que tengan fondo blanco
****
Public Function color(A As Range) As Long
Application.Volatile
color = A.Interior.color
End Function
****
Public Function NOMBREH()
NOMBREH = Application.ActiveSheet.Name
End Function
****
con respecto a la funcion nombre como hago para que me devuelva el nombre de
la hoja en la que introduzco NOMBREH() y no en la activa ???

(he leido que no existe forma de identificar un nombre de hoja a menos que
el libro se haya guardado previamente ??? con este metoodo pasa lo mismo??? )

Gracias de antemano.. por sus
ideras/sugerencias/recomendaciones/soluciones/observaciones/comentarios ... y
disculpen un solo post para diferentes problemas pero todo tiene relacion y
pertenecen a un problema comun..

agradezco me envien informacion acerca de links con
ejemplos/metodos/formas/maneras de Programar UDFs y como optimizarlas...

y ... otra preguntica e mas: que es recomendable usar formunas en forma
matricial ctrl+shift+enter o replicarlas en todos los rangos , cual medodo es
mas efectivo, mas rapido, ocupa menos memoria,etc.


Me alimento del conocimiento de todos
Me alimento del conocimiento de todos
 

Leer las respuestas

#1 Héctor Miguel
10/02/2009 - 07:23 | Informe spam
hola, moises !

en tu consulta hay "topicos" que ya hemos tratado en conversaciones anteriores (p.e.)

- en marzo de 2007, en una consulta similar hablando de causas de lentitud en los (re)calculos en excel...
=segun Charles Williams [http://www.decisionmodels.com/optspeedb.htm] en la mitad de este articulo "dice":
a) "no es el numero de formulas lo que consume el tiempo de re/calculo...
es el numero de referencias a celdas en las operaciones del re/calculo"
b) "mueve calculos repetitivos "fuera", a celdas auxiliares...
evita el uso de 'megaformulas' complejas...
mantenlo simple y usa mas formulas, son mas rapidas de calcular -generalmente-"
-> hay mucho mas 'material' acerca de los 'cuellos de botella' en los re/calculos de modelos en excel
=
- en junio de 2008, hablando de funciones personalizadas con la instruccion "volatile"...
=podrias analizar (de criterios expertos) algunas de las posibles causas (quiza combinadas) en la pagina de Charles Williams (p.e.)
- Status Bar Shows “CALCULATE”
http://www.decisionmodels.com/calcsecretsf.htm
- User-Defined Functions
http://www.decisionmodels.com/calcsecretsj.htm
- Unexpectedly returning #Value, the wrong answer, or being recalculated more than once.
http://www.decisionmodels.com/calcs....htm#value
- (otros temas relacionados):
- Dependency Trees
http://www.decisionmodels.com/calcsecretsd.htm
- Volatile Functions [posibles causas de volatilidad en los re/calculos]:
http://www.decisionmodels.com/calcsecretsi.htm
- Circumstances causing a formula to be evaluated
http://www.decisionmodels.com/calcsecretsb.htm
=
hay mucho material en las paginas de Charles Williams para (tratar de) encontrar la solucion que necesitas

si cualquier duda (o informacion adicional mas... "concretizada")... comentas ?
saludos,
hector.

__ OP __
En una fila 20 tengo desde la columna AN hasta la BK diferentes valores,
Algunas de las celdas tienen color de fondo verde (indican que sus
cantidades ya se han relacionado) y deseo sumar solo las que no tengan fondo verde.
para lograrlo cree algunas UDFs. Y utilizo lo siguiente:
=Scolor(AN20,BK20,$F$6)
donde F6 indica la nombre de la hoja donde aplico la funcion ej: "BB-O"
La pregunta es: Como optimizar esta funcion ?
como introducir directamente el rango en forma AN20:BK20 ?
o, en caso de ser varias filas ??
o simplemente varias filas y una sola columna ???
alguna otra forma/metodo/ for endfor do while with xext ,???etc. para agilizar el calculo ??
el calculo lo realizo en cerca de cien hojas y en aproc doscientas filas es
decir que la funcion scolor() aparece en aprox 20000 celdas
? como crear una funcion que 'funcione" con algo asi como esto:
= sumar.si (color(an20:ak20),an20:ak20,0) o introucida en forma matricial ???
Cuando ejecuto paso a paso he notado que se recalculan todas las formulas
scolor,
como hacer para que se recalculen solamente las de la hoja activa???
como introducirlo de la forma scolor(Fila inicial,Columna inicial,Fila
Final,Columna Final,Hoja as name)


En un modulo coloque:
****
Option Explicit
Function scolor(A As Range, B As Range, H As Range)
Application.Volatile
Dim X As Integer
Dim V As Variant
Dim C As Integer
Dim F As Variant
Dim G As Variant
Set F = Application.ThisWorkbook.Worksheets(H.Value)
scolor = 0
C = A.Row
For X = A.Column To B.Column
V = F.Cells(C, X).Interior.color
scolor = scolor + IIf(V = RGB(255, 255, 255), F.Cells(C, X), 0)
Next
End Function
' En este caso solo suma las que tengan fondo blanco
****
Public Function color(A As Range) As Long
Application.Volatile
color = A.Interior.color
End Function
****
Public Function NOMBREH()
NOMBREH = Application.ActiveSheet.Name
End Function
****
con respecto a la funcion nombre como hago para que me devuelva el nombre de
la hoja en la que introduzco NOMBREH() y no en la activa ???

(he leido que no existe forma de identificar un nombre de hoja a menos que
el libro se haya guardado previamente ??? con este metoodo pasa lo mismo??? )

Gracias de antemano.. por sus
ideras/sugerencias/recomendaciones/soluciones/observaciones/comentarios ... y
disculpen un solo post para diferentes problemas pero todo tiene relacion y
pertenecen a un problema comun..

agradezco me envien informacion acerca de links con
ejemplos/metodos/formas/maneras de Programar UDFs y como optimizarlas...

y ... otra preguntica e mas: que es recomendable usar formunas en forma
matricial ctrl+shift+enter o replicarlas en todos los rangos , cual medodo es
mas efectivo, mas rapido, ocupa menos memoria,etc.

Preguntas similares