Excelのデータ検証-セル範囲内のコンマ区切りリストのすべての値


0

メモの参照テーブルと、それらが参照し、参照されている他のメモを含む、それらに関するいくつかの情報があります。参照のコンマ区切りリストの値のいずれかがメモのリストにない場合に赤で表示されるデータ検証ルールを作成したい(つまり、情報が欠落しているか、ユーザーが打ち間違え)。他のメモをいくつでも参照できます。各エントリのメモ番号は列Aにあり、参照は列Gにあります。見出し行A、次の行のデータは定期的に追加されます。

A ............ G

LF100009 ....... 400 <-赤

HS100011 .......

RT100012 ....... LF100009

LA100015 ....... LF100009、RT100012

ME100020 ....... HS100011、RT1000012、LA100015 <-赤

KE100050 ....... LA100011、LA100015 <-赤

ブックの画面の切り取り


サンプルワークブックを投稿できますか?上記の例は、質問と一致していないようです。
クリス

申し訳ありませんが、添付ファイルを追加する場所が表示されませんか?@クリス
ローラ

サンプルのワークブックページのスクリーンショットを追加しましたが、機密性の理由から、それはまだ構成されたデータの束であり、適切な場所で、必要な方法でフォーマットされているだけです。
ローラ

条件付き書式設定またはデータ検証?
レイスタファリアン

赤の背景の条件付き書式設定。ただし、各メモに対して複数の参照を許可しながら、データ検証を実行できる場合は、それも素晴らしいでしょう。それは不可能だと思いました。
ローラ

回答:


1

まったくエレガントではありませんが、これは最大3つの参照に対して機能します。必要に応じて条件付き書式と組み合わせるか、ヘルパー列に入れることができます。

=IF(IF(IF(G2="",TRUE,LEN(G2)-LEN(SUBSTITUTE(G2,",",""))+1)=TRUE,1,
IF(IF(G2="",TRUE,LEN(G2)-LEN(SUBSTITUTE(G2,",",""))+1)=1,COUNTIF(A:A,G2),
IF(IF(G2="",TRUE,LEN(G2)-LEN(SUBSTITUTE(G2,",",""))+1)=2,SUMPRODUCT((COUNTIF(A:A,LEFT(G2,FIND(",",G2)-1)))*(COUNTIF(A:A,MID(G2,FIND(",",G2)+2,LEN(G2))))),
IF(IF(G2="",TRUE,LEN(G2)-LEN(SUBSTITUTE(G2,",",""))+1)=3,SUMPRODUCT((COUNTIF(A:A,LEFT(G2,FIND(",",G2)-1)))*(COUNTIF(A:A,MID(G2,FIND(",",G2)+2,LEN(G2)-FIND("@",SUBSTITUTE(G2,",","@",IF(G2="",TRUE,LEN(G2)-LEN(SUBSTITUTE(G2,",",""))+1)-1))-1)))*(COUNTIF(A:A,MID(G2,FIND("@",SUBSTITUTE(G2,",","@",IF(G2="",TRUE,LEN(G2)-LEN(SUBSTITUTE(G2,",",""))+1)-1))+2,LEN(G2))))),
FALSE
))))=1,TRUE)

これは今のところ機能します。さらに参照するために機能させる必要がある場合、そのパターンを継続するだけですか?また、その一部がコンマを取り出しているように見えます。彼らは必要ではありません、彼らがいなかったらもっと良いでしょうか?また、別の列としてハイパーリンクに効果的に移動することを計画していましたが、機能する場合、メモや参照がハイパーリンクである場合、この式は機能しますか?
ローラ

3つ以上の参照がある場合、上記の式は修正するのが難しすぎるため、以下で言及するVBAアプローチを取るのが最善です。ただし、ハイパーリンクを実装する場合は、数式アプローチも正常に機能します。
クリス

0

そして、ここにヘルパーセルにTRUE / FALSE値を置くUDFがあります。数式は次のようになります=testReferences(G2,A:A,", ")

次のコードはVBAエディターに貼り付けられます。無制限の参照に対して機能します。

Function testReferences(text As Range, list As Range, delimiter As String)
    Dim arr() As String
    Dim found As Boolean

    If text = "" Then
        found = True
    Else
        arr = Split(text, delimiter)            
        For i = LBound(arr) To UBound(arr)
            If Application.WorksheetFunction.CountIf(list, arr(i)) = 1 Then
                found = True
            Else
                found = False
                Exit For
            End If
        Next
    End If

    testReferences = found
End Function

マクロ対応のExcelファイルとして保存し(以前はそうではありませんでした)、最初に示したように1行目に追加しましたが、#Nameが表示されますか?各エントリのエラー。これがスクリーンショットです。@クリスリンク
ローラ

ファイルを保存する前に、まずコードをvbaエディターに入れましたか?このリンクが役立つ場合があります-wikihow.com/Create-a-User-Defined-Function-in-Microsoft-Excel
Chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.