SumaProducto con condicion en VB?

05/09/2003 - 22:17 por Rene Moreno | Informe spam
Hla grupo, a ver si alguien me puede orientar en esto.
Intento usar la funcion SUMPRODUCT usando condiciones como en la hoja de
calculo, pero me causa error, este es el codigo

Sub prueba()
Set FF = fac.Range("tblFacts").CurrentRegion
Set WF = Application.WorksheetFunction
cve = "1"
With FF.CurrentRegion.Columns

'aqui se genera el error.
mto = Round(WF.SumProduct(.Item(1) = cve, .Item(3) = "2003/08/01",
.Item(4)), 2)


End With
MsgBox mto
End Sub

En excel se puede hacer "=SUMAPRODUCTO( ( rango1 = val1 ) * ( rango2 val2 ) * ( rangosuma ) )
pero en VB no.

Gracias de antemano.

Atte.
Rene Moreno
"La imaginacion es mas importante que el conocimiento"
Albert Einstein

Preguntas similare

Leer las respuestas

#1 Fernando Arroyo
06/09/2003 - 00:17 | Informe spam
Yo solamente he conseguido que me funcione application.worksheetfunction.sumproduct si no pongo condiciones a los argumentos. Lo que sí he conseguido es que funcione usando la función EVALUATE. Me resulta difícil escribir la instrucción que vas a necesitar si usas EVALUATE, pero te pongo un ejemplo: en Hoja1 del libro tenemos
columna A
a
b
c
a
b
c

columna B
1
2
3
1
2
3

columna C
1
10
100
1000
10000
100000

En un sub de VBA:

MsgBox Evaluate("=sumproduct((Hoja1!A1:A6=""a"")*(Hoja1!B1:B6=1)*Hoja1!C1:C6)")

Resultado: 1001

Si no consigues "construir" tu Evaluate, dimelo e intentaré ayudarte. En cualquier caso, pienso que tal como lo estás intentando no te va a funcionar porque la fecha normalmente no va como tú la pones sino con su valor numérico (por ejemplo, 2003/08/01 sería 37834, suponiendo que 8 sea el mes), a no ser que las fechas estén en la hoja como cadenas de texto.
Un saludo.


Fernando Arroyo
MS MVP - Excel



"Rene Moreno" escribió en el mensaje news:%23YKaFr%
Hla grupo, a ver si alguien me puede orientar en esto.
Intento usar la funcion SUMPRODUCT usando condiciones como en la hoja de
calculo, pero me causa error, este es el codigo

Sub prueba()
Set FF = fac.Range("tblFacts").CurrentRegion
Set WF = Application.WorksheetFunction
cve = "1"
With FF.CurrentRegion.Columns

'aqui se genera el error.
mto = Round(WF.SumProduct(.Item(1) = cve, .Item(3) = "2003/08/01",
.Item(4)), 2)


End With
MsgBox mto
End Sub

En excel se puede hacer "=SUMAPRODUCTO( ( rango1 = val1 ) * ( rango2 > val2 ) * ( rangosuma ) )
pero en VB no.

Gracias de antemano.

Atte.
Rene Moreno
"La imaginacion es mas importante que el conocimiento"
Albert Einstein


Respuesta Responder a este mensaje
#2 rene moreno
06/09/2003 - 04:05 | Informe spam
Muchas Gracias Fernando
El ejemplo me sivio de guia

asi quedo mas o menos

Sub evalsumaprod()
Dim fecha As Long, num As String
fecha = #8/1/2003# 'DateSerial(2003, 8, 1)
num = 1
cad = "=SUMPRODUCT((Hoja1!A2:A14=" & num & ")*(Hoja1!B2:B14=" & fecha &
")*Hoja1!C2:C14)"
Range("E3") = Evaluate(cad)
End Sub

Gracias de Nuevo

Atte. Rene Moreno
"La Imaginacion es Mas Importante que el Conocimiento"
Albert Einstein


"Fernando Arroyo" escribió en el mensaje
news:uQIy8t$
Yo solamente he conseguido que me funcione
application.worksheetfunction.sumproduct si no pongo condiciones a los
argumentos. Lo que sí he conseguido es que funcione usando la función
EVALUATE. Me resulta difícil escribir la instrucción que vas a necesitar si
usas EVALUATE, pero te pongo un ejemplo: en Hoja1 del libro tenemos
columna A
a
b
c
a
b
c

columna B
1
2
3
1
2
3

columna C
1
10
100
1000
10000
100000

En un sub de VBA:

MsgBox
Evaluate("=sumproduct((Hoja1!A1:A6=""a"")*(Hoja1!B1:B6=1)*Hoja1!C1:C6)")

Resultado: 1001

Si no consigues "construir" tu Evaluate, dimelo e intentaré ayudarte. En
cualquier caso, pienso que tal como lo estás intentando no te va a funcionar
porque la fecha normalmente no va como tú la pones sino con su valor
numérico (por ejemplo, 2003/08/01 sería 37834, suponiendo que 8 sea el mes),
a no ser que las fechas estén en la hoja como cadenas de texto.
Un saludo.


Fernando Arroyo
MS MVP - Excel



"Rene Moreno" escribió en el mensaje
news:%23YKaFr%
Hla grupo, a ver si alguien me puede orientar en esto.
Intento usar la funcion SUMPRODUCT usando condiciones como en la hoja de
calculo, pero me causa error, este es el codigo

Sub prueba()
Set FF = fac.Range("tblFacts").CurrentRegion
Set WF = Application.WorksheetFunction
cve = "1"
With FF.CurrentRegion.Columns

'aqui se genera el error.
mto = Round(WF.SumProduct(.Item(1) = cve, .Item(3) = "2003/08/01",
.Item(4)), 2)


End With
MsgBox mto
End Sub

En excel se puede hacer "=SUMAPRODUCTO( ( rango1 = val1 ) * ( rango2 > val2 ) * ( rangosuma ) )
pero en VB no.

Gracias de antemano.

Atte.
Rene Moreno
"La imaginacion es mas importante que el conocimiento"
Albert Einstein


Respuesta Responder a este mensaje
#3 Héctor Miguel
06/09/2003 - 10:17 | Informe spam
¿Que tal, Rene?

mensaje "original"
... la funcion SUMPRODUCT usando condiciones como en la hoja de calculo ... me causa error ... codigo [...]
Set FF = fac.Range("tblFacts").CurrentRegion
'aqui se genera el error.
mto = Round(WF.SumProduct(.Item(1) = cve, .Item(3) = "2003/08/01", .Item(4)), 2) [...]
En excel se puede hacer "=SumaProducto((rango1=val1)*(rango2=val2)*(rangosuma)) pero en VB no

asi quedo mas o menos [...]
cad = "=SUMPRODUCT((Hoja1!A2:A14=" & num & ")*(Hoja1!B2:B14=" & fecha & ")*Hoja1!C2:C14)"
Range("E3") = Evaluate(cad)





==> Solo "por si" quisieras conservar la "flexibilidad" de los nombres del rango usado "tblFacts" para las columnas 1, 3 y 4
y "conociendo ahora" que lo que "realmente" necesitas es "dejar SOLAMENTE el valor" que "devuelve" la funcion ...
pudieras "escribir" la formula en la celda e inmediatamente "convertirla" a su valor ;)
==Sub Prueba_1()
Dim Cve, Fecha As String, Origen As String
Cve = 1
Fecha = "2003/8/1" ' en formato de "aaaa/MM/dd" o el formato "abreviado" de TU sistema '
With fac.Range("tblFacts")
Origen = .Parent.Name & "!"
[e3].Formula = "=SumProduct((" & _
Origen & .Columns(1).Address & "=" & Cve & ")*(" & _
Origen & .Columns(3).Address & "=DateValue(""" & Fecha & """))*" & _
Origen & .Columns(4).Address & ")"
End With
[e3] = [e3]
End Sub

==> Notas:
1) "supongo" que el rango ("tblFacts") NO INCLUYE los titulos (o encabezados) pero SI el rango [completo] de la tabla.
("cosa" [incluir los titulos] que SI "toma en cuenta" la propiedad "CurrentRegion")
2) Usar formulas "matriciales" en VBA es posible (al menos) de dos formas:
-o- usando la funcion "Evaluate" como ya lo ha aclarado Fernando
-o- "escribiendo" la formula, ya sea en una celda o "asignandola" a un nombre (se pueden eliminar despues)
_______
Saludos,
Héctor.
MS-MVP
Respuesta Responder a este mensaje
#4 Rene Moreno
06/09/2003 - 17:13 | Informe spam
Eres muy amable Héctor, tu colaboración también me ha sido de mucha ayuda.
Sinceramente espero alcanzar el nivel que tienen Tú, Fernando, y tantos
otros que hay en este grupo. Como dicen, Un gran caminata empieza por un
paso o algo así =)

Saludos y Gracias.
Atte. Rene Moreno
"Saber que no se sabe constituye tal
vez el mas difícil y delicado saber"
Respuesta Responder a este mensaje
#5 Héctor Miguel
06/09/2003 - 19:45 | Informe spam
Rene Moreno escribió en el mensaje

... alcanzar el nivel que tienen ... tantos ... en este grupo.
... Una gran caminata empieza por un paso o algo así =)



==> Haciendo "honor a la verdad" ...
¡ TODOS estamos "en ese camino" !!! [aprendiendo constantemente] ;)

Saludos,
Héctor.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida