• ベストアンサー

値によってセル塗りつぶし

初心者です。 データの中から、セルC5からC88の中で数値が300以上はセルを赤に塗りつぶし、250以上300未満は青、200以上250未満は黄色、などとやりたいのですが、if...then...elseステートメントを組んでやってみると「型が一致しません。」となってしまいます。 Sub 選択範囲処理() Range("c5:c88").Select If Range("c5:C88") >= 300 Then Interior.ColorIndex = 3 ElseIf Range("c5:c88") <= 300 And Range("c5:C88") >= 250 Then Interior.ColorIndex = 5 ElseIf Range("c5:c88") <= 250 And Range("c5:c88") >= 200 Then Interior.ColorIndex = 6 ElseIf Range("c5:c88") <= 200 And Range("c5:c88") >= 150 Then Interior.ColorIndex = 20 Else Interior.ColorIndex = 10 End If End Sub ご教示頂けると大変助かります。 よろしくお願い致します。

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

  • ベストアンサー
  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.4

基本的には Range→Cells for Nextを使うです。 Sub 選択範囲処理() Dim i As Long For i = 5 To 88 If Cells(i, 3) >= 300 Then Cells(i, 3).Interior.ColorIndex = 3 ElseIf Cells(i, 3) <= 300 And Cells(i, 3) >= 250 Then Cells(i, 3).Interior.ColorIndex = 5 ElseIf Cells(i, 3) <= 250 And Cells(i, 3) >= 200 Then Cells(i, 3).Interior.ColorIndex = 6 ElseIf Cells(i, 3) <= 200 And Cells(i, 3) >= 150 Then Cells(i, 3).Interior.ColorIndex = 20 Else Cells(i, 3).Interior.ColorIndex = 10 End If Next i End Sub

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

Sub 選択範囲処理() Dim x As Range For Each x In Range("C5:C88") With x Select Case x.Value Case Is >= 300 .Interior.ColorIndex = 3 Case 250 To 299 .Interior.ColorIndex = 5 Case 200 To 249 .Interior.ColorIndex = 6 Case 150 To 199 .Interior.ColorIndex = 20 Case Else .Interior.ColorIndex = 10 End Select End With Next End Sub

arisa77079
質問者

お礼

丁寧に教えてくださって、ありがとうございます。 すごく助かりました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

マクロの記録モードで 「条件付き書式」を質問の条件で実行し、記録をとったコードを勉強してください。 いくら>初心者です。といえども、こんなことをしていては、進歩がありません。エクセルの常道を本やWEBで勉強し、その後にさらに自分で工夫しましょう。 その他にRange(”A1:A3”)<3の記法は個々のセルの値を聞くには、ダメです。 Sub test02() Range("A1:A3") = 7 End Sub は可能です。 なぜこれができないのという、根本的な点を突いていると思いますが、#1のご回答で説明されていますのでよく読んでください。 エクセルVBAは、エクセルの機能を最大限生かすコードであるべきです。エクセルで便利な機能ががあれば、対応したメソッドやプロパティがどう対応しているか、探しましょう。思いつくままに、IFと代入に還元して、我流でロジックを組み立てて、コードを作っては進歩がありません。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

基本的なところから誤解されているようなので、その誤解を解くのは難しいのですが。 Rangeというのは一種の配列みたいなもので、それ単体で扱うことも可能なのですが、その要素を一つ一つ手にとって確認するときはきちんと指定する必要があります。 分かり易く例えると 「1年3組」というグループはそれだけで扱うことは出来ます。1年3組を集合させるとか、1年3組の平均点だとか。1年3組の生徒数とか、担任の先生とかいう情報もありますね。 但し個々の生徒の得点は個々の生徒が持つ情報です。1年3組のある生徒の得点が何点だったかというのを調べる時、1年3組という指定からだけでは分かりません。1年3組の、例えば出席番号だったり名前だったりで個人を指定しないことには得点は調べられません。 つまり Range("c5:C88") >= 300 という部分は何をしようとしているのかは分かりますが、コード的には1年3組の300以上を抜き出せという意味不明な命令になっているのです。 で個々の生徒を一々指定して判別させるのもこれはまた大変です。クラスの人数が増えれば増えるだけコードも増えることになります。そのためにループ文というのが活用されるのです。これは同じ処理をひたすら繰り返す際に使いますが、VBAの場合のループ構文は「For~Next」となります。 今回のケースでは例えば下記のようにすると個々のセルの値が順番に確認できます。あとはこれを判別させて、ColorIndexを設定しましょう。またその際はIF判別よりもSelectでの判別の方がこのケースではお薦めです。 Dim C As Range For Each C In Range("C5:C88") MsgBox (C) Next C

関連するQ&A

  • VBAでの計算後のセルに2重線で囲む

    まだPC・VBA不慣れな為、実行できないので、教えてください。 c16セルに休日を入力すると無理つぶしは成功しましたが、c16セルに祭日を入力すると赤の2重線で囲みたいのですが、できませんので、方法をお願いします。 もう1点がCELLS・RANGEを使った2種類の方法をお願いします。 よろしくお願いします。 Sub 練習44() Dim kyuyo As Currency If Range("c16").Value = "祭日" Then Worksheets("練習1If~Then").Cells(16, 3).xlDouble.ColorIndex = 3 ElseIf Range("c16").Value = "休日" Then Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 5 Else Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 10 End If End Sub

  • コンパイルエラー「プロシージャが大きすぎます」とのエラーが出ます

    セルに入力する値によって、重複した場合にセルの色が変化するようにVBAで記述しましたが、設定した行数が多すぎて、コンパイルエラー「プロシージャが大きすぎます」とのエラーが出ます。小さく記述するにはどの様に書いたらよいでしょうか?ご指導お願いいたします。 記述したVBAは下記とおりです。約35行ほどでエラーです。 Private Sub Worksheet_Change(ByVal Target As Range) Set myRng = Range("B2") '2行目の設定 For Each c In myRng If c.Value = "" Then c.Interior.ColorIndex = 2 'B2が空白ならばセルの色を白色 ElseIf c.Value = Range("I2") Then c.Interior.ColorIndex = 3 'B2=I2ならばセルの色を赤色 ElseIf c.Value = Range("J2") Then c.Interior.ColorIndex = 6 'B2=J2ならばセルの色を黄色 ElseIf c.Value = Range("K2") Then c.Interior.ColorIndex = 6 'B2=K2ならばセルの色を黄色 ElseIf c.Value = Range("L2") Then c.Interior.ColorIndex = 8 'B2=L2ならばセルの色を青色 ElseIf c.Value = Range("M2") Then c.Interior.ColorIndex = 8 'B2=M2ならばセルの色を青色 Else c.Interior.ColorIndex = xINone End If Next c Set myRng = Range("C2") '2行目の設定 For Each c In myRng If c.Value = "" Then c.Interior.ColorIndex = 2 'C2が空白ならばセルの色を白色 ElseIf c.Value = Range("I2") Then c.Interior.ColorIndex = 6 'C2=I2ならばセルの色を黄色 ElseIf c.Value = Range("J2") Then c.Interior.ColorIndex = 6 'C2=J2ならばセルの色を黄色 ElseIf c.Value = Range("K2") Then c.Interior.ColorIndex = 6 'C2=K2ならばセルの色を黄色 ElseIf c.Value = Range("L2") Then c.Interior.ColorIndex = 8 'C2=L2ならばセルの色を青色 ElseIf c.Value = Range("M2") Then c.Interior.ColorIndex = 8 'C2=M2ならばセルの色を青色 Else c.Interior.ColorIndex = xINone End If Next c Set myRng = Range("D2") '2行目の設定 For Each c In myRng If c.Value = "" Then c.Interior.ColorIndex = 2 'D2が空白ならばセルの色を白色 ElseIf c.Value = Range("I2") Then c.Interior.ColorIndex = 6 'D2=I2ならばセルの色を黄色 ElseIf c.Value = Range("J2") Then c.Interior.ColorIndex = 6 'D2=J2ならばセルの色を黄色 ElseIf c.Value = Range("K2") Then c.Interior.ColorIndex = 6 'D2=K2ならばセルの色を黄色 ElseIf c.Value = Range("L2") Then c.Interior.ColorIndex = 8 'D2=L2ならばセルの色を青色 ElseIf c.Value = Range("M2") Then c.Interior.ColorIndex = 8 'D2=M2ならばセルの色を青色 Else c.Interior.ColorIndex = xINone End If Next c      ・      ・ End Sub

  • or では大丈夫なのにandではダメな理由は?

    or では大丈夫なのにandではダメな理由は? セルA1に2007/10/3を入れ、 2007年ならピンク 2008年なら黄緑 とやろうとして、2つのマクロを作りました。 Macro1では正常に動作するのですが Macro2を実行すると2007/10/3なのに、黄緑になってしまいます。 2008/10/3でMacro2を実行すると何も動きません。 Macro1とMacro2の違いは「or」と「and」の違いだけです。 Sub Macro1() If 39081 >= CLng(Range("a1")) Or CLng(Range("a1")) <= 39447 Then Range("a1").Interior.ColorIndex = 38 ElseIf 39448 >= CLng(Range("a1")) Or CLng(Range("a1")) <= 39813 Then Range("a1").Interior.ColorIndex = 4 End If End Sub Sub Macro2() If 39081 >= CLng(Range("a1")) And CLng(Range("a1")) <= 39447 Then Range("a1").Interior.ColorIndex = 38 ElseIf 39448 >= CLng(Range("a1")) And CLng(Range("a1")) <= 39813 Then Range("a1").Interior.ColorIndex = 4 End If End Sub 「and」なら2007/1/1より大きい なおかつ 2007/12/31より小さい と思い、最初はMacro2を作りましたが、うまくいかない為Macro1を作りました。 でも 「or」だと、2007/1/1より大きい もしくは 2007/12/31より小さい ですよね? 2008/1/1でも「2007/1/1より大きい もしくは 」にヒットしてしまうため、 andにしたのですが、なぜandではうまくいかないのでしょうか? よろしくお願いします。

  • 【ExcelVBA】セルに入力された値によって書式を変更する

    こんにちは。いつもお世話になっております。 標題の件で質問させて下さい。 セルに入力された値によって塗りつぶす色を変えるマクロを作成しています。 条件付き書式では、条件を3つしか指定できなかったので、マクロにて制御しようと思いました。 値の判定を行い、入力した各文字列の色で塗りつぶされるところは正常に動作しているのですが、 値が入っていてもいなくても、複数のセルを選択し、「Delete」キーを押下すると、背景色がグレーになってしまうのです。 初歩的な質問で申し訳ありませんが、どなたか上記のような動作をする理由をご教授頂けないでしょうか。 以下にソースを載せておきます。 宜しくお願い致します。 --- Private Sub Worksheet_Change(ByVal target As Range) On Error Resume Next If (target.Cells.Value = "グレー") Then target.Cells.Interior.ColorIndex = 15 ElseIf (target.Cells.Value = "イエロー") Then target.Cells.Interior.ColorIndex = 6 ElseIf (target.Cells.Value = "スカイブルー") Then target.Cells.Interior.ColorIndex = 33 ElseIf (target.Cells.Value = "ピンク") Then target.Cells.Interior.ColorIndex = 7 Else target.Cells.Interior.ColorIndex = 0 End If End Sub

  • マクロの簡素化

    下記マクロです。 Range("AE6:AE1005").Select Selection.ClearContents Selection.Interior.ColorIndex = xlNone If Range("AD6").Value > 5 Then Range("AE6") = "*" Range("AE6").Select With Selection.Interior .ColorIndex = 3 End With Else End If If Range("AD7").Value > 5 Then Range("AE7") = "*" Range("AE7").Select With Selection.Interior .ColorIndex = 3 End With Else End If If Range("AD8").Value > 5 Then Range("AE8") = "*" Range("AE8").Select With Selection.Interior .ColorIndex = 3 End With Else End If 中略(セルを一個づつ指定しています) If Range("AD1004").Value > 5 Then Range("AE1004") = "*" Range("AE1004").Select With Selection.Interior .ColorIndex = 3 End With End If If Range("AD1005").Value > 5 Then Range("AE1005") = "*" Range("AE1005").Select With Selection.Interior .ColorIndex = 3 End With Else End If Range("AE3").Select 有るセルを参照しその値が5以上だったら別のセルに*マークとセルに色を付けるマクロですが、一個づつセル指定をしていますが、何とか短く出来ないでしょうか? お分かりになる方宜しくお願い致します。

  • エクセル VBA セルの色をSheet1とSheet2の両方を変えたいのですが・・・

    最近困っているところが表題の通りなのですが Sheet1のB2を右クリックするとB2のセルの色を変えて Sheet2のB2のセルも色を変えたいというものです。 現状で Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Dim RngA As Range, myRngA As Range Set Rng = Range("B3:W3,b7:w8,b12:w12,d13:w13,d17:w18,d22:w23") Set myRng = Intersect(Target, Rng) If myRng.Interior.ColorIndex = xlColorIndexNone Then myRng.Interior.ColorIndex = 37 Else If myRng.Interior.ColorIndex = 37 Then myRng.Interior.ColorIndex = 45 Else myRng.Interior.ColorIndex = xlColorIndexNone End If End If Cancel = True End Sub とここまではあるのですが、これをどう改造すればSheet2の同じセルの色もかわるのでしょうか? 宜しくお願いいたします

  • このVBAソースのどこが間違ってるか教えてください

    Dim csp As Integer 'ストップ Dim css As Integer 'ストップorスタート Sub Quest2() If css = 0 Then css = 1 Quest2a Else cstp = 1 css = 0 End If End Sub Sub Quest2a() Sheets("Sheet1").Select Range("B1:J10").Select Selection.Interior.ColorIndex = x1None Range("a1").Select cstp = 0 Do r = 1: c = 5 For i = 0 To 15 If i < 9 Then Cells(r, c).Interior.ColorIndex = x1None r = r + 1 If i < 5 Then c = c + 1 Else c = c - 1 End If Cells(r, c).Interior.ColorIndex = 3 Else Cells(r, c).Interior.ColorIndex = x1None r = r - 1 If i < 13 Then c = c - 1 Else c = c + 1 End If Cells().Interior.ColorIndex = 3 End If 'タイミング For tm1 = 1 To 1000: For tm2 = 1 To 100: Next If cstp = 1 Then Exit For End If Next DoEvents If cstp = 1 Then Exit For End If If r = 3 And c = 5 Then Cells(r, c).Interior.ColorIndex = x1None End If Next DoEvents If cstp = 1 Then Exit Do End If Loop Cells(10, 9) = Cells(r, c) Cells(10, 9).Interior.ColorIndex = 8 End Sub

  • シート全体対象の設定方法と複数のセル範囲の参照方法

    ブック名「全体.xls」の全シート対象に、 (A1:B10) (D1:F10)の範囲だけの数値を調べ、 その数値が50以上のときに背景色を赤色にするマクロを作りたいですが。 Sub セルの値が50以上の時、背景色を赤色にする() Dim i As Integer i = ActiveCell.Value With ThisWorkbook("全体").Range("A1,B10") If i >= 50 Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.ColorIndex = xlNone End If End With With ThisWorkbook("全体").Range("C1,F10") If i >= 50 Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.ColorIndex = xlNone End If End With End Sub こうしても、 With ThisWorkbook("全体").Range("A1,B10") のところでエラーではじかれます。シート全体の("A1,B10")を対象にしたいですが、指定方法が分かりません。 ちなみにシート数は追加・削除あるので一定ではないです。 また、("A1,B10")と("C1,F10")にて個別にコードを書くのではなく 同時に設定したいけれど、(.Range("A1,B10")&("C1,F10")みたいな) やり方を知りたいです。 初歩的な質問で申し訳ありません。よろしくお願いします。

  • エクセル VBA Worksheet_Changeとコピー&ペースト

    いつも皆様には大変お世話になっております。 早速の質問ですが Worksheet_Changeを使ってマクロを組んでいるのと フォームを使ってマクロを組んでいます フォームのほうからのマクロで Sheet1のセルをコピーしてSheet2のセルに貼り付けをしたいのですが、 貼り付けができません。 フォームのほうからのマクロじゃなく手動でコピー&ペーストも利きません。コピーはできるのですがSheet2に変えたところ貼り付けができなくなってしまいます。 Worksheet_Changeのマクロを消すと動きました。どうにかならないでしょうか? ちなみにWorksheet_Changeの中のマクロは Private Sub Worksheet_Change(ByVal Target As Range) If Range("J48") = Range("J68") Then Range("J48").Interior.ColorIndex = xlColorIndexNone Else Range("j48").Interior.ColorIndex = 26 End If If Range("V48") = Range("V68") Then Range("V48").Interior.ColorIndex = xlColorIndexNone Else Range("V48").Interior.ColorIndex = 26 End If End Sub となっています。 何かいい解決法がありましたらご教授のほどよろしくお願いいたします。

  • 入力数値によってセル色が決まるコードで変更が正しく反映されません

    セルの入力数値によってセルの塗りつぶし色が決まるコードを自作してみました。 0 =< x < 2 : 赤 2 =< x < 4 : 青 4 =< x < 6 : 黄 6 =< x < 8 : 黄緑 8 =< x < 10: ピンク それ以外 : 塗りつぶしなし なんとなくCaseの使い方が正確ではないような気もしますが。。。 ここで困ったことがおきました。手動で数字を入力すると、一応意図したとおりにセルの塗りつぶし色が反映されます。しかし、一旦塗りつぶされたセルの数値を消去しても、塗りつぶしなしとはならずに赤くなってしまいます。 また、対象外のセルから数字を一つコピーして対象セルに貼り付けると、意図したとおりに色が反映されます。しかし、二つ以上のセルをコピーして貼り付けようとすると、実行エラー'13'型が一致しません、というエラーが出てしまいます。 原因が分かりましたらご教示いただけると幸いです。 --- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column >= 1 And Target.Column <= 10 Then If Target.Row >= 1 And Target.Row <= 10 Then Select Case Target.Value Case 0 To 2 Target.Interior.ColorIndex = 3 Case 2 To 4 Target.Interior.ColorIndex = 5 Case 4 To 6 Target.Interior.ColorIndex = 6 Case 6 To 8 Target.Interior.ColorIndex = 4 Case 8 To 10 Target.Interior.ColorIndex = 7 Case Else Target.Interior.ColorIndex = 2 End Select End If End If End Sub ---

専門家に質問してみよう