- ベストアンサー
値によってセル塗りつぶし
初心者です。 データの中から、セル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 ご教示頂けると大変助かります。 よろしくお願い致します。
- みんなの回答 (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)
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
- imogasi
- ベストアンサー率27% (4737/17069)
マクロの記録モードで 「条件付き書式」を質問の条件で実行し、記録をとったコードを勉強してください。 いくら>初心者です。といえども、こんなことをしていては、進歩がありません。エクセルの常道を本やWEBで勉強し、その後にさらに自分で工夫しましょう。 その他にRange(”A1:A3”)<3の記法は個々のセルの値を聞くには、ダメです。 Sub test02() Range("A1:A3") = 7 End Sub は可能です。 なぜこれができないのという、根本的な点を突いていると思いますが、#1のご回答で説明されていますのでよく読んでください。 エクセルVBAは、エクセルの機能を最大限生かすコードであるべきです。エクセルで便利な機能ががあれば、対応したメソッドやプロパティがどう対応しているか、探しましょう。思いつくままに、IFと代入に還元して、我流でロジックを組み立てて、コードを作っては進歩がありません。
- popesyu
- ベストアンサー率36% (1782/4883)
基本的なところから誤解されているようなので、その誤解を解くのは難しいのですが。 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
お礼
丁寧に教えてくださって、ありがとうございます。 すごく助かりました。