Ayuda con formula matricial

10/12/2004 - 01:58 por cuejorge2003 | Informe spam
Buen día,

Quiero meter en un código una fórmula MATRICIAL, mas no se como hacer
para dar la indicación de MATRICIAL (Array)

Tengo lo siguiente:
VIAJESENTR = "=COUNT(1/FREQUENCY(IF((DATOS!H2:H10000=1)*(DATOS!G2:G10000A6500),MATCH(DATOS!M2:M10000,DATOS!M2:M10000,0)),ROW(INDIRECT(""1:""&ROWS(DATOS!M2:M10000)))))"
VIAJESENTR23 = Evaluate(VIAJESENTR).
Donde VIAJESENTR y VIAJESENTR23 son variables.

viéndolo de otra forma lo que requiero es que :

G2:G10000 = 416500 H2:H10000 = 1 y que con estas condiciones
cuente los datos únicos en M2:M10000

De antemano, gracias.
Un saludo.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
10/12/2004 - 10:19 | Informe spam
hola, JC ! ¿Jorge?

... meter en un codigo una formula MATRICIAL ... como ... dar la indicacion de MATRICIAL (Array)
VIAJESENTR =
"=COUNT(1/FREQUENCY(IF((DATOS!H2:H10000=1)*(DATOS!G2:G10000A6500),MATCH(DATOS!M2:M10000,DATOS!M2:M10000,0)),ROW(INDIRECT(""1:""&ROWS(DATOS!M2:M10000)))))"
VIAJESENTR23 = Evaluate(VIAJESENTR).
... VIAJESENTR y VIAJESENTR23 son variables.
... de otra forma lo que requiero es que:
G2:G10000 = 416500 / H2:H10000 = 1 / ... con estas condiciones cuente los datos unicos en M2:M10000



1.- [si lo que 'buscaras' fuese] para 'depositar' una formula matricial ->en una celda<-...
=>referencia_al_rango.FormulaArray = "=cadena_de_texto_con_la_formula"
2.- si lo que necesitas es [solamente] 'obtener' lo que seria el 'resultado final' de [depositar] una formula matricial...
=> usar el metodo 'Evaluate("cadena_de_texto")'... NO siempre 'funciona' [con 'formulas matriciales'] :(
sobre todo, cuando 'estas' ->tienen que<- 'irse [auto/re]evaluando' ->dentro/sobre si mismas<- [?]
3.- en algunos 'casos' [como el que refieres 'especificamente']... 'resulta' [practicamente] ->imprescindible<-...
a) 'bajar' a una celda la formula [ver punto 1] para poder 'operar' con el resultado...
b) [opcionalmente podrias p.e.]
-> 'asignar' a una variable el 'resultado final' ->tomado de la celda<-
-> 'borrar/eliminar' el contenido de dicha celda [que pudiera ser una celda 'puente/provisional']
=> a menos que... las referencias [en la cadena de texto de 'la formula'] vayan a ser 'relativas' [y bastantes...
'depositos']
4.- otra 'alternativa' seria [p.e.] 'asignar' la formula a un nombre [que tambien 'aceptan' formulas matriciales como 'normales']
[aunque... seria un paso 'intermedio' e... ¡ innecesario !!!, puesto que -de todas formas- se requiere 'bajarlo' a una celda] :(
5.- con respecto de la cadena de texto para 'construir' la formula...
-> no es 'necesario' el uso de [todo] mayusculas [ni en los nombres de las variables ni en la cadena de texto]
-> si fueras a usar la opcion de 'generacion' de nombres... se requieren referencias 'absolutas'
[puesto que -algunas veces- al generar nombres por codigo, la 'celda activa'... tiene sus 'repercusiones'] ;)
6.- el caso que expones, lo probe en 97, 2000, 2002 y 2003 [siempre con 'el mismo resultado'... SOLO 'bajando la formula']
7.- te 'paso' un codigo [de ejemplo] para que 'aprecies' las diferencias de 'evaluar' cada caso
[estoy 'usando' la celda activa para ir 'moviendo' cada 'resultado]
=>procura 'estar' en una celda vacia y asegurarte que el resultado 'esperado'... debiera devolver 'mayor que cero'<
saludos,
hector.

p.d. [creo que...] siguen algunos detalles 'quedandose en el tintero' [?]

en un modulo de codigo 'normal' ==Sub EvaluandoResultados()
Dim Formula As String, Formula_2 As String, Resultado As Integer
Formula = "=count(1/frequency(if((datos!h2:h10000=1)*(datos!g2:g10000A6500)," & _
"match(datos!m2:m10000,datos!m2:m10000,0))," & _
"row(indirect(""1:""&rows(datos!m2:m10000)))))"
ActiveCell.FormulaArray = Formula
Resultado = Evaluate(Formula)
MsgBox ActiveCell & " -> Resultado al 'depositar' la fórmula en la celda" & vbCr & _
Resultado & " -> Resultado al 'evaluar' la cadena de la fórmula"
Formula_2 = "=count(1/frequency(if((datos!$h$2:$h$10000=1)*(datos!$g$2:$g$10000A6500)," & _
"match(datos!$m$2:$m$10000,datos!$m$2:$m$10000,0))," & _
"row(indirect(""1:""&rows(datos!$m$2:$m$10000)))))"
Names.Add Name:="Temporal", RefersTo:=Formula_2
MsgBox Evaluate("Temporal") & " -> Resultado al 'evaluar' el nombre 'creado'"
ActiveCell = "=Temporal"
MsgBox ActiveCell & " -> Resultado del nombre al 'depositarlo' en una celda"
ActiveCell.ClearContents
Names("Temporal").Delete
End Sub
Respuesta Responder a este mensaje
#2 Fernando Arroyo
10/12/2004 - 10:21 | Informe spam
No hay que hacer nada para que la función EVALUATE procese la fórmula como matricial, lo hace automáticamente cuando tiene que hacerlo.

Pienso que la instrucción en tu código debería ser:

VIAJESENTR = "=COUNT(1/FREQUENCY(IF((DATOS!H2:H10000=1)*(DATOS!G2:G10000A6500),MATCH(DATOS!M2:M10000,DATOS!M2:M10000,0)),ROW(INDIRECT(" & """1:""" & "&ROWS(DATOS!M2:M10000)))))"

pero el hecho es que yo la he probado y devuelve 0. Sin embargo, la misma función puesta en la hoja de cálculo sí devuelve los resultados correctos.

Una posible alternativa sería esta otra fórmula, la cual necesita que no haya ninguna celda vacía en los rangos a evaluar (supongo que esto será así, puesto que parece que estamos hablando de algún tipo de tabla):

=SUMAPRODUCTO((1/CONTAR.SI(DATOS!M2:M10000;DATOS!M2:M10000))*(DATOS!H2:H10000=1)*(DATOS!G2:G10000A6500))

La fórmula anterior parece que sí es evaluada correctamente por EVALUATE, por ejemplo:

MsgBox Evaluate("=SUMPRODUCT((1/COUNTIF(DATOS!M2:M10000,DATOS!M2:M10000))*(DATOS!H2:H10000=1)*(DATOS!G2:G10000A6500))")

Un saludo.


Fernando Arroyo
MS MVP - Excel



"JC" escribió en el mensaje news:
Buen día,

Quiero meter en un código una fórmula MATRICIAL, mas no se como hacer
para dar la indicación de MATRICIAL (Array)

Tengo lo siguiente:
VIAJESENTR = "=COUNT(1/FREQUENCY(IF((DATOS!H2:H10000=1)*(DATOS!G2:G10000A6500),MATCH(DATOS!M2:M10000,DATOS!M2:M10000,0)),ROW(INDIRECT(""1:""&ROWS(DATOS!M2:M10000)))))"
VIAJESENTR23 = Evaluate(VIAJESENTR).
Donde VIAJESENTR y VIAJESENTR23 son variables.

viéndolo de otra forma lo que requiero es que :

G2:G10000 = 416500 H2:H10000 = 1 y que con estas condiciones
cuente los datos únicos en M2:M10000

De antemano, gracias.
Un saludo.
Respuesta Responder a este mensaje
#3 Fernando Arroyo
10/12/2004 - 12:03 | Informe spam
Olvídate de la fórmula que propuse como alternativa, porque no funciona bien. Voy a ver si consigo modificarla para que funcione.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida