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?

È stato utile?

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.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top