[Excel] 'soort' VLOOKUP

Pagina: 1
Acties:

  • DriesA
  • Registratie: December 2003
  • Laatst online: 20-08 13:30
Hey,

Ik heb een (grote) tabel die er als volgt uit ziet:
code:
1
2
3
4
5
6
7
8
9
10
FVLBNL22    0228xxxxxx
FVLBNL22    022941xxxx
FVLBNL22    022942xxxx
FTSBNL2R    022945xxxx
FTSBNL2R    02296xxxxx
FTSBNL2R    02299xxxxx
FTSBNL2R    023xxxxxxx
FTSBNL2R    024xxxxxxx
FTSBNL2R    025xxxxxxx
FVLBNL22    02600xxxxx
De input die de gebruiker kan geven (in cel A1) is een tiencijferige getal, bijvoorbeeld: "0229452953". Dan zou er in de lijst moeten gekeken worden welke waarde in de 2e kolom het beste overeenkomst met dit getal. In dit geval is dat "022945xxxx", het eindresultaat wat de gebruiker moet zien is de overeenkomende waarde in de eerste kolom (hier: FTSBNL2R).

Als de getallen in de tweede kolom allemaal dezelfde lengte hadden, was het eenvoudiger, dan kon je met "left()" werken. Maar nu weet ik echt geen raad...

Verwijderd

Wat dacht je ervan om alle posities in het getal te vergelijken en dan een totaalscore te maken. Vervolgens geef je die code die bij de hoogste totaalscore zit.

Je kunt de functie =MID(text, start,num_chars) gebruiken om per letter een vergelijking te maken. Dus voor de eerste letter: =if(MID(A1,1,1)=MID(ref 2e kolomm,1,1),0,1)
Dat doe je voor alle 10 letters, en je telt de score van de if statements op. De hoogste score is de match, en de rij met de hoogste score laat je een referentie zijn voor je code in de eerste kolom.

  • DriesA
  • Registratie: December 2003
  • Laatst online: 20-08 13:30
Hey,
Leek me eerst een heel goed idee, maar het is niet 100%. Stel de volgende situatie:
code:
1
2
ABNANL2A    0215xxxxxx
ABNANL2B    05xxxxxxxx

Het nummer is 0515511161.

Volgens jouw formule is de output ABNANL2A (want character nr. 1, 3 en 4 matchen), maar de gewenste output is ABNANL2B (character 1 en 2 komen overeen).

Snap je?

Verwijderd

Dan tel je toch op tot de eerste false?

bij 1 komt eruit: 1011
bij 2 komt eruit: 11

Totaalscore 1: 3
Totaalscore 2: 2

Maar,

Tellen tot de eerste False:

Score1: 1
Score2: 2

  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 02-06 20:28

CoRrRan

Don't Panic!!!

VBA oplossing, mocht je er interesse in hebben.

Deze functie ergens in een module van je MS Excel VBA project (ALT-F11) plaatsen en je kunt hem direct gebruiken. Geen idee of het een oplossing voor je is, maar het was een leuke oefening.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function soort_vlookup(ByVal Lookup_Value As String, ByVal Table_Array As Range, Optional ByVal Wildcard As String)
 
  Dim i As Integer
  Dim strCompare As String
  Dim intMatch As Integer, intIndex As Integer
  
  For i = 1 To UBound(Table_Array(), 1)
    
    strCompare = Left(Table_Array(i, 2), InStr(1, Table_Array(i, 2), Wildcard) - 1)
    
    If (InStr(1, Lookup_Value, strCompare) > 0 And InStr(1, Table_Array(i, 2), Wildcard) > intMatch) Then
      intIndex = i
      intMatch = InStr(1, Table_Array(i, 2), Wildcard)
    End If
    
  Next i
  
  If Not intIndex = 0 Then
    soort_vlookup = Table_Array(intIndex, 1)
  End If
  
End Function
Enige waar je voor moet zorgen is, is dat de input van de user gebeurd met of aanhalingstekens of de cel waar het getal in moet komen als "Text" is geformateerd.

-- == Alta Alatis Patent == --


  • DriesA
  • Registratie: December 2003
  • Laatst online: 20-08 13:30
Bedankt voor de feedback! Ik ga straks beide oplossingen proberen, ze zien er alletwee goed uit!

  • KingRichard
  • Registratie: September 2002
  • Laatst online: 17-08 19:31

KingRichard

former Duke of Gloucester

Nog een benadering:
=MATCH(B1,$D$1,0)0228??????FVLBNL220260012345=VLOOKUP(1,A:C,3,FALSE)
=MATCH(B2,$D$1,0)022941????FVLBNL22
=MATCH(B3,$D$1,0)022942????FVLBNL22
D1: input, E1: resultaat. Zoals je ziet heb ik de x'en vervangen door echte wildcards. In plaats van de vraagtekens zou je ook nog asterisken kunnen gebruiken.

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Als ik me niet vergis gaat dat mis als in de tabel bv zowel 026?? als 0263? voorkomt. In alle gevallen waarin de zoekstring begint met 026* zal hij het eerste reultaat teruggeven.

Als je tabel niet te vaak verandert lijkt me een (gesorteerde) hulpkolom met echte numerieke waarden hier de snelste oplossing, waarna een fratsloze Vert.zoeken het werk doet:

code:
1
2
=WAARDE(SUBSTITUEREN(B1;"x";0))
=VERT.ZOEKEN(WAARDE(D1);A:C;3)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • DriesA
  • Registratie: December 2003
  • Laatst online: 20-08 13:30
De lijst verandert nu en dan. Ik heb de manier van Olav nu gebruikt, en hij werkt perfect!

Bedankt allemaal!
Pagina: 1