8行目が書かれているとよかったですね、きちんとつながっていると思っていますが。
金額×単価×容積?容量で販売するものは、数量は数えないはずですが、そのままにします。
1.関数なら、
=IF(COUNTA(D2:F2)<>3,"",VLOOKUP(F2,Sheet2!$G$7:$L$13,IF(E2="仕様1",3,IF(E2="仕様2",6,8)),TRUE)*D2*F2)
2. 以下のユーザー定義関数を使えます。
こういう関数を入れます。
=IF(COUNTA(D2:F2)<>3,"",myLookUp(Sheet2!$G$7:$L$13,Sheet1!F2,E2)*D2*F2)
3. 純粋にマクロで作れば以下のようになります。
位置関係は、ご質問の通りにしました。
ただし、仕様3 については、現在は仮想の場所になっています。
'//標準モジュール
Function myLookUp(rng As Range, ByVal Data1 As Double, ByVal col As Variant) As Variant
'ユーザー定義関数
Dim Ret As Variant
Dim i As Long
If col Like "仕様*" Then
Select Case col
Case "仕様1": col = 3
Case "仕様2": col = 6
Case "仕様3": col = 8 '仮想(要設定)
End Select
End If
With rng
If .Cells(1, 1).Value > Data1 Then '下限
Ret = .Cells(1, col).Value '最下値
ElseIf .Cells(rng.Rows.Count, 1).Value <= Data1 Then '上限
'ElseIf .Cells(rng.Rows.Count, 2).Value <= Data1 Then '繋がっていない場合
Ret = .Cells(rng.Rows.Count, col).Value '最上値
Else
For i = 1 To .Rows.Count
If .Cells(i, 1).Value <= Data1 And .Cells(i + 1, 1).Value > Data1 Then
'繋がっていない場合
'If .Cells(i, 1).Value <= Data1 And .Cells(i, 2).Value > Data1 Then
Ret = .Cells(i, col)
Exit For
End If
Next
End If
End With
If IsEmpty(Ret) Then
myLookUp = CVErr(xlErrNA)
Else
myLookUp = Ret
End If
End Function
'//マクロ
Sub TestMacro3()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim rng As Range
Dim c As Variant
Dim ans As Variant, col As Long
Set sh1 = Worksheets("Sheet1") 'シート1 出力場所
Set sh2 = Worksheets("Sheet2") 'シート2 レート・データ
'レート範囲
With sh2
Set rng = .Range("G7", .Cells(Rows.Count, "G").End(xlUp).Offset(, 5))
End With
'容量計算
With sh1
For Each c In .Range("D2", .Cells(Rows.Count, "D").End(xlUp))
If c.Offset(, 2).Value <> "" Then
ans = myLookUp(rng, c.Offset(, 2).Value, c.Offset(, 1).Value)
If Not IsError(ans) Then
c.Offset(, 5).Value = ans * c.Value * c.offset(,2).value '金額×単価×容積
End If
End If
Next
End With
Set sh1 = Nothing: Set sh2 = Nothing
End Sub
お礼
たいへんお手数を取らせて申し訳ございませんでした。 また、何度ものプログラム作成をありがとうございました。 これから確認しますが、ここまでしていただいたので今後は自身で対処していこうと思います。 本当にありがとうございました。 深く感謝いたします。