Ich habe ein Excel-Array mit mehreren Werten. Einige sind weniger als 256 Zeichen und einige haben eine Länge von mehr als 256.
Wenn ich versuchte, ein VLookup mit einer Beispielzeichenfolge auszuführen, kann ich Ergebnisse erhalten, wenn die Zeilen weniger als 256 Zeichen enthalten. Bei Zeilen mit mehr als 256 Zeichen wird ein '# N/A' zurückgegeben.
Gibt es eine Möglichkeit, Vlookup zu verwenden oder eine andere eingebaute Funktion in Excel zu verwenden, um diese Grenze zu überwinden?
Wenn Sie VLOOKUP wie folgt verwenden
=VLOOKUP(A2,D2:Z10,3,FALSE)
nach A2 in D2: D10 suchen und ein Ergebnis von F2: F10 zurückgeben, dann stattdessen diese Formel versuchen
=INDEX(F2:F10,MATCH(TRUE,INDEX(D2:D10=A2,0),0))
ändern Sie die Bereiche nach Bedarf
Bearbeiten:
Ich habe hier ein Beispiel nachgebildet - die Werte in A2: A10 sind die gleichen wie in G2: G10, jedoch in einer anderen Reihenfolge. Die Länge jedes dieser Werte ist in Spalte B angegeben, der VLOOKUP in Spalte C schlägt bei Werten von Spalte A> 255 Zeichen fehl, aber die INDEX/MATCH-Formel in Spalte D funktioniert in allen Fällen
Ich hatte das gleiche Problem und ich habe dieses benutzerdefinierte primitive vlookup geschrieben. Die Länge der Werte Ihrer Zellen ist nicht wichtig.
Function betterSearch(searchCell, A As Range, B As Range)
For Each cell In A
If cell.Value = searchCell.Value Then
betterSearch = B.Cells(cell.Row, 1)
Exit For
End If
betterSearch = "Not found"
Next
End Function
PS Kann nicht anders als zu fragen, warum das von Profis entwickelte Original VLOOKUP in diesem speziellen Fall schlechter implementiert wird als diese 10-zeilige Funktion?
Dies ist ein Drag-In-Ersatz für Match()
und wird im Gegensatz zu betterSearch
oben ebenfalls für vba-Code optimiert.
Public Function Match2(search As String, lookupArray As Range, Optional match_type As Integer = 0) As Long
Application.Volatile
Dim vArray As Variant
vArray = lookupArray.Value
For i = 1 To UBound(vArray, 1)
If match_type = 0 Then
If search = vArray(i, 1) Then
Match2 = i
Exit Function
End If
Else
If match_type = -1 Then
If search <= vArray(i, 1) Then
Match2 = i
Exit Function
End If
Else
If search >= vArray(i, 1) Then
Match2 = i
Exit Function
End If
End If
End If
Next
End Function
Verwendungszweck:
Index(rangeA, Match2(LookupValue, LookupRange, 0)
Über Ans sagte:
Ich kann mir nicht wundern, warum das ursprüngliche VLOOKUP von Profis werden in diesem speziellen Fall schlechter implementiert als diese 10-zeilige Funktion?
Optimierung und Leistung. Wenn Sie die Anzahl der Zeichen auf 255 begrenzen, sind für die CPU nur zwei Operationen erforderlich, bei denen der Vergleich von Zeichenketten mit variabler Länge viel mehr Schritte auf der CPU erfordert, da Sie 255 Zeichenbreiten wiederholt vergleichen müssen. Programmiersprachen wie VBA verdecken dies oft, da alle Unteroperationen für Sie erledigt sind.
Um beispielsweise die zwei Zeichenfolgen "Hello" und "abc" mit fester Länge 5 zu vergleichen, führen wir einfach die folgende Operation auf der CPU aus:
0100100001100101011011000110110001101111 //Hello
- 0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380
Nun können Sie einfach fragen, ob das Ergebnis < 0
, > 0
, = 0
oder sogar ungefähr 0 ist. Dies kann in 2 CPU-Operationen ausgeführt werden. Wenn Zellen eine variable Länge haben (und auch Formeln), müssen Sie zuerst die CPU verwenden, um das Ende des Werts mit 0 zu füllen, um die Zeichenfolgen auf die gleiche Länge zu bringen, bevor Sie die Operationen ausführen können.