IF文をセルに入れて出力をしていたのですが、
セルに入れるIF文の条件式が長すぎて(条件としては25通り程だったのですが)エラーになってしまいました。
この対処法としてマクロを作成できる方おりましたらプログラムを書いて頂ければと考えております。
やりたいことは以下に書いてあることになります。
★プログラム1 ウォッチリスト数とアクセス数を元に商品のレベルをS~Eに振り分ける。
★プログラム2 商品のレベル分けを参考に出品方法をランダムに選択する。
詳しいデータなのですが以下にあります。
http://oskuni7.sakura.ne.jp/PROGRAM.htm
プログラムの処理は上から順番に処理していき、データが空白の部分で処理を終了するようなプログラムが理想になっております。
プログラムを書いて頂いた方にはポイントを多めに支払わせて頂ければと考えております。
よろしくお願いいたします。
ウォッチリストの8、9はどうするのとか、アクセス数は境界はどっちにするの
とか、いくつか仕様があいまいですが、下記のようでどうでしょうか。
先頭行がデータの場合は、★の部分を1に変更ください。
不明な点は、コメントで対応します。
Option Explicit '----------------------------------------------- Sub program1() '----------------------------------------------- Dim ll As Long ll = 2 '★開始行:タイトル列がなければ1に変更 Do While Cells(ll, "Q").Value <> "" And Cells(ll, "R").Value <> "" Cells(ll, "S").Value = itemRank(Cells(ll, "Q").Value, Cells(ll, "R").Value) ll = ll + 1 Loop End Sub '----------------------------------------------- Sub program2() '----------------------------------------------- Dim ll As Long ll = 2 '★開始行:タイトル列がなければ1に変更 Do While Cells(ll, "S").Value <> "" Cells(ll, "T").Value = itemSelect(Cells(ll, "S").Value) ll = ll + 1 Loop End Sub '----------------------------------------------- Function itemRank(ac As Long, wl As Long) As String '----------------------------------------------- Dim rkArray As Variant rkArray = Split("EDBSS/EECSS/DEDAA/SEEBA/SEEBA", "/") Dim aRK As Integer aRK = CInt(ac / 25) If aRK < 0 Then aRK = 0 If aRK >= 4 Then aRK = 4 Dim wRK As Integer Select Case True Case wl <= 1 wRK = 0 Case wl <= 3 wRK = 1 Case wl <= 5 wRK = 2 Case wl <= 7 wRK = 3 Case Else wRK = 4 End Select itemRank = Mid(rkArray(aRK), wRK + 1, 1) End Function '----------------------------------------------- Function itemSelect(iRank As String) As String '----------------------------------------------- Dim sArray As Variant Select Case iRank Case "S" sArray = Split("①そのまま続行/②値段を1000円・100円・1円にする/③高値回しの見せつけ/④類似商品を勧める/⑤おまけを付ける", "/") Case "A" sArray = Split("①そのまま続行/②値段を1000円・100円・1円にする/③高値回しの見せつけ/④類似商品を勧める/⑤おまけを付ける", "/") Case "B" sArray = Split("①そのまま続行/②コバンザメ作戦/③高値回しの見せつけ/④類似商品を勧める/⑤おまけを付ける", "/") Case "C" sArray = Split("①コバンザメ作戦/②おまけを付ける/③セット作戦", "/") Case "D" sArray = Split("①おまけを付ける/②セール感覚の均一仕掛け/③セット作戦", "/") Case "E" sArray = Split("①おまけを付ける/②セール感覚の均一仕掛け/③セット作戦", "/") Case Else itemSelect = "" Exit Function End Select itemSelect = sArray(CInt(Rnd() * 150) Mod (UBound(sArray) + 1)) End Function
ウォッチリストの8、9はどうするのとか、アクセス数は境界はどっちにするの
とか、いくつか仕様があいまいですが、下記のようでどうでしょうか。
先頭行がデータの場合は、★の部分を1に変更ください。
不明な点は、コメントで対応します。
Option Explicit '----------------------------------------------- Sub program1() '----------------------------------------------- Dim ll As Long ll = 2 '★開始行:タイトル列がなければ1に変更 Do While Cells(ll, "Q").Value <> "" And Cells(ll, "R").Value <> "" Cells(ll, "S").Value = itemRank(Cells(ll, "Q").Value, Cells(ll, "R").Value) ll = ll + 1 Loop End Sub '----------------------------------------------- Sub program2() '----------------------------------------------- Dim ll As Long ll = 2 '★開始行:タイトル列がなければ1に変更 Do While Cells(ll, "S").Value <> "" Cells(ll, "T").Value = itemSelect(Cells(ll, "S").Value) ll = ll + 1 Loop End Sub '----------------------------------------------- Function itemRank(ac As Long, wl As Long) As String '----------------------------------------------- Dim rkArray As Variant rkArray = Split("EDBSS/EECSS/DEDAA/SEEBA/SEEBA", "/") Dim aRK As Integer aRK = CInt(ac / 25) If aRK < 0 Then aRK = 0 If aRK >= 4 Then aRK = 4 Dim wRK As Integer Select Case True Case wl <= 1 wRK = 0 Case wl <= 3 wRK = 1 Case wl <= 5 wRK = 2 Case wl <= 7 wRK = 3 Case Else wRK = 4 End Select itemRank = Mid(rkArray(aRK), wRK + 1, 1) End Function '----------------------------------------------- Function itemSelect(iRank As String) As String '----------------------------------------------- Dim sArray As Variant Select Case iRank Case "S" sArray = Split("①そのまま続行/②値段を1000円・100円・1円にする/③高値回しの見せつけ/④類似商品を勧める/⑤おまけを付ける", "/") Case "A" sArray = Split("①そのまま続行/②値段を1000円・100円・1円にする/③高値回しの見せつけ/④類似商品を勧める/⑤おまけを付ける", "/") Case "B" sArray = Split("①そのまま続行/②コバンザメ作戦/③高値回しの見せつけ/④類似商品を勧める/⑤おまけを付ける", "/") Case "C" sArray = Split("①コバンザメ作戦/②おまけを付ける/③セット作戦", "/") Case "D" sArray = Split("①おまけを付ける/②セール感覚の均一仕掛け/③セット作戦", "/") Case "E" sArray = Split("①おまけを付ける/②セール感覚の均一仕掛け/③セット作戦", "/") Case Else itemSelect = "" Exit Function End Select itemSelect = sArray(CInt(Rnd() * 150) Mod (UBound(sArray) + 1)) End Function
ご回答ありがとうございます^^。
申し訳ありませんが、エラーが一部発生してしまいました。
実行時エラー13 ”型が一致しません”というエラーで以下を修正するように表示されたのですが
Cells(ll, "S").Value = itemRank(Cells(ll, "Q").Value, Cells(ll, "R").Value)
どのように対処すればよろしいでしょうか。
お手数をおかけしますがよろしくお願いいたします。
コメントが無効なので回答で失礼します。
エラーが発生したときに、ll にマウスカーソルをのせると
なんと出ていますか。
その行でエラーが出ているのですが、その行のQ列とR列のデータは
何が入っているのでしょうか。
整数を期待しているので、それ以外のデータが入っているとエラーになるかと思います。
まずは、内容を教えてください。
それから、コメント有効にお願いします。
ll=4と出ております。
Q列とR列には商品のデータが入っております。
データですが
以下のようになっております。
http://oskuni7.sakura.ne.jp/hatena/webpagejoutai.htm
お手数をおかけし申し訳ございません。
関数だけでする方法です。
ウォッチリスト数とアクセス数から、それぞれをレベル分けしているところまでは現状どおりとして
http://oskuni7.sakura.ne.jp/PROGRAM.htm
の上の表を、行方向、列方向に名前を付けます。
方法は、先日日記に書いた
http://d.hatena.ne.jp/kaiton/20081105/1225895624
や http://officetanaka.net/excel/function/tips/tips30.htm を参考にしてください。
行に「①25以下」等の名前が、列に「②3以下」等の名前が付きます。
#「①0,1」は名前を付けても参照時にエラーになるので、「①0_1」などに変更してください。
http://oskuni7.sakura.ne.jp/hatena/webpagejoutai.htm の
S4=INDIRECT(Q4) INDIRECT(R4) とします。
T4=INDEX(INDIRECT(S4),INT(RAND()*COUNTA(INDIRECT(S4)))+1)
ご回答ありがとうございます。
ご回答ありがとうございます^^。
申し訳ありませんが、エラーが一部発生してしまいました。
実行時エラー13 ”型が一致しません”というエラーで以下を修正するように表示されたのですが
Cells(ll, "S").Value = itemRank(Cells(ll, "Q").Value, Cells(ll, "R").Value)
どのように対処すればよろしいでしょうか。
お手数をおかけしますがよろしくお願いいたします。