あとは単価表で同じ品目を捜し、同じ品目のときは数量区分で一致するところを探し出すということになります。
単純に、単価表で上から順番に品名をチェックしてみます。
一致したら数量区分に一致しているかをチェックします。一致したらそこの単価を取り出して終了します。
もし、単価表にない品名や数量が入力されていた時は?・・・といった問題があります。
そのときは、「-99999」といった値を返すようにしました。
Function ans(myR1 As Range, myR2 As Range) As Double
Dim i As Long
Dim myLot As Variant
Dim myFlag As Boolean
myFlag = False
With Worksheets("単価表")
For i = 2 To 3001
If .Cells(i, 1).Value = myR1.Value Then
myLot = Split(.Cells(i, 2).Value, "-")
If myR2.Value >= Val(Replace(myLot(0), ",", ""))
And myR2.Value <= Val(Replace(myLot(1), ",", ""))
Then
ans = .Cells(i, 3).Value
myFlag = True
Exit For
End If
End If
Next i
End With
If myFlag = False Then ans = -99999
Application.Volatile
End Function
なお、単価表を配列に読み込んで処理することもできます。
Function keisan(myR1 As Range, myR2 As Range) As Double
Dim i As Long
Dim myLot As Variant
Dim myFlag As Boolean
Dim tanka As Variant
myFlag = False
With Worksheets("単価表")
tanka = .Range("A2:C3001").Value
End With
For i = LBound(tanka) To UBound(tanka)
If tanka(i, 1) = myR1.Value Then
myLot = Split(tanka(i, 2), "-")
If myR2.Value >= Val(Replace(myLot(0), ",", ""))
And myR2.Value <= Val(Replace(myLot(1), ",", ""))
Then
keisan = tanka(i, 3)
myFlag = True
Exit For
End If
End If
Next i
If myFlag = False Then keisan = -99999
Application.Volatile
End Function