現在、商品コードを入れると、マスタから対応するオプション料金を取得する処理を作成しています。
その中で、出力範囲が可変になる場合を考慮した処理をどうすればいいのか悩んでおります。
- マスタシート
事前に、一意の商品コードに紐づく対象項目、オプション料金、オプションコード、オプション名称が登録されている。
対象項目1、オプション料金1、オプションコード1、オプション名称1は必須だが、2以降は任意。
また、J列の横に対象項目3、オプション料金3、オプションコード3、オプション名称3...と後から項目が増える可能性がある。
- 商品シート
手動で、商品コード、数量、重さ、金額を入力する。一意の商品コードに対して数量、重さ、金額すべて登録されている。
商品コードが重複して登録されることはない。桁数は最大桁4桁。
マスタシートで項目が増えた場合、K列の横に総計3,コード3,料金名3...と増える可能性がある。
処理の流れは以下になります。
- 商品シートに商品コード、数量、重さ、金額を入力
- 計算ボタンを押下すると、
商品シートの商品コード1列目から順に
マスタシートの商品項目に紐づく料金コード * 商品シートの数量、重さ、金額(いずれか)
を計算し、総計欄に出力。
計算に利用したマスタシートのオプションコードと名称も出力する。
商品シートのデータがある最後尾まで処理を実施すると、処理完了となる。
そこで以下のような処理を考えたのですが、
マスタシートの対象項目、オプション料金、オプションコード、オプション名称が後から増える可能性がある点が上手く考慮できていません。
SetOtherObjectファンクションで、対象項目の列によって検索範囲の列名を配列に設定してSetValueで計算時に配列から列番号を取り出す処理を考えていますが、SetOtherObjectファンクションで分岐するときマスタのC列かG列かという判定にしているので今後増えた場合、更に分岐を増やす...ということになって冗長化して良くないと思っています。
検索範囲をdictionaryに入れたらいいのかとも思ったのですが、いい設定方法が思いつきませんでした。。。
可変の検索範囲の設定方法についていい案があったらご教授お願い致します。
また、説明不足な点がありましたらご指摘ください。
html
1Public mash As Worksheet 2Public pdsh As Worksheet 3Public maxrow1 As Long 4Public maxrow2 As Long 5Public i As Long 6Public ma As Object 7Public masKey As String 8 9Sub CalculatePrice() 10 Dim tmpcd1 As String 11 Dim tmpcd2 As String 12 Dim tmp1(6) As String 13 Dim tmp2 As Variant 14 15 Set ma = CreateObject("Scripting.Dictionary") 16 Set mash = Sheets("マスタ") 17 Set pdsh = Sheets("商品") 18 19 maxrow1 = mash.Cells(Rows.Count, "B").End(xlUp).Row 20 21 For row1 = 3 To maxrow1 22 masKey = mash.Cells(row1, "B").Value 23 ma(masKey) = row1 24 Next 25 26 maxrow1 = pdsh.Cells(Rows.Count, "B").End(xlUp).Row 27 28 For i = 3 To maxrow1 29 masKey = pdsh.Cells(i, "B") 30 row1 = ma(masKey) 31 32 tmpcd1 = mash.Cells(row1, "C").Value 33 tmp2 = SetOtherObject(tmp1, "C", tmpcd1) 34 Call SetValue(row1, i, tmp1) 35 36 tmpcd1 = mash.Cells(row1, "G").Value 37 38 If tmpcd1 <> "" Then 39 tmp2 = SetOtherObject(tmp1, "G", tmpcd1) 40 Call SetValue(row1, i, tmp1) 41 End If 42 Next 43End Sub 44 45Function SetOtherObject(ByRef arry() As String, o As String, calitm As String) As Variant 46 47 If o = "C" Then 48 arry(1) = "D" 49 arry(2) = "E" 50 arry(3) = "F" 51 arry(4) = "G" 52 arry(5) = "H" 53 54 Select Case calitm 55 56 Case "金額" 57 arry(0) = "E" 58 Case "数量" 59 arry(0) = "D" 60 Case "重さ" 61 arry(0) = "C" 62 End Select 63 Else 64 arry(1) = "H" 65 arry(2) = "I" 66 arry(3) = "I" 67 arry(4) = "J" 68 arry(5) = "K" 69 70 Select Case calitem 71 72 Case "金額" 73 arry(0) = "E" 74 Case "数量" 75 arry(0) = "D" 76 Case "重さ" 77 arry(0) = "C" 78 End Select 79 End If 80 SetOtherObject = arry 81 82End Function 83 84Sub SetValue(row1, i, tmp) 85 Dim x As Long, y As Long, z As Long 86 x = pdsh.Cells(i, tmp(0)).Value 87 y = mash.Cells(row1, tmp(1)) 88 89 pdsh.Cells(i, tmp(3)).Value = x * y 90 pdsh.Cells(i, tmp(4)) = mash.Cells(row1, tmp(2)).Value 91 pdsh.Cells(i, tmp(5)) = mash.Cells(row1, tmp(3)).Value 92End Sub 93 94 95
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/27 11:43