複数の値を持つ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()
に代わるドラッグであり、上記のbetterSearch
とは異なり最適化されたvbaコードでもあります。
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でさらに多くのステップが実行されるため、255文字幅で繰り返し比較する必要があるため、CPUで必要な操作は2つだけです。 VBAのようなプログラミング言語では、すべてのサブオペレーションが処理されるため、これがわかりにくくなっています。
たとえば、固定長5の2つの文字列「Hello」と「abc」を比較するには、CPUで次の操作を実行するだけです。
0100100001100101011011000110110001101111 //Hello
- 0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380
これで、結果が< 0
、> 0
、= 0
または約0です。これは、2つのCPU操作で実行できます。セルが可変長(および数式も)の場合、操作を実行する前に、まずCPUを使用して値の終わりを0で埋め、文字列を同じ長さにする必要があります。