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)

Preguntas similare

Leer las respuestas

#11 Héctor Miguel
12/06/2009 - 22:58 | Informe spam
hola, Jorge !

... para lo que me preguntas: >> Desde: -> 01/01/2009 >> Hasta: -> 23/01/2009
El resultado seria 15 y si cambias la fecha por 24/01/2009 o 25/01/2009 tambien da 15 porque sigue siendo 15 dias habiles
ya a partir del 26/01/2009 los dias habiles son 16 y... la formula hace que de 18 tomando 3 dias mas calendario a partir del 23/01/2009
Espero te sirva el dato



asumiendo que la tabla de este ejemplo esta en el rango [B2:C32] (col-B=fechas y colC=unos y ceros -habiles o no)
y que las fechas Desde y Hasta estan en los rangos [E2] y [E3]
la siguiente formula (de entrada matricial: ctrl + shift + enter) produce el mismo resultado que la funcion personalizada

OJO que debe sr en una sola linea y mi separador de argumentos es la coma ',' NO el punto y coma ';' :D

=si(suma((b2:b32>e2)*(b2:b32<ã)*c2:c32)<16,suma((b2:b32>e2)*(b2:b32<ã)*c2:c32),
15+e3-desref(b2,coincidir(e2+1,b2:b32)-1+coincidir(15,subtotales(9,desref(c2,coincidir(e2+1,b2:b32)-1,,fila(indirecto("1:"&filas(b2:b32))),)),0)-1,))

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

__ OP __
... la formula nativa ni la pude hacer ...
Un rango de fechas seria: (es como una base de datos pero la tengo desde el a#o pasado hasta el 2013, ver:
http://www.cuandoenelmundo.com/cale...ombia/2009)

31/12/2008 1
01/01/2009 0
02/01/2009 1
03/01/2009 0
04/01/2009 0
05/01/2009 1
06/01/2009 1
07/01/2009 1
08/01/2009 1
09/01/2009 1
10/01/2009 0
11/01/2009 0
12/01/2009 0
13/01/2009 1
14/01/2009 1
15/01/2009 1
16/01/2009 1
17/01/2009 0
18/01/2009 0
19/01/2009 1
20/01/2009 1
21/01/2009 1
22/01/2009 1
23/01/2009 1
24/01/2009 0
25/01/2009 0
26/01/2009 1
27/01/2009 1
28/01/2009 1
29/01/2009 1
30/01/2009 1

Un ejemplo: Desde: 01/01/2009 Hasta: 26/01/2009 debe dar 18
porque cuenta hasta la fecha donde se cumplen los 15 dias habiles que es el 23 (un viernes)
y lo que es 24, 25 y 26 son 3 dias mas (pero calendario), por eso da 18...
Respuesta Responder a este mensaje
#12 Héctor Miguel
13/06/2009 - 06:07 | Informe spam
hola (de nuevo), Jorge !

... para lo que me preguntas: >> Desde: -> 01/01/2009 >> Hasta: -> 23/01/2009
El resultado seria 15 y si cambias la fecha por 24/01/2009 o 25/01/2009 tambien da 15 porque sigue siendo 15 dias habiles
ya a partir del 26/01/2009 los dias habiles son 16 y... la formula hace que de 18 tomando 3 dias mas calendario a partir del 23/01/2009





(segun pruebas) a partir de cuando menos 10 dias habiles "en la cuenta", la unica parte de la formula anterior que necesitas es:
+e3-desref(b2,coincidir(e2+1,b2:b32)-1+coincidir(15,subtotales(9,desref(c2,coincidir(e2+1,b2:b32)-1,,fila(indirecto("1:"&filas(b2:b32))),)),0)-1,)

(y sigue siendo de entrada matricial: ctrl + shift + enter)

saludos,
hector.
Respuesta Responder a este mensaje
#13 Yrjo, Inc.
16/06/2009 - 15:18 | Informe spam
Mil gracias de nuevo por todo, funciona perfecto y voy a tener que aprender
más de esas otras funciones que no conozco

Jorge M

"Yrjo, Inc." wrote:

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)

Respuesta Responder a este mensaje
#14 Yrjo, Inc.
10/07/2009 - 18:22 | Informe spam
Mil gracias de nuevo por todo, funciona perfecto

"Héctor Miguel" wrote:

hola (de nuevo), Jorge !

>> ... para lo que me preguntas: >> Desde: -> 01/01/2009 >> Hasta: -> 23/01/2009
>> El resultado seria 15 y si cambias la fecha por 24/01/2009 o 25/01/2009 tambien da 15 porque sigue siendo 15 dias habiles
>> ya a partir del 26/01/2009 los dias habiles son 16 y... la formula hace que de 18 tomando 3 dias mas calendario a partir del 23/01/2009

(segun pruebas) a partir de cuando menos 10 dias habiles "en la cuenta", la unica parte de la formula anterior que necesitas es:
+e3-desref(b2,coincidir(e2+1,b2:b32)-1+coincidir(15,subtotales(9,desref(c2,coincidir(e2+1,b2:b32)-1,,fila(indirecto("1:"&filas(b2:b32))),)),0)-1,)

(y sigue siendo de entrada matricial: ctrl + shift + enter)

saludos,
hector.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida