web-dev-qa-db-fra.com

Façon de surmonter la limite de la fonction Excel Vlookup de 256 caractères

J'ai un tableau Excel avec plusieurs valeurs. Certains ont moins de 256 caractères et d’autres ont une longueur supérieure à 256.

Lorsque j'ai essayé de faire un VLookup en utilisant un exemple de chaîne, je peux obtenir des résultats lorsqu'il correspond aux lignes de moins de 256 caractères. Pour les lignes de plus de 256 caractères, le résultat est "# N/A".

Existe-t-il un moyen d’utiliser Vlookup ou d’utiliser une autre fonction intégrée dans Excel pour surmonter cette limite?

12
sandyiit

Si vous utilisez VLOOKUP comme ceci

=VLOOKUP(A2,D2:Z10,3,FALSE)

c'est-à-dire rechercher A2 dans D2: D10 et renvoyer un résultat de F2: F10, puis essayez plutôt cette formule

=INDEX(F2:F10,MATCH(TRUE,INDEX(D2:D10=A2,0),0))

changer de gamme au besoin

Modifier:

J'ai simulé un échantillon ici - les valeurs en A2: A10 sont les mêmes que G2: G10 mais dans un ordre différent. La longueur de chacune de ces valeurs est indiquée dans la colonne B, la méthode VLOOKUP de la colonne C échoue pour les valeurs de colonne A supérieures à 255 caractères, mais la formule INDEX/MATCH de la colonne D fonctionne dans tous les cas.

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

18
barry houdini

J'ai eu le même problème et j'ai écrit cette vlookup primitive personnalisée. Peu importe la longueur des valeurs de vos cellules.

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 ne peut pas s'empêcher de se demander pourquoi le VLOOKUP original écrit par des professionnels est mis en œuvre dans ce cas particulier plus mal que cette fonction à 10 lignes?

5
Ans

Ceci remplace avantageusement Match() et constitue également un code vba optimisé contrairement à betterSearch ci-dessus.

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

Usage:

Index(rangeA, Match2(LookupValue, LookupRange, 0)

Au dessus, Ans a dit:

Je ne peux pas m'empêcher de me demander pourquoi le VLOOKUP original écrit par professionnels est mis en œuvre dans ce cas plus mal que cette fonction à 10 lignes?

Optimisation et performance. Si vous limitez le nombre de caractères à 255, cela ne nécessite que 2 opérations sur la CPU. Par conséquent, la comparaison de chaînes de longueur variable nécessite de nombreuses étapes supplémentaires sur la CPU, car vous devez comparer de manière répétée des largeurs de 255 caractères. Les langages de programmation tels que VBA occultent beaucoup ceci parce que toutes les sous-opérations sont traitées avec soin.

Par exemple, pour comparer 2 chaînes "Hello" et "abc" de longueur fixe 5, nous effectuons simplement l'opération suivante sur la CPU:

   0100100001100101011011000110110001101111 //Hello
-  0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380

Maintenant, vous pouvez simplement demander si le résultat est < 0, > 0, = 0 ou même approximativement 0. Cela peut être fait en 2 opérations de la CPU. Si les cellules ont une longueur variable (et les formules également), vous devez d'abord utiliser le processeur pour compléter la fin de la valeur par des 0 afin que les chaînes aient la même longueur, avant de pouvoir effectuer les opérations.

0
Sancarn