web-dev-qa-db-ja.com

Excel Vlookup関数の256文字の制限を克服する方法

複数の値を持つExcel配列があります。 256文字未満の文字もあれば、256を超える長さの文字もあります。

サンプル文字列を使用してVLookupを実行しようとすると、256文字未満の行と一致する場合に結果が得られます。 256文字を超える行の場合、「#N/A」を返します。

Vlookupを使用する方法、またはこの制限を克服できるExcelの他の組み込み関数を使用する方法はありますか?

12
sandyiit

このような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式はすべての場合に機能します

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

20
barry houdini

同じ問題があり、このカスタムプリミティブ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行の関数よりもこの特定のケースで不十分に実装されているのか疑問に思われませんか?

5
Ans

これは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で埋め、文字列を同じ長さにする必要があります。

0
Sancarn