oppslags data i Excel

stemmer
1

Jeg har en to variable 100x100 datatabell i excel.

Jeg trenger å ha en funksjon som returnerer alle mulige sett av variabler som gir en gitt målverdi. Det jeg ser på er en slags reursive to dimensjonal oppslag funksjon. Kan noen peke meg i riktig retning?

Publisert på 21/10/2008 klokken 04:28
kilden bruker
På andre språk...                            


5 svar

Svarte 21/10/2008 kl. 06:33
kilden bruker

stemmer
0

Jeg prøvde dette mye uten å bruke VBA, men ser ikke ut til å være mulig uten den. For å løse dette problemet, jeg trengte å sløyfe gjennom hele gruppen og fant nærmeste verdier. Disse verdier ble deretter derefernced ved hjelp av samtaler og områdeegenskaper og utgangssignalet ble generert i et område som blir inkrementert ved hver gyldig kamp.

Den raske og skitne gjennomføringen er som under:

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

Jeg er fortsatt på utkikk etter en tilnærming uten VBA.

Svarte 21/10/2008 kl. 08:27
kilden bruker

stemmer
1

Det er ingen innebygd funksjon som vil gjøre hva du vil, er jeg 99% sikker på det.

En VBA funksjon som returnerer en matrise kunne bygges langs linjene av quick-and-dirty Sub allerede vises. Lag en variant til å holde utgangs, kanskje Redimmed til det maksimalt mulige antall resultater og Redim Bevar-d ned til det faktiske antallet ved slutten. Deretter returnerer det som følge av den funksjon som deretter må kalles som en matrisefunksjon (Kontroll-Shift-Enter).

En ned-side er at du må sørge for at målområdet var stor nok til å holde hele resultatet: Excel vil ikke gjøre det automatisk.

Svarte 21/10/2008 kl. 08:52
kilden bruker

stemmer
0

Jeg har en løsning som ikke bruker VBA, men det er ganske rotete. Det innebærer å skape en ytterligere endimensjonal tabell i Excel og gjøre oppslag på det. For en 100x100 datatabell, vil den nye tabellen trenger 10.000 rader.

Beklager hvis dette ikke passer dine behov.

Et sammendrag er under - gi meg beskjed hvis du trenger mer detaljer. N = dimensjonen av dataene, for eksempel 100 i ditt eksempel.

Først oppretter du en ny tabell med fem kolonner og NxN rader. I hvert fall erstatte min kolonnenavn med riktig Excel referansen

Den første kolonnen (kaller det INDEX) bare viser en, to ... NxN.

Den andre kolonnen (DATAROW) inneholder en formel for å sløyfe 1, 2 ... N, 1, 2 ... N ... Dette kan gjøres ved hjelp av noe som = MOD (INDEX-1, N) 1

Den tredje kolonnen (DATACOL) inneholder 1, 1, 1 ... 2, 2, 2 ... (N ganger hver). Dette kan gjøres med = INT ((INDEX-1) / N) 1

Den fjerde kolonnen (VERDI) inneholder verdien fra datatabellen, bruke noe sånt som: = OFFSET ($ A $ 1, DATAROW, DATACOL), forutsatt at datatabellen starter på $ A $ 1

Vi har nå fått en endimensjonal tabell som holder alle dine data.

Den femte kolonne (oppslag) inneholder formelen: = MATCH (target, OFFSET (VALUERANGE, [lookup-1], 0), 0) + [lookup-1]

hvor [lookup-1] viser til cellen umiddelbart ovenfor (for eksempel i celle-F4 dette refererer til F3). Du trenger en 0 over den første cellen i oppslagskolonnen.

VALUERANGE bør være en fast (oppkalt eller bruke $ tegn) referanse til hele verdien kolonnen.

Den oppslagskolonnen holder deretter indeksnumre som kan brukes til å slå opp DATAROW og DATACOL å finne posisjonen til kampen i dataene.

Dette fungerer ved å søke etter kamper i VALUERANGE, deretter søker etter kampene i en justert utvalg start etter forrige kamp.

Det er mye lettere i et regneark og deretter via forklaringen ovenfor, men det er det beste jeg kan gjøre for øyeblikket ...

Svarte 21/10/2008 kl. 10:40
kilden bruker

stemmer
1

Det kan gjøres uten VBA, ganske kompakt, som så.

Anta at 100x100 tabellen er i B2: CW101, og vi legger en liste med tallene 1 til 100 ned igjen fra A2 til A101, og igjen 1-100 øverst fra B1 til CW1

Lag en kolonne med celler under, starter (si) i 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))

Dette er en "matrise" formel, så trykker Ctrl-skift-inn istedenfor inn, og klammeparenteser {} vises rundt formelen.

Deretter kopierer ned for så mange rader som du kanskje trenger. Du trenger også å sette et stort antall over din første formel, dvs. i B103, f.eks 999999.

Hva formelen gjør er å beregne Rowx100 + Column, men bare for hver vellykket celle, og MAX-funksjonen finner det største resultatet, unntatt alle tidligere resultater, det vil si den finner målet resulterer en om gangen, fra nederst til høyre og jobber opp til toppen igjen. (Med litt innsats kan du få den til å søke den andre veien).

Dette vil gi deg resultater som 9922, som er rad 99, kolonne 22, og du kan enkelt hente ut disse verdiene fra nummeret.

Håper dette er fornuftig.

Svarte 21/10/2008 kl. 11:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more