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?
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.
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?
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.