Pregunta
Tengo una tabla de datos de 2 variables de 100x100 en Excel.
Necesito tener una función que devuelva todos los conjuntos posibles de variables que produzcan un valor objetivo dado. Lo que estoy viendo es una especie de función de búsqueda bidimensional recursiva. ¿Alguien puede señalarme en la dirección correcta?
Solución
Se puede hacer sin VBA, de manera bastante compacta, así.
Supongamos que su tabla de 100x100 está en B2: CW101, y colocamos una lista de números del 1 al 100 a la izquierda de A2 a A101, y nuevamente de 1 a 100 en la parte superior de B1 a CW1
Cree una columna de celdas debajo, comenzando (digamos) en B104
B104=MAX(($A$2:$A$101*100+$B$1:$CW$1<B103)*($B$2:$CW$101=TargetValue)*($A$2:$A$101*100+$B$1:$CW$1))
Esta es una " matriz " fórmula, así que presione Ctrl-Shift-Enter en lugar de Enter, y deben aparecer llaves {} alrededor de la fórmula.
Luego copie todas las filas que pueda necesitar. También debe poner un número grande encima de su primera fórmula, es decir, en B103, por ejemplo, 999999.
Lo que hace la fórmula es calcular la columna Rowx100 +, pero solo para cada celda exitosa, y la función MAX encuentra el mayor resultado, excluyendo todos los resultados anteriores encontrados, es decir, encuentra los resultados objetivo uno por uno, comenzando desde abajo. derecha y trabajando hasta la parte superior izquierda. (Con un poco de esfuerzo, puede hacer que busque de otra manera).
Esto le dará resultados como 9922, que es la fila 99, columna 22, y puede extraer fácilmente estos valores del número.
Espero que esto tenga sentido.
Otros consejos
No hay una función integrada que haga lo que desea, estoy 99% seguro de eso.
Se podría construir una función VBA que devuelva una matriz, a lo largo de las líneas del Sub rápido y sucio que ya se muestra. Cree una variante para mantener la salida, quizás Redimmed al número máximo posible de resultados y Redim Preserve-d hasta el número real al final. Luego devuelva eso como resultado de la función que luego debe llamarse como una función de matriz (Control-Shift-Enter).
Una desventaja es que tendrías que asegurarte de que el rango objetivo fuera lo suficientemente grande como para contener todo el resultado: Excel no lo hará automáticamente.
¿El Solver se adapta?
http://office.microsoft.com/en-us/excel /HA011118641033.aspx
Lo intenté mucho sin usar VBA pero no parece posible sin él. Para resolver este problema, necesitaba recorrer toda la matriz y encontrar los valores más cercanos. Estos valores se desreferenciaron utilizando llamadas y propiedades de rango y la salida se generó en un rango que se incrementa en cada coincidencia válida.
La implementación rápida y sucia es la siguiente:
Dim arr As Range
Dim tempval As Range
Dim op As Integer
Set arr = Worksheets("sheet1").Range("b2:ao41")
op = 1
Range("B53:D153").ClearContents
For Each tempval In arr
If Round(tempval.Value, 0) = Round(Range("b50").Value, 0) Then
Range("b52").Offset(op, 0).Value = Range("a" & tempval.Row).Value
Range("b52").Offset(op, 1).Value = Cells(tempval.Column, 1).Value
Range("b52").Offset(op, 2).Value = tempval.Value
op = op + 1
End If
Next
Range("b50").Select
Todavía estoy buscando un enfoque sin VBA.
Tengo una solución que no usa VBA, pero es bastante desordenada. Implica crear una tabla unidimensional adicional en Excel y hacer búsquedas en eso. Para una tabla de datos de 100x100, la nueva tabla necesitaría 10,000 filas.
Disculpas si esto no se ajusta a tus necesidades.
A continuación se incluye un resumen: avíseme si necesita más detalles. N = la dimensión de los datos, por ejemplo, 100 en tu ejemplo.
Primero, cree una nueva tabla con cinco columnas y filas NxN. En cada caso, reemplace los nombres de mis columnas con la referencia de Excel apropiada
La primera columna (llámelo INDEX) simplemente enumera 1, 2 ... NxN.
La segunda columna (DATAROW) contiene una fórmula para recorrer 1, 2 ... N, 1, 2 ... N ... Esto se puede hacer usando algo como = MOD (INDEX-1, N) + 1
La tercera columna (DATACOL) contiene 1, 1, 1 ... 2, 2, 2 ... (N veces cada uno). Esto se puede hacer con = INT ((INDEX-1) / N) +1
La cuarta columna (VALOR) contiene el valor de su tabla de datos, usando algo como: = OFFSET ($ A $ 1, DATAROW, DATACOL), suponiendo que su tabla de datos comience en $ A $ 1
Ahora tenemos una tabla unidimensional que contiene todos sus datos.
La quinta columna (LOOKUP) contiene la fórmula: = PARTIDO (objetivo, DESPLAZAMIENTO (VALOR, [BUSCAR-1], 0), 0) + [BUSCAR-1]
donde [LOOKUP-1] se refiere a la celda inmediatamente anterior (por ejemplo, en la celda F4 esto se refiere a F3). Necesitará un 0 sobre la primera celda en la columna BUSCAR.
VALUERANGE debe ser una referencia fija (nombrada o usando signos $) a toda la columna VALUE.
La columna BUSCAR luego contiene números de ÍNDICE que se pueden usar para buscar DATAROW y DATACOL para encontrar la posición de la coincidencia en los datos.
Esto funciona buscando coincidencias en VALUERANGE, luego buscando coincidencias en un rango ajustado que comienza después de la coincidencia anterior.
Es mucho más fácil en una hoja de cálculo que a través de la explicación anterior, pero eso es lo mejor que puedo hacer por el momento ...