複数の値を持つExcel配列があります。256文字未満のものもあれば、256文字を超えるものもあります。
サンプル文字列を使用してVLookupを実行しようとすると、256文字未満の行と一致する場合に結果を得ることができます。256文字を超える行の場合、「#N/A」を返します。
Vlookupを使用する方法、またはこの制限を克服できるExcelの他の組み込み関数を使用する方法はありますか?
このようにVLOOKUPを使用している場合
=VLOOKUP(A2,D2:Z10,3,FALSE)
つまり、D2:D10でA2を検索し、F2:F10から結果を返す場合は、代わりにこの式を試してください。
=INDEX(F2:F10,MATCH(TRUE,INDEX(D2:D10=A2,0),0))
必要に応じて範囲を変更する
編集:
ここでサンプルをモックアップしました。A2:A10の値はG2:G10と同じですが、順序が異なります。これらの各値の長さは列Bに示され、列CのVLOOKUPは列Aの値が255文字を超えると失敗しますが、列DのINDEX/MATCH式はすべての場合に機能します。
同じ問題が発生し、このカスタムプリミティブvlookupを作成しました。セルの値の長さは関係ありません。
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この特定のケースでは、専門家によって作成された元のVLOOKUPが、この10行の関数よりも不十分に実装されているのはなぜか疑問に思わずにはいられません。
これは、上記Match()
とは異なり、vbaコードの代わりにドラッグされ、最適化されていますbetterSearch
。
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
使用法:
Index(rangeA, Match2(LookupValue, LookupRange, 0)
アンスの上に言った:
この特定のケースでは、専門家によって作成された元のVLOOKUPが、この10行の関数よりも不十分に実装されているのはなぜか疑問に思わずにはいられません。
最適化とパフォーマンス。文字数を255に制限すると、CPUで2回の操作のみが必要になりますが、255文字の幅で繰り返し比較する必要があるため、可変長文字列の比較ではCPUでさらに多くの手順が必要になります。VBAのようなプログラミング言語は、すべてのサブ操作が自動的に処理されるため、これを非常にわかりにくくします。
たとえば、固定長5の2つの文字列「Hello」と「abc」を比較するには、CPUで次の操作を実行するだけです。
0100100001100101011011000110110001101111 //Hello
- 0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380
これで、結果が、、、または約0であるかどうかを簡単に尋ねることができます< 0
。これは、2つのCPU操作で実行できます> 0
。= 0
セルが可変長(および数式も)の場合、操作を実行する前に、まずCPUを使用して値の末尾に0を埋め込み、文字列を同じ長さにする必要があります。
XLookupにはそのような制限はありません。500文字以上を検索することができました。