連続したセルの値を単一のセルと比較することは可能ですか? 例えば:
If Sheets("Sheet2").Range("E4:E6").Value = Sheets("Sheet1").Range("D4").Value Then
....
これを試しましたが、エラーが表示されましたTYPEMISMATCH
この式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
試す
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
.....