3

連続したセルの値を単一のセルと比較することは可能ですか? 例えば:

If Sheets("Sheet2").Range("E4:E6").Value = Sheets("Sheet1").Range("D4").Value Then

....

これを試しましたが、エラーが表示されましたTYPEMISMATCH

4

2 に答える 2

2

この式Sheets("Sheet2").Range("E4:E6").Valueは、それらのセルの値を含む 2 次元配列を返します。これまで見てきたように、等値演算子を使用して値を配列と比較することはできません。

その値が存在するかどうかを確認したい場合は、次のように Match ワークシート関数を使用できます

Sub FindMatch()

    Dim lMatch As Long

    On Error Resume Next
        lMatch = Application.WorksheetFunction.Match(Range("D4").Value, Range("E4:E6").Value, False)
    On Error GoTo 0

    If lMatch > 0 Then
        Debug.Print "Value exists"
    Else
        Debug.Print "Not included"
    End If

End Sub

範囲内のすべての値が同じかどうかを判断しようとしている場合は、次のように Sumif を使用できます

Sub FindAllMatch()

    Dim dSum As Double

    If Application.WorksheetFunction.Sum(Range("E4:E6")) = Application.WorksheetFunction.SumIf(Range("E4:E6"), Range("D4").Value) Then
        Debug.Print "All match"
    Else
        Debug.Print "One doesn't match"
    End If

End Sub

もう 1 つのオプションは、いくつかの条件でフィルター処理された配列を返す Filter VBA 関数です。Filter には 1 次元配列が必要で、Range().Value は 2 次元配列を返すため、その変換を行うには Transpose 関数を使用する必要があります。

Sub Findmatch2()

    Dim vaOneD As Variant
    Dim sMatch As String

    sMatch = Range("D4").Value

    vaOneD = Application.WorksheetFunction.Transpose(Range("E4:E6").Value)

    If UBound(Filter(vaOneD, sMatch, True)) > -1 Then
        Debug.Print "There's a match"
    Else
        Debug.Print "No match"
    End If

End Sub

すべての値が同じかどうかを確認するには、適切な行を次のように変更します。

If UBound(Filter(vaOneD, sMatch, True)) - LBound(Filter(vaOneD, sMatch, True)) = UBound(vaOneD) - LBound(vaOneD) Then
于 2013-03-05T14:05:41.753 に答える
0

試す

Sheets("Sheet2").Range("E4:E6") = Sheets("Sheet1").Range("D4").Value

そうでない場合は、forループが必要です。

c = true
for each i in Sheets("Sheet2").Range("E4:E6")
    If i <> Sheets("Sheet1").Range("D4").Value then
        c = false
        Exit for
    End if
Next
 If c then
.....
于 2013-03-05T11:45:39.943 に答える