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

#6 Yrjo, Inc.
11/06/2009 - 17:39 | Informe spam
Hola Héctor, mira te cuento lo que estoy haciendo: es sólo tratar de hallar
los días hábiles en mi país basado en una tabla con fechas y unos y ceros
indicando qué es hábil y qué no, eso con sumaproducto lo hago de una. El
problema para mí radicó en algo particular que me piden en el proceso y es
tratar de hallar la edad en días de unos requerimientos de backoffice y que a
partir del día 15 hábil, seguir cumando días calendario. Lo que se me ocurrió
era hallar la fecha exacta en la cual se cumplían los 15 días hábiles y de
ahí hallar los calendario y sumarlos a los 15. Eso no supe cómo hacerlo en
excel directamente y lo solucioné con el siguiente código gracias a vos:

DiasHabilesBO = Evaluate("sumproduct((" & Fechas.Address(External:=True)
& ">" & CLng(Desde) & ")*(" & Fechas.Address(External:=True) & "<=" &
CLng(Hasta) & ")*" & Importes.Address(External:=True) & ")")
If DiasHabilesBO > 15 Then
Hasta2 = Desde + 15
DiasHabilesAux = 0
Do While DiasHabilesAux < 15
Hasta2 = Hasta2 + 1
DiasHabilesAux = Evaluate("sumproduct((" &
Fechas.Address(External:=True) & ">" & CLng(Desde) & ")*(" &
Fechas.Address(External:=True) & "<=" & CLng(Hasta2) & ")*" &
Importes.Address(External:=True) & ")")
Loop
Diferencia = 15 + Hasta - Hasta2
DiasHabilesBO = Diferencia


SAludos,

jorge M

"Héctor Miguel" wrote:

hola, Jorge !

> PD: Normalmente uso las formulas nativas de excel pero en esta ocasion
> necesitaba hacer unas cuentas con unas validaciones que no logre en excel
> y que la funcion personalizada si lo hizo por mi. =)

(solo para los registros y si te queda tiempo...)
me gustaria conocer la formula que no te funciona "nativamente" (?)

saludos,
hector.



Respuesta Responder a este mensaje
#7 Héctor Miguel
11/06/2009 - 21:15 | Informe spam
hola, Jorge !

lo siento, pero no pude "ver" la formula "nativa" tal y como lo has intentado (???)

y por la forma de uso que das (en este ejemplo) a la funcion personalizada (creo)
habria que cambiar el nombre del segundo argumento de: Importes a (p.e.): DiasHabiles (?)

(me) seria de utilidad si comentas algunas fechas (del rango de fechas) indicando los ceros-unos (si son habiles)
y que pondrias como argumentos (o celdas) para Desde y Hasta
asi como el resultado que esperarias ver como correcto de uno o dos ejemplos "practicos" :))

saludos,
hector.

__ OP __
... lo que estoy haciendo: es solo tratar de hallar los dias habiles
... basado en una tabla con fechas y unos y ceros indicando que es habil y que no
... El problema para mi radico en algo particular que me piden en el proceso
... tratar de hallar la edad en dias de unos requerimientos de backoffice
y que a partir del dia 15 habil, seguir cumando dias calendario.
... se me ocurrio... hallar la fecha exacta en la cual se cumplian los 15 dias habiles
y de ahi hallar los calendario y sumarlos a los 15.
Eso no supe como hacerlo en excel directamente y lo solucione con el siguiente codigo ...:

DiasHabilesBO = Evaluate("sumproduct((" & Fechas.Address(External:=True) & ">" & CLng(Desde) & ")*(" & Fechas.Address(External:=True) & "<=" & CLng(Hasta) & ")*" & Importes.Address(External:=True) & ")")
If DiasHabilesBO > 15 Then
Hasta2 = Desde + 15
DiasHabilesAux = 0
Do While DiasHabilesAux < 15
Hasta2 = Hasta2 + 1
DiasHabilesAux = Evaluate("sumproduct((" & Fechas.Address(External:=True) & ">" & CLng(Desde) & ")*(" & Fechas.Address(External:=True) & "<=" & CLng(Hasta2) & ")*" & Importes.Address(External:=True) & ")")
Loop
Diferencia = 15 + Hasta - Hasta2
DiasHabilesBO = Diferencia



__ previo __
(solo para los registros y si te queda tiempo...)
me gustaria conocer la formula que no te funciona "nativamente" (?)
Respuesta Responder a este mensaje
#8 Yrjo, Inc.
12/06/2009 - 01:10 | Informe spam
Hola Hèctor, la fòrmula nativa ni la pude hacer, y tu sugerencia de cambiar
el nombre al segundo argumento es muy vàlida, ya mismo hago el cambio.

Un rango de fechas serìa: (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 dìas hàbiles que es el 23 (un viernes) y lo que es 24, 25 y 26 son 3
dìas màs (pero calendario), por eso da 18. Mi correo es me
dices si te mando ahì el archivo de excel.

Gracias


"Héctor Miguel" wrote:

hola, Jorge !

lo siento, pero no pude "ver" la formula "nativa" tal y como lo has intentado (???)

y por la forma de uso que das (en este ejemplo) a la funcion personalizada (creo)
habria que cambiar el nombre del segundo argumento de: Importes a (p.e.): DiasHabiles (?)

(me) seria de utilidad si comentas algunas fechas (del rango de fechas) indicando los ceros-unos (si son habiles)
y que pondrias como argumentos (o celdas) para Desde y Hasta
asi como el resultado que esperarias ver como correcto de uno o dos ejemplos "practicos" :))

saludos,
hector.

__ OP __
> ... lo que estoy haciendo: es solo tratar de hallar los dias habiles
> ... basado en una tabla con fechas y unos y ceros indicando que es habil y que no
> ... El problema para mi radico en algo particular que me piden en el proceso
> ... tratar de hallar la edad en dias de unos requerimientos de backoffice
> y que a partir del dia 15 habil, seguir cumando dias calendario.
> ... se me ocurrio... hallar la fecha exacta en la cual se cumplian los 15 dias habiles
> y de ahi hallar los calendario y sumarlos a los 15.
> Eso no supe como hacerlo en excel directamente y lo solucione con el siguiente codigo ...:
>
> DiasHabilesBO = Evaluate("sumproduct((" & Fechas.Address(External:=True) & ">" & CLng(Desde) & ")*(" & Fechas.Address(External:=True) & "<=" & CLng(Hasta) & ")*" & Importes.Address(External:=True) & ")")
> If DiasHabilesBO > 15 Then
> Hasta2 = Desde + 15
> DiasHabilesAux = 0
> Do While DiasHabilesAux < 15
> Hasta2 = Hasta2 + 1
> DiasHabilesAux = Evaluate("sumproduct((" & Fechas.Address(External:=True) & ">" & CLng(Desde) & ")*(" & Fechas.Address(External:=True) & "<=" & CLng(Hasta2) & ")*" & Importes.Address(External:=True) & ")")
> Loop
> Diferencia = 15 + Hasta - Hasta2
> DiasHabilesBO = Diferencia

__ previo __
>> (solo para los registros y si te queda tiempo...)
>> me gustaria conocer la formula que no te funciona "nativamente" (?)



Respuesta Responder a este mensaje
#9 Héctor Miguel
12/06/2009 - 07:53 | Informe spam
hola, Jorge !

usando la misma "tabla" que expones, cual seria el resultado que esperas como correcto si cambias:
Desde: -> 01/01/2009
Hasta: -> 23/01/2009

incluso usando la funcion personalizada ?

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
#10 Yrjo, Inc.
12/06/2009 - 14:54 | Informe spam
Hola Héctor, para lo que me preguntas:

Desde: -> 01/01/2009
Hasta: -> 23/01/2009



El resultado sería 15 y si cambias la fecha por 24/01/2009 ó 25/01/2009
también da 15 porque sigue siendo 15 días hábiles, ya a partir del 26/01/2009
los días hábiles son 16 y por lo tanto la fórmula hace que de 18 tomando 3
días más calendario a partir del 23/01/2009

Espero te sirva el dato

"Héctor Miguel" wrote:

hola, Jorge !

usando la misma "tabla" que expones, cual seria el resultado que esperas como correcto si cambias:
Desde: -> 01/01/2009
Hasta: -> 23/01/2009

incluso usando la funcion personalizada ?

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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida