it-swarm.com.de

Weg zur Überwindung der Excel Vlookup-Funktion von 256 Zeichen

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?

12
sandyiit

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

https://www.dropbox.com/s/fe0sb6bkl3phqdr/vlookup.xls

18
barry houdini

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?

5
Ans

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.

0
Sancarn