- ベストアンサー
ExcelVBAで
お世話になってます。 ExcelVBAのSelect Caseについての質問です。 例えば、 Select Case 得点 Case Is>=80 評価="優" Case Is>=70 評価="良" ・ ・ ・ とあります。 ここで、条件の80以上というのを決まった値ではなくセルの値としてできないのでしょうか?例えばDの列の値を条件として設定できないのでしょうか? また、評価="優"というのも、決まった値ではなくEの列といったようにできないのでしょうか? 教えて下さい。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 こんな感じで出来ます。 Select Case 得点 Case Is >= Range("D1").Value 評価 = Range("E1").Value Case Is >= Range("D2").Value 評価 = Range("E2").Value ・・・ End Select
その他の回答 (9)
- sakenomo
- ベストアンサー率52% (35/67)
#8,#9です。 もうひとつ。もしかしたら、D列にテストの点数があって、E列に評価をだす。これを1行毎にやる、ということでしょうか。 もしそうなら、こんなかんじでしょうか。 Sub test() For p = 0 To 56635 With Range("E1").Offset(p) Select Case Range("D1").Offset(p) Case Is = "" Exit Sub Case Is >= 90 .Value = "優" Case Is >= 80 .Value = "良" Case Is >= "70" .Value = "可" Case Else .Value = "不可" End Select End With Next p End Sub
お礼
解決いたしました。 おかしな質問で申し訳ありませんでした。
- sakenomo
- ベストアンサー率52% (35/67)
#8です。 >自身 自信でした。(~_~;)
- sakenomo
- ベストアンサー率52% (35/67)
横から失礼します。 ひょっとして、こういうことでしょうか? 下の例ではD1、E1を起点に、それぞれ一つずつ下のセルを参照していきます。 Set Score = Range("D1") Set Result = Range("E1") Select Case 得点 Case Is >= Score.Value 評価 = Result.Value Case Is >= Score.Offset(1, 0).Value 評価 = Result.Offset(1, 0).Value Case Is >= Score.Offset(2, 0).Value 評価 = Result.Offset(2, 0).Value End Select もし、D1を100、D2を99・・・D100を1とした場合、100点満点の成績を10点刻みで評価するなら、 Set Score = Range("D10") Case Is >= Score.Value Case Is >= Score.Offset(10, 0).Value Case Is >= Score.Offset(20, 0).Value 5点刻みなら、 Set Score = Range("D5") Case Is >= Score.Value Case Is >= Score.Offset(5, 0).Value Case Is >= Score.Offset(10, 0).Value となります。 こう書いていると、マクロを実行中にしきい値を変えたくなってきますが、Offset()の中の数字はSelect Caseの中に入ってしまうと変えようが無いので、それぞれ変数にしてSelect Caseの前で数を割り当てるとか、Select Caseの中は固定しておいてD列の数字を変えてしまう方法が考えられます。 ご質問の文や#6での返信を素直に読むと、誰が見ても#2さんの回答になると思います。もう少し表現を工夫されたほうがいいのでは。(^_^;) いろいろ書きましたが、わたしもご質問の意図を読み取っているかどうか自身がありません。(^^ゞ
- imogasi
- ベストアンサー率27% (4737/17070)
A1セルに例えば「55」 B1:B3に(区分け表) 80 60 40 と入れて、下記を実行すると 60-40と出ます。 A1の値を変えて実行すると、MSGBOX表示が それなりに出ます。 こう言うことを出来れば良いのでしょうか。 Sub test01() Select Case Range("a1") Case Is >= Range("b1") MsgBox Range("b1") & "以上" Case Is >= Range("b2") MsgBox Range("b1") & "-" & Range("b2") Case Is >= Range("b3") MsgBox Range("b2") & "-" & Range("b3") Case Else MsgBox Range("b3") & "以下" End Select End Sub
お礼
解決いたしました。 ありがとうございました。
- maruru01
- ベストアンサー率51% (1179/2272)
>次の行に行った場合に、Range("D1").Value のD1はD1では無くて、D2なのです。 どこを変化させたいのかよくわかりません。 Case Is >= Range("D1").Value Case Is >= Range("D2").Value Case Is >= Range("D3").Value ・・・ ということではないのでしょうか? それとも、bin-chanさんのを拝借すると、 n行 = n行 + 1 得点 = Range("C" & n行).Value Select Case 得点 Case Is >= Range("D" & n行).Value 評価 = Range("E" & n行).Value Case Is >= 70 評価 = Range("E" & n行).Value Case Is >= 60 評価 = Range("E" & n行).Value ・・・ End Select という感じで先頭のCaseだけを可変にしたいのでしょうか? その場合、評価はどこから持ってくるのでしょうか? もっと具体的にセル位置を提示して下さい。 bin-chanさんへ それだと、Case句が全部同じ条件になってしまいますね。 やはり、もっと具体的な条件を提示してもらわないと、これ以上は無理ですね。
お礼
Case Is >= Range("D1").Value Case Is >= Range("D2").Value Case Is >= Range("D3").Value ・・・ こういうことです。 また、これにともなって、返す値も、 評価 = Range(E1).Value 評価 = Range(E2).Value 評価 = Range(E3).Value ・・・ のように変化します。
- bin-chan
- ベストアンサー率33% (1403/4213)
横から失礼します。 cacheさんは「行単位」で処理なさりたいのですね? n行 = n行 + 1 得点 = Range("C" & n行).Value のような記述が事前にある、ということでは? そうであるなら、maruruさんのNo.2を n行 = n行 + 1 得点 = Range("C" & n行).Value Select Case 得点 Case Is >= Range("D" & n行).Value 評価 = Range("E" & n行).Value Case Is >= Range("D" & n行).Value 評価 = Range("E" & n行).Value ・・・ End Select とすれば良いと思います。
- maruru01
- ベストアンサー率51% (1179/2272)
>しきい値です。 なら、私のNo.2の回答でいいと思いますが。 試してみましたか?
お礼
Case Is >= Range("D1").Value のD1というのは一つの値ですよね。次の行に行った場合に、Range("D1").Value のD1はD1では無くて、D2なのです。
- maruru01
- ベストアンサー率51% (1179/2272)
>そうではなくて条件がDの列に並んでいるんです。 >つまり、条件が変数なのですが。 実際にD列にはどのような値が入っているのでしょうか? 「80」とかのしきい値ではないんですか?
お礼
しきい値です。
- wakky_tom
- ベストアンサー率40% (20/50)
こんにちは あらかじめ変数として代入したいセルを定義しておき、Caseで使用すれば可能です。
お礼
回答ありがとうございます。 ”あらかじめ変数として代入したいセルを定義しておき”とはどのようにするのでしょうか?
お礼
早々の解答ありがとうございます。 質問の仕方が悪かったと思います。 上のケースですと、Range("D1").Value で、D1と設定されてしまいますよね。 そうではなくて条件がDの列に並んでいるんです。 つまり、条件が変数なのですが。