2

Excel 2010 で文字列を「連結解除」しようとしています。はい、それが実際の単語ではないことはわかっています。かなりです。複数の列に分割できないセルがあります。セルは次のようになります。

アイテム1、アイテム2、アイテム3

このセルには 0-? が含まれている可能性があります。アイテム。そのセルを別のシートの列と比較したいと考えています。これを行うには match 関数を使用する必要があると思いますが、最初のセルを、デリミタをコンマとして関数内の配列に変換する必要があります。これまでのところ、 =MATCH(セル内の各項目、SHEET2!A:A、0) があります

どんな助けでもいいでしょう。=Left と =Right は知っていますが、各セル内のアイテムの数が同じではない可能性があるため、これらは機能しないと思います。ありがとう

編集:

詳細な説明: 私の最初のシートには、ドロップダウン ボックスがあります。アイテムを選択すると、このアイテムのシート 2 で vlookup が実行されます。これが発生した場合、その行のセル E (項目 1、項目 2、項目 3) がシート 3 の列の個々のセルのいずれかと一致するかどうかも確認したい

4

2 に答える 2

3

次のコードは、ワークシートで使用する VBA の Split 関数を公開しています。指定された区切り記号を使用して分割されたアイテムの行配列を返します。たとえば、セル A1 にテキスト "Item 1,Item 2") が含まれている場合、EXPLODE(A1,",") は要素 "Item 1" と "Item 2" を含む配列を返します。

  Function EXPLODE(str As String, Optional delimiter As Variant) As Variant
      If IsMissing(delimiter) Then
          delimiter = " "
      End If
      EXPLODE = Split(str, delimiter)
  End Function 

配列関数です。返された要素をスプレッドシートで使用するには:

  • 「展開された」アイテムを表示するセルを選択します
  • ソース文字列を含むセル (またはソースを含むセルへの参照) と分割が行われる区切り文字を指定する関数を入力します。
  • Control--キーの組み合わせShiftを使用して入力を完了します。Enter

または、INDEX 関数を使用して個々の要素を選択することもできます=INDEX(EXPLODE(A1,1,2)。前の例を使用すると、"Item 2" が返されます。(範囲または配列を指定すると、INDEX 関数は i 番目の行と j 番目の列の値を返します。) この使用法では、数式を配列数式として入力する必要はありません。

あなたのユースケースでは、他の機能との組み合わせが適切です。"aa, bb, cc" (VLOOKUP の結果) の形式の複数の項目を含む文字列があり、この文字列のいずれかの要素が、列 A のいずれかのセルで個別の項目として見つかるかどうかを判断したいと考えています。すべての要素が見つかった場合に True を返し、それ以外の場合は False を返す関数が必要です。次の式は、その結果を達成します。

  =SUM(SIGN(IFERROR(MATCH(TRIM(EXPLODE(D1,",")),$A:$A,0),0)))=COUNTA(EXPLODE(D1,","))

Controlこれは配列数式であり、 --Shiftで入力する必要がありますEnter。ルックアップ値の代わりにセル D1 の内容を使用したことに注意してください。TRIM 関数は、複数の項目を持つ文字列の要素間の余分なスペースを取り除きます。

于 2013-04-10T01:06:58.980 に答える
0

(実際には答えではありません。質問が何であるかを理解しようとしているだけです)

シート 1 には、多数のアイテムを含むドロップダウン ボックスがあり、選択されたアイテムは、シート 2 のテーブルを参照する vlookup() で使用されます。

シート 2 には 2(+) 列があり、1 つは vlookup に使用されるインデックスで、もう 1 つは区切りリストを含みます。

シート 3 には 1(+) 列があり、各行には、シート 2 の区切りリストのいずれかの項目に対応する値があります。

シート 1 のドロップダウン ボックスでアイテムが選択されている場合、シート 2 の対応するリストを (vlookup を使用して) 検索し、そのリスト内のアイテムがシート 3 に存在するかどうかを確認します。

これはあなたがやろうとしていることですか?はいの場合、この検索の結果は何ですか?

  • ブール値: True - いくつかの一致が見つかりました!、False - 一致なし
  • 番号: この数の結果が見つかりました

いいえ?:(

アップデート

ワークシート関数だけでそれを行うのはかなり難しいでしょう!

VBA の方がはるかに適しています。(少なくとも最後のステップ)

次のコードを新しいモジュール (ワークシートまたはワークブック モジュールではない) に追加すると、ワークシートで UDF として使用できるようになります。

この関数は文字列 (区切りリスト) を取り、関数内で展開されるため、心配する必要はありません。

私はそれをテストしていませんが、理論的にはリストを渡すことができるはずです。次に、関数はシート 3 をチェックし、アイテムが見つかったかどうかに応じて true/false を返します。

あなたが答えを見つけたことは知っていますが、ここに私の関数の動作する少し高速なバージョンがあります。

Public Function ValidateList(ByVal Target As Range) As Boolean
Dim Sheet As Worksheet: Set Sheet = ThisWorkbook.Worksheets("Sheet3") ' Check Sheet3 is the correct sheet
Dim List As Variant: List = Sheet.UsedRange.Columns("A").Value2       ' Set Column(A) to correct column
Dim Items() As String: Items = Split(Target.Value2, ",")
Dim Item As Long
Dim Key As String
Dim Result As Boolean: Result = False
Dim Search As Object: Set Search = CreateObject("Scripting.Dictionary")

For Item = LBound(Items) To UBound(Items)
    Search.Add Trim(Items(Item)), False
Next Item

If Search.Count > 0 Then
    ' Target List has 1+ Items
    For Item = LBound(List, 1) To UBound(List, 1)
        Key = Trim(List(Item, 1))
        If Search.Exists(Key) = True Then
            Search.Remove Key
        End If
        If Search.Count = 0 Then
            Result = True
            Exit For
        End If
    Next Item
Else
    ' Target List is Empty
    ' Optionally set result to True here if empty list should return True
    ' Defaults to False
End If

ValidateList = Result

End Function
于 2013-04-10T01:19:27.573 に答える