同じ内容を持つ同じ行内の2つ以上のセルの複数の列を比較する数式が必要です。その場合は、「テキストA」を表示します(「TRUE」など、何でもかまいません)。すべての値が異なる場合は、「TEXT B」または単に「FALSE」と表示します。
IF
数式を使用していますが、比較する列が多い場合は時間がかかるため、より優れた数式が必要です。
=IF((B2=C2);"YES";IF((B2=D2);"YES";IF((C2=D2);"YES";"ALL DIFFERENT")))
OR(trueまたはfalseの結果)を使用した同様の関数でも同じです。)
=AND(($C2<>$D2);($C2<>$E2);($D2<>$E2))
以下は、ワークシートのスクリーンショットです。これは単なる例です。私の実際の作品には4列以上あります。
強調表示された行は、同じテキストを含むセルが2つ以上ある行です(グループ2も強調表示される必要があります)。したがって、「TEXT A」メッセージが表示されます。
このVBaはそれを行います( VBaを追加する方法 )。将来的にスケーリングできるように、いくつかのオプションを用意しました。最初の12行など、さまざまな「答え」を入力できる場所を確認してください。開始行と終了行のどちらを選択するか、結果を表示する場所、テキストが一致するかどうかを示す単語を選択できます。強調表示は、指定したExcel Docによるものであり、コードとは関係ありません。
VBaスクリプトを実行する前に、ファイルをバックアップしてください。通常、元に戻すオプションはありません。
Sub DoTheThing()
'Answer these questions or ye walk the plank
Dim row As Integer
row = 2
Dim firstColumn As String
firstColumn = "B"
Dim lastColumn As String
lastColumn = "D"
Dim resultsColumn As String
resultsColumn = "G"
Dim isFoundText As String
isFoundText = "YES"
Dim isNotFoundText As String
isNotFoundText = "Good Job"
'***Below be for the cap'ains eyes only.
Do While Range("A" & row).Value <> ""
Dim startChar As Integer
startChar = Asc(firstColumn)
Dim endChar As Integer
endChar = Asc(lastColumn)
Dim i As Integer
Dim hasMatch As Boolean
hasMatch = False
For i = startChar To endChar
If Range(Chr(i) & row).Value = Range(Chr(i + 1) & row).Value Then
hasMatch = True
End If
If Range(Chr(startChar) & row).Value = Range(Chr(i + 1) & row).Value Then
hasMatch = True
End If
Next i
If (hasMatch) Then
Range(resultsColumn & row).Value = isFoundText
Else
Range(resultsColumn & row).Value = isNotFoundText
End If
row = row + 1
Loop
End Sub
結果をCol Gに書いた(オリジナルをそのまま維持するため)
Vbaが実行された後
配列数式なしの2ステップソリューション:
ステップ1:各列の出現回数を計算します。 1より大きい場合は1を、そうでない場合は空の文字列を入力します。スクリーンショットのセルD2の数式:
=IF(COUNTIF($A2:$C2,A2)>1,1,"")
この数式を右下隅でドラッグ(またはダブルクリック)してすべての行をカバーし、次に選択した行D全体を右下隅でドラッグしてすべての列をカバーできます。
ステップ2:各行について、「1」があったかどうかを確認します
スクリーンショットのセルG2の数式:
=IF(SUM($D2:$F2)>0,"YES","Good Job")
この数式は、右下隅でドラッグ(またはダブルクリック)して、すべての行をカバーできます。
より良いものにするために、中間計算を別のシートに移動することを検討するかもしれません。
スクリーンショットのD2の式:
=IF(MAX(COUNTIF($A2:$C2, $A2:$C2))>1,"YES","Good job")
数式を編集するときにCtrl
+ Shift
+ Enter
を押して、それを 配列数式 として入力します。その後、右下隅でドラッグ(またはダブルクリック)して、すべての行をカバーできます。
これにはPower Queryアドインを使用します。これには、行および/または列の任意の組み合わせにわたってこれを把握できるCount Distinct関数を持つGroupコマンドがあります。
私は、表示またはダウンロードできるプロトタイプを作成しました。その「Power Queryデモ-複数の列で一意の値を比較します。xlsx」を私のOne Driveに作成しました。
https://OneDrive.live.com/redir?resid=4FA287BBC10EC562%21398
入力シートに列や行を追加し続けてから、データリボンから[すべて更新]をクリックするだけで、パワークエリを再処理できます。
この90%は、Power Queryリボンをクリックするだけで作成されました。唯一の例外は、「複数列の比較」クエリの最後のステップで書いた簡単な「if」ステートメントです。したがって、数式やVBAソリューションに比べて、保守するコードがはるかに少なくなります。
セルF2の場合:
=IF(SUMPRODUCT(--(FREQUENCY(MATCH(B2:D2,B2:D2,0),COLUMN(B2:D2)-COLUMN(B2)+1)>0))=3,TRUE,FALSE)
これらの3つの列に3つの異なる値がある場合は常に、Trueになります。
より多くの説明と空白を処理するためのオプションを含むサイトから適応: https://exceljet.net/formula/count-unique-text-values-in-a-range
同じサイトがカウントと大きなデータセットのパフォーマンス問題の可能性に触れています: https://exceljet.net/formula/count-unique-values-in-a-range-with-countif
これを数式で行う簡単な方法があります。この例は、最初の列を含む一致のみを含むケースを示していることを指摘しておきます。数式は、ランダムな一致を含む例に対してテストする必要があります。
列の数は異なる場合があるので、これを2つの部分で説明します。最初の部分は、必要な数の列に対して作成する式です。数式をわかりやすく説明するためにデータの列を追加し、ランダムに一致するいくつかのケースを含めました。
4列のデータの式は次のようになります(行2、最初のデータ行に示されています)。
COUNTIF(C2:E2,B2)+COUNTIF(D2:E2,C2)+(D2=E2)
Nがデータ列の数の場合、式にはN-1個の項が含まれます。最初の項は、最初の列と同じ値を持つ列の数を数えます。 2番目は、残りの列の何番目が2番目に等しいかをカウントします。等々。それらはすべてCOUNTIFにすることができますが、私は最後のケースのより簡単な用語として使用しました。 1つの列を数える代わりに、最後から2番目が最後と等しいかどうかをテストします。 Trueの結果は1の値として認識され、Falseは0の値として認識されます。すべての値が一意である場合、この式は0になります。それ以外の場合は、より大きな数値になります。式はIFテストの内部に入ります。
=IF(<expression>=0,"Unique Message","Match Message")
したがって、4つのデータ列の場合、式は次のようになります。
=IF(COUNTIF(C2:E2,B2)+COUNTIF(D2:E2,C2)+(D2=E2)=0,"Unique Message","Match Message")
結果は次のようになります。