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
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" <mollde...@prodigy.net.mx> escribió en el mensaje news:%23YKaFr%23cDH...@TK2MSFTNGP09.phx.gbl...
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" <ferarr...@ESTOwanadoo.es> escribió en el mensaje
news:uQIy8t$cDHA...@TK2MSFTNGP10.phx.gbl...
> --- 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
Saludos y Gracias.
Atte. Rene Moreno
"Saber que no se sabe constituye tal
vez el mas difícil y delicado saber"
> ... 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.