Domanda
Ho una tabella di dati 2 variabili 100x100 in Excel.
Devo avere una funzione che ritorni tutti i possibili insiemi di variabili che producono un dato valore target. Quello che sto guardando è una sorta di funzione di ricerca bidimensionale ricorsiva. Qualcuno può indicarmi la giusta direzione?
Soluzione
Può essere fatto senza VBA, abbastanza compatto, in questo modo.
Supponiamo che la tua tabella 100x100 sia in B2: CW101 e inseriamo un elenco di numeri da 1 a 100 in basso a sinistra da A2 a A101 e di nuovo da 1 a 100 nella parte superiore da B1 a CW1
Crea una colonna di celle sotto, iniziando (diciamo) in 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))
Questo è un "array" formula, quindi premi Ctrl-Maiusc-Invio invece di Invio e le parentesi graffe {} dovrebbero apparire intorno alla formula.
Quindi copia verso il basso per tutte le righe di cui potresti aver bisogno. È inoltre necessario inserire un numero elevato sopra la prima formula, ad esempio in B103, ad esempio 999999.
Quello che fa la formula è calcolare Rowx100 + Column, ma solo per ogni cella di successo, e la funzione MAX trova il risultato più grande, escludendo tutti i risultati precedenti trovati, ovvero trova i risultati target uno alla volta, partendo dal basso a destra e lavorando in alto a sinistra. (Con un piccolo sforzo potresti riuscire a cercarlo dall'altra parte).
Questo ti darà risultati come 9922, che è la riga 99, colonna 22 e puoi facilmente estrarre questi valori dal numero.
Spero che abbia senso.
Altri suggerimenti
Non esiste una funzione integrata che farà ciò che vuoi, ne sono sicuro al 99%.
Potrebbe essere creata una funzione VBA che restituisce un array, lungo le linee del Sottotitolo quick-and-dirty già mostrato. Crea una variante per contenere l'output, magari Redimmed al massimo numero possibile di risultati e Redim Preserve-d fino al numero effettivo alla fine. Quindi restituiscilo come risultato della funzione che deve essere chiamata come funzione array (Control-Shift-Enter).
Un aspetto negativo è che dovresti assicurarti che l'intervallo di destinazione sia abbastanza grande da contenere l'intero risultato: Excel non lo farà automaticamente.
Il solutore sarebbe adatto?
http://office.microsoft.com/en-us/excel /HA011118641033.aspx
Ci ho provato molto senza usare VBA ma non sembra possibile senza di esso. Per risolvere questo problema, avevo bisogno di scorrere l'intero array e ho trovato i valori più vicini. Questi valori sono stati quindi rinviati utilizzando le chiamate e le proprietà dell'intervallo e l'output è stato generato in un intervallo incrementato ad ogni corrispondenza valida.
L'implementazione rapida e sporca è come sotto:
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
Sto ancora cercando un approccio senza VBA.
Ho una soluzione che non utilizza VBA, ma è piuttosto disordinata. Implica la creazione di un'ulteriore tabella unidimensionale in Excel e la ricerca di ciò. Per una tabella di dati 100x100, la nuova tabella avrebbe bisogno di 10.000 righe.
Mi scuso se non soddisfa le tue esigenze.
Di seguito è riportato un riepilogo: fammi sapere se hai bisogno di maggiori dettagli. N = dimensione dei dati, ad es. 100 nel tuo esempio.
Innanzitutto, crea una nuova tabella con cinque colonne e righe NxN. In ogni caso, sostituisci i miei nomi di colonna con il riferimento Excel appropriato
La prima colonna (chiamala INDICE) elenca semplicemente 1, 2 ... NxN.
La seconda colonna (DATAROW) contiene una formula per scorrere tra 1, 2 ... N, 1, 2 ... N ... Questo può essere fatto usando qualcosa come = MOD (INDICE-1, N) + 1
La terza colonna (DATACOL) contiene 1, 1, 1 ... 2, 2, 2 ... (N volte ciascuno). Questo può essere fatto con = INT ((INDEX-1) / N) +1
La quarta colonna (VALUE) contiene il valore dalla tua tabella di dati, usando qualcosa come: = OFFSET ($ A $ 1, DATAROW, DATACOL), supponendo che la tabella dei dati inizi a $ A $ 1
Ora abbiamo una tabella unidimensionale che contiene tutti i tuoi dati.
La quinta colonna (LOOKUP) contiene la formula: = MATCH (target, OFFSET (VALUERANGE, [LOOKUP-1], 0), 0) + [LOOKUP-1]
dove [LOOKUP-1] si riferisce alla cella immediatamente sopra (ad es. nella cella F4 questo si riferisce a F3). Avrai bisogno di uno 0 sopra la prima cella nella colonna LOOKUP.
VALUERANGE dovrebbe essere un riferimento fisso (denominato o usando $ segni) all'intera colonna VALUE.
La colonna LOOKUP contiene quindi i numeri INDEX che possono essere utilizzati per cercare DATAROW e DATACOL per trovare la posizione della corrispondenza nei dati.
Funziona cercando le partite in VALUERANGE, quindi cercando le partite in un intervallo regolato a partire dalla partita precedente.
È molto più facile in un foglio di calcolo che tramite la spiegazione sopra, ma è il meglio che posso fare per il momento ...