Func personalizada->sumaproducto 2

10/06/2009 - 19:31 por Yrjo, Inc. | Informe spam
Buenas tardes Héctor Miguel, la solución que me diste fue perfecta pero ahora
me encontré con otra situación y es que cuando yo pongo el rango de fechas y
los importes como me indicaste en otra hoja, no funciona.

Si llamo la función con algo así no se calcula:
=EnRangoDeFechas(DiasHabiles!$A$2:$A$2196,F2,G2,DiasHabiles!$C$2:$C$2196)

Cómo hago para poder hacer esto en hojas o libros diferentes y que conserve
la ruta completa y por lo tanto arroje el resultado

Gracias

hola, Jorge !


... puede incluir... sumaproducto en una funcion personalizada
asi como por ejemplo subtotal puede ser con Application.Subtotal.
Cual puedo usar con sumarpoducto y que pueda poner condicionales como cuando en excel escribo:
=SUMAPRODUCTO(($A$2:$A$2196>F2)*($A$2:$A$2196<=G2)*($C$2:$C$2196))



aunque puedes usar funciones de hoja de calculo (como suproduct) desde vba...
la evaluacion de formulas que trabajan de forma matricial no tiene soporte
en vba
necesitas preguntarle a excel (la aplicacion donde esta corriendo el vba)
cual seria el resultado
lo cual, puedes hacer (en vba) por medio de la funcion evaluate("texto"), p.e.

esta funcion personalizada (en teoria) "debiera" funcionar (pero NO
funciona)...

Function EnRangoDeFechas( _
Fechas As Range, _
Desde As Date, _
Hasta As Date, _
Importes As Range) As Double
EnRangoDeFechas = Application.SumProduct( _
(Fehas > Desde) * _
(Fechas <= Hasta) * _
Importes)
End Function

si la reemplazas por otra (utilizando el metodo evaluate), si funciona (p.e.)

Function EnRangoDeFechas( _
Fechas As Range, _
Desde As Date, _
Hasta As Date, _
Importes As Range) As Double
EnRangoDeFechas = Evaluate("sumproduct((" & _
Fechas.Address & ">" & CLng(Desde) & ")*(" & _
Fechas.Address & "<=" & CLng(Hasta) & ")*" & _
Importes.Address & ")")
End Function

y su llamada (en la hoja de calculo) la harias de la siguiente forma
(dependiento de tu separador de argumentos):

=EnRangoDeFechas($A$2:$A$2196,F2,G2,$C$2:$C$2196)

si necesitas alternar/cambiar/modificar/... los operadores de comparacion
(>, <=, otros y/o en otro orden)
(obviamente) sera necesario (re)adaptar las instrucciones de la funcion (o
aumentar parametros/argumentos) (?)

saludos,
hector.

p.d. (creo que) es mas sencillo aprovechar las funciones "nativas" de excel,
que tratar de "inventar el hilo negro" (por vba)
 

Leer las respuestas

#1 Héctor Miguel
10/06/2009 - 20:45 | Informe spam
hola, Jorge!

... me encontre con otra situacion y es que cuando yo pongo el rango de fechas y los importes... en otra hoja, no funciona.
Si llamo la funcion con algo asi no se calcula:
=EnRangoDeFechas(DiasHabiles!$A$2:$A$2196,F2,G2,DiasHabiles!$C$2:$C$2196)
Como hago para poder hacer esto en hojas o libros diferentes y que conserve la ruta completa y por lo tanto arroje el resultado ...



solo cambia la forma en que se determina el "Address" de los argumentos-rango de Fechas e Importes por algo +/- asi:

Function EnRangoDeFechas( _
Fechas As Range, _
Desde As Date, _
Hasta As Date, _
Importes As Range) As Double
EnRangoDeFechas = Evaluate("sumproduct((" & _
Fechas.Address(External:=True) & ">" & CLng(Desde) & ")*(" & _
Fechas.Address(External:=True) & "<=" & CLng(Hasta) & ")*" & _
Importes.Address(External:=True) & ")")
End Function

saludos,
hector.

Preguntas similares