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?

¿Fue útil?

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.

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top