0

問題を例から始めます。そうしないと説明が難しくなります。

         A        B        C           D         E (ID)
1      word              letter                  1
       test              blabla                  
       other          
2      word              letter                  2
                         number
3      test              true                    3
4      other             false                   4
5      word              letter       Yes        5
6      word              letter       Yes        6
7      test              letter                  7

目標は何ですか?

目標を言葉で説明しようとすると、わかりにくくなります。説明するのも難しいです :) とにかく、コードも追加しました。VBA に精通していれば、テキストよりもコードをよく理解できます。

値 (この例では単語) が他の行にもある場合は、列 C をチェックする必要があります。また、列 C に複数回見つかった値が列 C にある場合 (この例では文字)、列Aに値が複数回表示されているかどうかを再確認する必要があります。

だから私はすでにサブを作成しました、そしてそれはうまくいきます!:)しかし、セルにさらに値がある場合はそうではありません。したがって、セルに値が 1 つしかない場合の例では、行 6 & 7 のように、列 D は YES を返します。

これまでの私のコードは次のとおりです。

Sub duplicates()

Dim source As Range
Dim source2 As Range

For Each source In Range("A1", Range("A" & Rows.Count).End(xlUp))
 If source.Value <> "" Then
    For Each source2 In Range("A1", Range("A" & Rows.Count).End(xlUp))


    If source.Value = source2.Value And source.Offset(0, 4).Value <> source2.Offset (0, 4).Value Then

        If source.Offset(0, 2).Value = source2.Offset(0, 2).Value Then

         source.Offset(0, 3) = "Yes"
        End If
    End If
    Next source2
  End If
 Next source
End Sub

したがって、1 行目と 2 行目でも YES を返す必要があります。私の目標を理解していただければ幸いです。誰かが助けてくれることを願っています。

4

1 に答える 1

0

私の提案は次のとおりです。

A) 追加の関数は、配列として関数に渡された各セルの各要素をチェックします。

Function AnyEqual(ColA, ColB) As Boolean

Dim itemA, itemB
For Each itemA In ColA
    For Each itemB In ColB
    If itemA = itemB Then
        AnyEqual = True
        Exit Function
    End If
    Next
Next

End Function

B)コードにいくつかの変更が加えられました-For Each source2内部コードの代わりにループ内に配置します:

If AnyEqual(Split(source, Chr(10)), Split(source2, Chr(10))) And _
    source.Offset(0, 4).Value <> source2.Offset(0, 4).Value Then

    If AnyEqual(Split(source.Offset(0, 2), Chr(10)), _
                   Split(source2.Offset(0, 2), Chr(10))) Then

        source.Offset(0, 3) = "Yes"
    End If
End If

あなたが提供したデータに基づいて、それはうまく機能しているようです。あなたのニーズを理解するのは少し複雑だったので、それがあなたが探していたものであることを願っています.

于 2013-03-14T22:24:35.897 に答える