1

私のオフィスの人々が新しいポジションを追加できる製品のワークシートがあります。私たちが直面している問題は、製品には仕様がありますが、誰もがそれを入力しているわけではない (または間違って入力している) ということです。

例:「クールな商品14C」

「非常にクールな製品 14B」または「クールな製品 14C」のような既存の文字列 (たとえば、4 より長い) を含むものを入力した場合に警告が表示されるように、データ評価オプションを変換する方法はありますか? 「良品15」なども?

COUNTIF を使用して 100% 一致を防ぎ、LEFT/RIGHT を使用して同じように開始/終了する単語を見つけられることはわかっていますが、エントリ内の部分一致も見つける必要があります。

どうもありがとう!

4

1 に答える 1

0

タイプミス、ワードラップ、図の順列などをカバーしたい場合は、おそらくSOUNDEXアルゴリズムが問題に適しているでしょう。これがExcelの実装です...

したがって、これをユーザー定義関数として挿入し、=SOUNDEX(A1)各製品行の列を作成すると、新しい製品名を入力すると、同じ SOUNDEX 値を持つすべての製品行をフィルタリングできます。ユーザーが最初にダイアログフォームに新しい名前を入力し、検証を行い、重複の可能性があるコンボボックスドロップダウンを提示することで、これをさらに自動化できます。

編集:

範囲内の空白で終了する文字列の部分を見つける小さな関数(コメントへの回答)

Function FindSplit(Arg As Range, LookRange As Range) As String
Dim LookFor() As String, LookCell As Range
Dim Idx As Long

    LookFor = Split(Arg)
    FindSplit = ""

    For Idx = 0 To UBound(LookFor)

        For Each LookCell In LookRange.Cells
            If InStr(1, LookCell, LookFor(Idx)) <> 0 Then
                If FindSplit <> "" Then FindSplit = FindSplit & ", "
                FindSplit = FindSplit & LookFor(Idx) & ":" & LookCell.Row
            End If
        Next LookCell
    Next Idx

    If FindSplit = "" Then FindSplit = "Cool entry!"
End Function

これは少し大雑把です...しかし、それが行うことは次のとおりです

  • 単一のセル引数を分割して配列に入れる -->split()
  • 各ピースを処理 -->For Idx = ...
  • ピースを含む文字列を別の範囲で検索 -->For Each ...
  • 見つかったセルのピースと行番号を結果文字列に追加します

これを各セル入力の横に数式として入力/コピーすると、クールな入力を行ったかどうかをすぐに知ることができます。

ここに画像の説明を入力

セル D8 の値は [ asd:3, wer:4 ]

ルックアップ範囲の開始での絶対アドレス指定の使用に注意してください。このようにして、数式を下にコピーできます。

2015 年 3 月 17 日編集

Joanna 17-Mar-2015 にさらにコメントしてください。検索引数がスキャンしている範囲の一部である場合、たとえば、がヒットしない=FINDSPLIT(C5; C1:C12)ことを確認したい場合、およびこれが実際に同じセルである場合、これは誤検知を作成します。 . したがって、ステートメントを次のように書き換えます。If Instr(...)LookCellLookFor(Idx)

...
    ...
        If InStr(1, LookCell, LookFor(Idx)) <> 0 And _
           Not (LookCell.Row = Arg.Row And LookCell.Column = Arg.Column) _
        Then

ヒント

完全な列 ($C:$C など) を 2 番目の引数として使用しないでください。これ以上の予防策を講じないと、関数が非常に遅くなる傾向があります。

于 2015-03-10T08:21:26.483 に答える