|
既にスマートな回答がありますが、別解として、初心者でも解りやすいと思われる初歩的なものだけを使った、泥臭いやりかたも回答しておきます。
シート名:マスタ
→重量
↓径
------------------------
| A B C D E F
-|-----------------------
1| 10 20 30 40 50以下
2| 50 A B C D E
3|100 F G H I J
4|150 K L M N P
マクロを実行するときのアクティブシート
重量 径 定数
------------
| A B C
-|----------
1|18 70
2|22 130
3|38 145
4| 5 58
として、
・アクティブシートの重量と径の値は両方が書き込まれていること
・アクティブシートの重量と径は上から順に並んでいて空行が無いこと
・アクティブシートの重量も径も、マスタシートの表の数値以上になっていないこと
という前提のもとで、マクロは、ツール−マクロ−マクロ でtestを実行する場合、
Sub test()
Dim RowX '求めるデータの行番号
RowX = 1 '調べたいデータが1行目から始まっているから
'アクティブシートのA列を、データがなくなるまで順にチェック
Do Until Cells(RowX, 1).Value = ""
'重量と直径の値を渡せば定数が戻ってくる関数test2に、
'各行の1列目と2列目の値を渡し、戻り値を3列目に代入
Cells(RowX, 3).Value = test2(Cells(RowX, 1).Value, Cells(RowX, 2).Value)
'次に調べる行を1つ下に進めるために、RowXを1増やす
RowX = RowX + 1
Loop
End Sub
'重量Wと直径Dの値を受け取って、定数を返す関数
Function test2(W, D)
'アクティブシートではなく、マスタシートでの作業なので、
'Withでマスタシートを指定
'その際に、マスタシートのセルを示す場合は、.Cellsというように、「.」を頭につけること
With Worksheets("マスタ")
Dim ColMem '重量列記憶用
Dim RowMem '直径行記憶用
ColMem = 2 '重量を調べ始める列が2列目だから
RowMem = 2 '直径を調べ始める行が2行目だから
'A2(=.Cell(1, 2))から右に順に調べて、最初にD以上になるセルの列を取得
Do Until .Cells(1, ColMem).Value = ""
'重量が引数W以上の場合は、Doループを抜ける
If .Cells(1, ColMem).Value >= W Then
Exit Do
End If
'次に調べる列を1つ右に進めるために、Colmemを1増やす
ColMem = ColMem + 1
Loop
'直径に関しても同様
'詳細コメントは省略
Do Until .Cells(RowMem, 1).Value = ""
If .Cells(RowMem, 1).Value >= D Then
Exit Do
End If
RowMem = RowMem + 1
Loop
'求めた列と行から、定数を取得し、戻り値test2に代入
test2 = .Cells(RowMem, ColMem).Value
End With
End Function
と書けば良いです。
|
|