人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセル(VBA)について質問です。

時間がある方でプログラムできる方おりましたらよろしくお願いいたします。

現在3つのデータ(長さ、重さ、厚さ)の値から商品レベルを48通りに分けるプログラムを作成したいと考えております。

長さ、重さ、厚さの条件については以下にあります。

★長さ、重さ、厚さに関する条件:http://oskuni7.sakura.ne.jp/hatena/question2/jouken.htm

★レベル分けの条件:http://oskuni7.sakura.ne.jp/hatena/question2/syouhin_level.htm

レベル分けを行いたいのは以下のデータになります。

★プログラムを実行するデータ:http://oskuni7.sakura.ne.jp/hatena/question2/syouhin.htm

列C、列D、列Eに入っているデータの条件から列Fにその条件にあった商品レベルを出力します。

お手数をおかけしますができるかたおりましたらよろしくお願いいたします。

また今後このような条件式を用いてプログラムをする場合、条件を増やしたい場合ここを変えるとやりやすくなる等ありましたらよろしくお願いいたします。




●質問者: aiomock
●カテゴリ:コンピュータ インターネット
✍キーワード:エクセル データ プログラム レベル 作成
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●35ポイント ベストアンサー

「長さ」「重さ」「厚さ」の3つのパラメータが、ご質問のリンク先にあったような文字列として確実に入っていれば、VBAを使うまでもなく、VLOOKUP関数を使って下記のようにして求めることができます。青字の部分は「式」として入力してください。


シート名[LEVEL]

比較用 商品レベル 長さ 重さ 厚さ
=C3&D2&E2 A1 60cmまで 100gまで 1cmまで
=C3&D3&E3 A2 60cmまで 150gまで 1cmまで
=C4&D4&E4 A3 60cmまで 250gまで 1cmまで

――以下省略――


シート名[ITEMS]

管理番号 長さ 重さ 厚さ 管理番号の商品レベル
A13 60cmまで 250gまで 3.5cmまで =VLOOKUP(B2&C2&D2,LEVEL!$A$2:$E$49,2,FALSE)
A13 60cmまで 250gまで 3.5cmまで =VLOOKUP(B3&C3&D3,LEVEL!$A$2:$E$49,2,FALSE)
A31 60cmまで 250gまで 3.5cmまで =VLOOKUP(B4&C4&D4,LEVEL!$A$2:$E$49,2,FALSE)

――以下省略――


ただし、この方法だと LEVEL にないパラメータの組み合わせ――たとえば「35cmまで」「110gまで」「2.3cmまで」などという商品データがあると、正しいレベルが判定できます。

その場合は、「長さ」「重さ」「厚さ」を数値として比較する必要があるのですが、そうなると、「まで」が「以下」なのか「未満」なのか、言葉の定義を明確化していかなければなりません。

◎質問者からの返答

ご回答ありがとうございます。

作成してみたらできました。

ですが一部バグが発生いたします。

バグが発生したのは

100cmまで500gまで 3.5cm以上

100cmまで1kgまで 3.5cm以上

の場合のVLOOKUP式を入れ込んだときなのですが

VLOOKUPの関数を入れ込んだ際に問題になる主な原因はどのようなものでしょうか?

他の物はまったく問題なく表示出力されていたので、なぜこの条件の場合だけ問題が起こったのかわからずじまいです。

VLOOKUPに詳しいかたおられましたらよろしくお願いいたします。


2 ● SALINGER
●35ポイント

既に解決してるようですが、面白そうな質問だったのでVBAでユーザー定義関数を使って回答してみます。

まず、「レベル分けの条件」の表の商品レベルの名前の付け方は規則性があるようですので、

これは、「長さ、重さ、厚さに関する条件」の表さえあれば後は自動で商品レベルの名前をつけられそうです。

また、「長さ、重さ、厚さに関する条件」の表に新しく項目を増やした場合に

「レベル分けの条件」の表を作り直すのも手間がいるので、5kg以上を増やしたり項目を増やしたら即座に反映されるようにしました。


まず、「長さ、重さ、厚さに関する条件」の表をシート名「項目」にして左上詰めで作ります。

(リンク先の表をExcelにコピペする場合は、「cm(小文字)」が「?(センチメートルの変換)」と混ざっているようなので気をつけてください)


次に、ユーザー定義関数を標準モジュールにコピペします。

Function Level(target1 As Range, target2 As Range, target3 As Range) As String
 Dim i As Integer
 Dim j As Integer
 Dim k As Integer
 Dim lastRow1 As Long
 Dim lastRow2 As Long
 Dim lastRow3 As Long
 With Worksheets("項目")
 lastRow1 = .Cells(Rows.Count, 1).End(xlUp).Row
 For i = 2 To lastRow1
 If Trim(.Cells(i, 1).Value) = Trim(target1.Value) Then Exit For
 Next
 lastRow2 = .Cells(Rows.Count, 2).End(xlUp).Row
 For j = 2 To lastRow2
 If Trim(.Cells(j, 2).Value) = Trim(target2.Value) Then Exit For
 Next
 lastRow3 = .Cells(Rows.Count, 3).End(xlUp).Row
 For k = 2 To lastRow3
 If Trim(.Cells(k, 3).Value) = Trim(target3.Value) Then Exit For
 Next
 End With
 If i = lastRow1 + 1 Or j = lastRow2 + 1 Or k = lastRow3 + 1 Then
 Level = ""
 Else
 Level = Chr((lastRow3 - 1) * (i - 2) + k + 63) & j - 1
 End If
End Function

ユーザー定義関数とはなんぞやという場合はこちら

http://hp.vector.co.jp/authors/VA016119/hajimete/udf1.html


このユーザー定義関数は

商品レベル=Level(長さのセル,重さのセル,厚さのセル)

となっています。


最後に、管理番号の商品レベルの列に

=Level(B2,C2,D2)

のように数式を入れて、下にコピーすれば完成です。


注意)アルファベットは26文字なので、長さの項目の数と厚さの項目の数を掛けた値が26を超えると、記号が入ったりします。

◎質問者からの返答

ご回答ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ