• ベストアンサー

ExcelVBAで

お世話になってます。 ExcelVBAのSelect Caseについての質問です。 例えば、 Select Case 得点 Case Is>=80 評価="優" Case Is>=70 評価="良" ・ ・ ・ とあります。 ここで、条件の80以上というのを決まった値ではなくセルの値としてできないのでしょうか?例えばDの列の値を条件として設定できないのでしょうか? また、評価="優"というのも、決まった値ではなくEの列といったようにできないのでしょうか? 教えて下さい。

  • cache
  • お礼率90% (186/205)

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 こんな感じで出来ます。 Select Case 得点   Case Is >= Range("D1").Value     評価 = Range("E1").Value   Case Is >= Range("D2").Value     評価 = Range("E2").Value ・・・ End Select

cache
質問者

お礼

早々の解答ありがとうございます。 質問の仕方が悪かったと思います。 上のケースですと、Range("D1").Value で、D1と設定されてしまいますよね。 そうではなくて条件がDの列に並んでいるんです。 つまり、条件が変数なのですが。

その他の回答 (9)

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.10

#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

cache
質問者

お礼

解決いたしました。 おかしな質問で申し訳ありませんでした。

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.9

#8です。 >自身 自信でした。(~_~;)

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.8

横から失礼します。 ひょっとして、こういうことでしょうか? 下の例では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/17068)
回答No.7

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

cache
質問者

お礼

解決いたしました。 ありがとうございました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.6

>次の行に行った場合に、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句が全部同じ条件になってしまいますね。 やはり、もっと具体的な条件を提示してもらわないと、これ以上は無理ですね。

cache
質問者

お礼

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)
回答No.5

横から失礼します。 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.4

>しきい値です。 なら、私のNo.2の回答でいいと思いますが。 試してみましたか?

cache
質問者

お礼

Case Is >= Range("D1").Value のD1というのは一つの値ですよね。次の行に行った場合に、Range("D1").Value のD1はD1では無くて、D2なのです。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

>そうではなくて条件がDの列に並んでいるんです。 >つまり、条件が変数なのですが。 実際にD列にはどのような値が入っているのでしょうか? 「80」とかのしきい値ではないんですか?

cache
質問者

お礼

しきい値です。

  • wakky_tom
  • ベストアンサー率40% (20/50)
回答No.1

こんにちは あらかじめ変数として代入したいセルを定義しておき、Caseで使用すれば可能です。

cache
質問者

お礼

回答ありがとうございます。 ”あらかじめ変数として代入したいセルを定義しておき”とはどのようにするのでしょうか?

関連するQ&A

  • ExcelVBA select case 値設定

    ExcelVBAのSelect Caseで Select Case 数式または文字列式 Case 値1, 値2, 値3  処理 Case Else  処理 End Select のようにカンマで区切ると複数の値を指定できるはずです。 この値1, 値2, 値3のところに別のシートのA1、A2、A3に入っている値を設定したいのですが そのようなことは可能でしょうか?(A1→値1 A2→値2 A3→値3) 5年ぶりにVBAを書いていますが、びっくりするぐらい忘れています。。。

  • ExcelVBAで、フィルタリング後の一覧から値を取得

    ExcelVBAで、フィルタリング後の一覧から値を取得方法について質問です。 100件のデータから、フィルタの条件で10件程度に絞り込んだ場合、その列の値を、配列に突っ込みたいのですが、この場合、どうすればよろしいでしょうか? もうちょっと、詳しく↓ ↓フィルタリング条件 Range("B7").Select Selection.AutoFilter Field:=2, Criteria1:="=?n????", Operator:=xlAnd ↓取得したい値 Range("B8").Select から B列でフィルタリングのデータが存在するまで。 ※現状 下セルに移動するために、「Selection.Offset(1, 0).Select」を使っていたのですが、フィルタリングの条件を無視して行を選択されてしまいます。 この場合の、コマンドを教えていただければ助かります。

  • ユーザー定義関数に特定のセルの値をかける

    IF(シート1!C2>0,名目(A2)*E2,6) 上記の式のように一定の条件下で、ユーザー定義関数に特定のセルの値をかけた 値を表示させようとしています。 しかしなぜか0が表示されてしまいます Select Case KATA Case Is = 1 名目 = E * 34 のようにユーザー定義関数の中にセル式をかけるとしても 0が表示されます どうしてでしょうか

  • エクセル VBAについて。その2

    以前、こちらの掲示板でお世話になった者です。   Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$C$5" Select Case Target.Value Case 1 Range("C6").Value = 24 Range("D5").Value = 600 Range("D6").Value = 0 Range("E5").Value = 400 Range("E6").Value = 0 Case 2 Range("C6").Value = 32 Range("D5").Value = 1000 Range("D6").Value = 0 Range("E5").Value = 500 Range("E6").Value = 0 End Select Case "$D$5" Select Case Range("C5").Value Case 1 Range("D6").Value = (600 - Range("D5").Value) / 25 Case 2 Range("D6").Value = (1000 - Range("D5").Value) / 25 End Select Case "$E$5" Select Case Range("C5").Value Case 1 Range("E6").Value = (400 - Range("E5").Value) / 50 Case 2 Range("E6").Value = (500 - Range("E5").Value) / 50 End Select と、上記のようなマクロがお手伝いしていただいた結果、完成しました。 C5に1を代入した場合 D5 = 600 D6 = 0 E5 = 400 E6 = 0 C5に2を代入した場合 D5 = 1000 D6 = 0 E5 = 500 E6 = 0   C5に1を代入しており、D5の値を500に下げた時 D6 = 4 (D5の値を100下げる毎にD6の値に+4 ) (D5の値を100上げる毎にD6の値に-4 ) C5に1を代入しており、E5の値を300に下げた時 D6 = 4 (E5の値を100下げる毎にE6の値に+4 ) (E5の値を100上げる毎にE6の値に-4 ) <以下、C5に2を代入した時のケースを省略。>   というような意味合いのマクロになったと思いますが、少々困ったことが発生しました。 (D5の値を100下げる毎にD6の値に+4 ) (D5の値を100上げる毎にD6の値に-4 ) (E5の値を100下げる毎にE6の値に+4 ) (E5の値を100上げる毎にE6の値に-4 ) この部分を (D5の値を100下げる毎にD6の値に+4 ) (D5の値を100上げる毎にD6の値に-8 ) (E5の値を100下げる毎にE6の値に+4 ) (E5の値を100上げる毎にE6の値に-8 ) に変更したいのですが、計算式がわかりません(?ω?) どなたかご指導のほどよろしくお願いします。

  • VBAで成績表を作りたい

    VBAについては全く初心者ですが、自分なりに調べて成績表を作ってみました。 A列個人の名前、B・C・D列にそれぞれ1~3回目のテストの総得点が入っていとして、E列に得点のランク別にA~Mの成績を出します。 Select Case を使って成績を出すようにしたいのですが、1~3回目のテストの中で、1番高得点だったもので判定したいのです。 また、全員が3回ともテストを受けているとは限らず、得点が空欄になる人もいます。 具体的には A列   B列    C列   D列   E列 ○さん  580点 620点 530点  C列の得点で判定 △さん  550点 580点 600点  D列の得点で判定 □さん  600点      590点  A列の得点で判定 1回分のテストの得点だけでは Select Case を使って上手く判定できたのですが、3回分の中から選択させる方法がわかりません。 関数を使う方法もあると思いますが、今回はVBAを使って作りたいと思います。 よろしくお願いします!

  • Select Caseステートメント 「Is」

    VBAについて質問です。 http://excelvba.pc-users.net/fol6/6_2.html の Sub test() Dim intPoint As Integer intPoint = InputBox("点数を入力してください") Select Case intPoint Case Is >= 80 MsgBox "優です。" Case Is >= 70 MsgBox "良です。" Case Is >= 60 MsgBox "可です。" Case Else MsgBox "再テストです。" End Select End Sub は、 なぜ Sub test2() Dim intPoint As Integer intPoint = 75 Select Case intPoint Case intPoint >= 80 MsgBox "優です。" Case intPoint >= 70 MsgBox "良です。" Case intPoint >= 60 MsgBox "可です。" Case Else MsgBox "再テストです。" End Select End Sub では、だめなのでしょうか? test2を実行すると、 Case Elseの MsgBox "再テストです。" になってしまいます。 本当は、"良です。"が正しいのに。 testをF8でステップインしながら実行した時に、 「Case Is >= 80」 の来た時に、isにカーソルをあてても、InputBoxで入力した数値が表示されません。 なぜ、この場合、Case intPoint >= 80 ではダメなのか理由をご教授ください。ご回答よろしくお願いします。

  • ExcelVBAのマクロを使ってテキストファイルの文字を読み込む

    お世話になります 表題のとおりなのですが、ExcelVBAのマクロを使ってテキストファイルの文字を読み込むマクロの書き方を探しています。 具体的には、ExcelVBAで作ったボタンを押すと、あるテキストファイル(TEST.txt)に書かれている文字列をExcelVBAで取得して、それをセルに表示させるものです。 VBA関連のサイトがあまり無く困っています、宜しくお願いします。

  • ExcelVBAで重複しているもの以外を抜き出したい

    Excelで以下のようなことをしたいのです。     A 1  みかん 2  りんご 3  みかん 4  めろん 5  りんご とあったとします。 この表から、重複したものははぶいてカウントしたいのですが、 どのようにしたらよいでしょうか? 【理想結果】    C     D 1 みかん   2 2 りんご    2 3 めろん   1 実際に試してみたコードは以下の通りです。 -------ここから---------- Dim i As Integer Dim i2 As Integer Dim Count As Integer Dim Name As String Dim Last As Integer For i = 1 To 5 'A列の1行目から5行目まで。 Last = Cells(3).CurrentRegion.Rows.Count 'C列の最終行を取得。 Name = Cells(i, 1) 'NameはA列の値。 For i2 = 1 To Last Select Case Name Case Is = Cells(i2, 3) Cells(Last + 1, 3) = "" Case Is <> Cells(i2, 3) Cells(Last + 1, 3) = Name End Select Next Next 上記コードを試すと、C列の1行目があいて2行目からA列をそのまま写した状態になってしまいます。 Ex2000です。

  • ExcelVBAでセルに入力されている種類と文字列を表示したいのですが

    ExcelVBAでセルに入力されている種類と文字列を表示したいのですが… Excelで、例えば下のように文字が入力されているとき、 A1:あああ B1:あああ C1:いいい D1:あああ E1:ううう F1:いいい このときにセルに入力されている種類(数)とその文字(この場合だと、3種類:『あああ』、『いいい』、『ううう』)をメッセージボックスで表示させたいのですが、VBAで作るのは可能でしょうか?

  • 文字の回数を数えるには。

    お世話になります。 エクセルの1つのセルに優、良、可のいずれかが入っており、その優・良・可の回数を数えたいのですが、どのようにしたら良いでしょうか? 文字を数える関数はあるのでしょうか? すみませんが教えてください。

専門家に質問してみよう