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


IF文をセルに入れて出力をしていたのですが、
セルに入れるIF文の条件式が長すぎて(条件としては25通り程だったのですが)エラーになってしまいました。
この対処法としてマクロを作成できる方おりましたらプログラムを書いて頂ければと考えております。

やりたいことは以下に書いてあることになります。

★プログラム1 ウォッチリスト数とアクセス数を元に商品のレベルをS~Eに振り分ける。

★プログラム2 商品のレベル分けを参考に出品方法をランダムに選択する。

詳しいデータなのですが以下にあります。

http://oskuni7.sakura.ne.jp/PROGRAM.htm

プログラムの処理は上から順番に処理していき、データが空白の部分で処理を終了するようなプログラムが理想になっております。

プログラムを書いて頂いた方にはポイントを多めに支払わせて頂ければと考えております。
よろしくお願いいたします。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2008/11/25 15:26:15
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント100pt

ウォッチリストの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

http://www.sanynet.ne.jp/~awa/excelvba/kouza.html

id:aiomock

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

申し訳ありませんが、エラーが一部発生してしまいました。

実行時エラー13 ”型が一致しません”というエラーで以下を修正するように表示されたのですが

Cells(ll, "S").Value = itemRank(Cells(ll, "Q").Value, Cells(ll, "R").Value)

どのように対処すればよろしいでしょうか。

お手数をおかけしますがよろしくお願いいたします。

2008/11/25 09:57:51

その他の回答2件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント100pt

ウォッチリストの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

http://www.sanynet.ne.jp/~awa/excelvba/kouza.html

id:aiomock

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

申し訳ありませんが、エラーが一部発生してしまいました。

実行時エラー13 ”型が一致しません”というエラーで以下を修正するように表示されたのですが

Cells(ll, "S").Value = itemRank(Cells(ll, "Q").Value, Cells(ll, "R").Value)

どのように対処すればよろしいでしょうか。

お手数をおかけしますがよろしくお願いいたします。

2008/11/25 09:57:51
id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント50pt

コメントが無効なので回答で失礼します。


エラーが発生したときに、ll にマウスカーソルをのせると

なんと出ていますか。


その行でエラーが出ているのですが、その行のQ列とR列のデータは

何が入っているのでしょうか。


整数を期待しているので、それ以外のデータが入っているとエラーになるかと思います。

まずは、内容を教えてください。


それから、コメント有効にお願いします。

http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html

id:aiomock

ll=4と出ております。

Q列とR列には商品のデータが入っております。

データですが

以下のようになっております。

http://oskuni7.sakura.ne.jp/hatena/webpagejoutai.htm

お手数をおかけし申し訳ございません。

2008/11/25 13:26:23
id:kaiton No.3

回答回数260ベストアンサー獲得回数34

ポイント50pt

関数だけでする方法です。

ウォッチリスト数とアクセス数から、それぞれをレベル分けしているところまでは現状どおりとして

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)

id:aiomock

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

2008/11/25 15:14:53
  • id:Mook
    あらら、数値ではなく文字列そのものが入ってるのですか・・・。

    再掲載しますので、回答数の上限を上げていただけますか。
  • id:Mook
    コメントに手回答します。
    下記の関数を差し替えてください。

    '-----------------------------------------------
    Function itemRank(ac As String, wl As String) As String
    '-----------------------------------------------
      Dim rkArray As Variant
      rkArray = Split("EDBSS/EECSS/DEDAA/SEEBA/SEEBA", "/")
      
      Dim aRK As Integer
      Select Case Left(ac, 1)
      Case "①"
        aRK = 0
      Case "②"
        aRK = 1
      Case "③"
        aRK = 2
      Case "④"
        aRK = 3
      Case "⑤"
        aRK = 4
      Case Else
        itemRank = "該当項目がありません"
        Exit Function
      End Select
      
      Dim wRK As Integer
      Select Case Left(wl, 1)
      Case "①"
        wRK = 0
      Case "②"
        wRK = 1
      Case "③"
        wRK = 2
      Case "④"
        wRK = 3
      Case "⑤"
        wRK = 4
      Case Else
        itemRank = "該当項目がありません"
        Exit Function
      End Select

      itemRank = Mid(rkArray(aRK), wRK + 1, 1)
    End Function
  • id:kaiton
    VBAを使わない方法を次のように回答しました。
    ---------------------------------------------
    関数だけでする方法です。
    ウォッチリスト数とアクセス数から、それぞれをレベル分けしているところまでは現状どおりとして
    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)
  • id:aiomock
    Mook さん

    実行できました。

    本当にありがとうございます^^。
  • id:aiomock
    kaiton さん

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

    今回プログラムが実行できましたが、

    次回同じようなことになったときには是非是非利用させて頂こうと思います。

    個の度はありがとうございます^^。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません