• ベストアンサー
  • 困ってます

[VBA] セルの色を塗りつぶす

  • 質問No.9274321
  • 閲覧数626
  • ありがとう数6
  • 回答数7

お礼率 45% (223/488)

条件付き書式では出来ないみたいなので、VBAに挑戦しましたが苦労しています。

Win 8, excel 2010です。

「ある1つのセルが100の時、その左横の4列をある色で塗りつぶす」

という事を行いたいのですが、
ネットで調べたものをちょっとアレンジしてみましたが
Sub change(ByVal Target As Range)
Dim myColor As Variant

If Target.Count <> 1 Then Exit Sub
If Target.Column <> 4 Then Exit Sub

Application.EnableEvents = False
Select Case Target.Value
Case 100
myColor = 3
Case Else
myColor = xlNone
End Select
Cells(Target.Row, 1).Resize(1, 4).Interior.ColorIndex = myColor
Application.EnableEvents = True
End Sub

change(関数名)の横に引数があるから(参照渡し???) マクロに表示されないという情報を
見つけたのですが、色々やっても訳が分からなくなりました。
どうすれば実行できるようになるのでしょうか?

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

  • 回答No.7
  • ベストアンサー

ベストアンサー率 51% (2545/4949)

>>条件付き書式を直接手作業で設定した方が手っ取り早い場合が殆どではないかと

>ただ僕の欲しい要件定義では条件付き書式で出来ないと思ったので質問させていただきました。

 おかしな事を仰いますね。
 そう思っておられるのなら、何故、回答No.4様のマクロを試しておられるのですか?
 回答No.4様御自身が

>「条件付き書式」のシート上の操作をして、マクロの記録でコードを知る方法

と仰っておられる通り、回答No.4のマクロは、「セルの塗りつぶしの色を変更するマクロ」などではなく、「条件付き書式を設定するマクロ」ですよ。
 回答No.5は、単に回答No.4に対する補足として、回答No.4で述べられている「マクロの記録で『条件付き書式を設定するマクロ』のコードを知る」ためには

>[条件付き書式]ボタンをクリックした際に現れる選択肢の中から、[ルールの管理]ではなく[新しいルール]を選択してクリックする様にして下さい。

と申しているだけであり、「条件付き書式を設定するマクロ」を使うのが良いと申している訳ではないというのに、何故、回答No.5に対して

>ただ僕の欲しい要件定義では条件付き書式で出来ないと思ったので質問させていただきました。

と補足しておられるのでしょうか?

 それに、そもそも

>条件付き書式で出来ないと思った

と考える理由などない筈です。

> 「ある1つのセルが100の時、その左横の4列をある色で塗りつぶす」

という程度の事であれば、回答No.1に書かれている条件付き書式を使用した方法で十分である事は、試してさえいればすぐに判る事なのですから。
 それが判っていないという事は、質問者様は単に根拠もなく

>条件付き書式で出来ない

と思い込んでいるだけに過ぎません。
 ですから、まず

>条件付き書式で出来ない

という思い込みは捨てて、兎に角、回答No.1の方法を試してみて下さい。

 それとも、質問者様がやりたい事は、

> 「ある1つのセルが100の時、その左横の4列をある色で塗りつぶす」

という事を実現するだけでは不十分で、他にも何か質問者様が説明していない条件があるのでしょうか?
 もしその様な他の条件があるのであれば、きちんと説明して下さい。
 要件や条件に関して、質問者様の方で何も説明されていなければ、他人である回答者にはどんな要件や条件なのか解らないのは当然の話です。
お礼コメント
KAIJI-000

お礼率 45% (223/488)

おっしゃるように単に何の根拠もなく「条件付き書式で出来ない」
と思い込んでいました。
確かにNo.1の回答にあるものだけで出来ました。


>他にも何か質問者様が説明していない条件があるのでしょうか?

「追加で質問」というやらしい思いは全くないです。


とにかくすみません。マjavascript:void(0);クロでしか出来ないと思いこんでいました。
投稿日時:2017/01/03 14:55

その他の回答 (全6件)

  • 回答No.6

ベストアンサー率 27% (4524/16174)

#2の私の回答に対する疑問は、塗りつぶしたい列の、「行をすべて範囲指定して」、ただし一番上の行の左上隅の1セルをアクチブにして、操作をしてないからではないかな。
そうすることで、式の上では各行なりに変化してくれる。番地の行の」部分の直前に$をつけて置ないのはそのため。
こちらも回答前には、テストしましたがね。
お礼コメント
KAIJI-000

お礼率 45% (223/488)

補足への回答有難うございます。出来るようになりました。
投稿日時:2017/01/03 14:51
  • 回答No.5

ベストアンサー率 51% (2545/4949)

 条件付き書式をマクロに記録させるためには、まず1度、条件付き書式を設定する必要があるため、記録されたマクロを使える様になった段階では既に条件付き書式が設定済みとなっているという事になりますので、「何らかの状況の変化に従って条件付き書式を自動で変更する」という用途でもない限りは、条件付き書式を態々マクロを使って設定するくらいであれば、条件付き書式を直接手作業で設定した方が手っ取り早い場合が殆どではないかと思います。

 もし、それでも尚、「マクロの記録」を使って条件付き書式を設定するマクロを作りたいという場合には、マクロの記録では「条件付き書式ルールの管理」ダイアログボックスを使って条件付き書式を設定する方法を記録する事が出来ませんので、最初に選択するセル範囲をA2セルではなくA2:V999のセル範囲(←「100」と入力するセルがE2:Z999のセル範囲の中のどこかのセルである場合)とした上で、[条件付き書式]ボタンをクリックした際に現れる選択肢の中から、[ルールの管理]ではなく[新しいルール]を選択してクリックする様にして下さい。

【参考URL】
 エクセルの神髄|鵜原パソコンソフト研究所 > マクロVBA > マクロの記録でVBA > 条件付き書式
  http://excel-ubara.com/excelvba2/EXCELVBA021.html
補足コメント
KAIJI-000

お礼率 45% (223/488)

>条件付き書式を直接手作業で設定した方が手っ取り早い場合が殆どではないかと

ただ僕の欲しい要件定義では条件付き書式で出来ないと思ったので質問させていただきました。
投稿日時:2016/12/30 21:00
  • 回答No.4

ベストアンサー率 27% (4524/16174)

もしVBAでやるなら、マクロの記録モードにして、「条件付き書式」のシート上の操作をして、マクロの記録でコードを知る方法が良い。
まずこういうところに、頭が行くべきだ。
Sub Macro1()
Range("E2:H10").Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=COUNTIF($A2:$D2,100)>=1"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
End Sub
ーー
余談
シートのRangeにAddするものは
FormatConditions.Add
Validations
HyperLinks
Names
HpageBreaks
AddComment
などある。こういう機会に知識を拡げるのも勉強の仕方。
補足コメント
KAIJI-000

お礼率 45% (223/488)

回答有難うございます。
ただm塗りつぶされる方向を左にしたいので、工夫して自分でやってみたところ、Range("A2:D10") ($E2:$H2,100)にしてみますと向きが変わるだけと思っていましたが、色のぬられている部分が2、3段になってしまっています。他のコードの影響でしょうか?
投稿日時:2016/12/30 20:54
お礼コメント
KAIJI-000

お礼率 45% (223/488)

すみません、補足で書いてあることはこちらが変なマクロを入れていたせいでした。今削除した所、今度は何も色が変わっていないのが正しい補足です。
投稿日時:2016/12/30 21:25
  • 回答No.3

ベストアンサー率 51% (2545/4949)

 回答No.1です。

 もし、

>「ある1つのセルが100の時、その左横の4列をある色で塗りつぶす」

という事を条件付き書式を使わずに、VBAで行うとしますと、
Sub change(ByVal Target As Range)
では、そのVBAのマクロを設定したシート状のセルに直接、値を入力した場合にしかマクロが働かず、「ワークシート関数が入力されているセル」が存在していて、「そのワークシート関数の計算結果によって値が100に書き換わったセル」の 左横の4列のセルに対しては色を付ける事が出来ません。
 ですから、「ワークシート関数が入力されているセル」の 左横の4列のセルに対しても色が付く様にするためには、
「ある1つのセルが100の時、その左横の4列をある色で塗りつぶす」
という設定にしたいシートの「シートモジュール」に以下の様な3つのVBAのマクロを書き込む必要があります。


Private Sub Worksheet_Calculate()

Dim FunctionRange As Range

On Error Resume Next
Set FunctionRange = Cells.SpecialCells(xlCellTypeFormulas, 23)
On Error GoTo 0
If Not FunctionRange Is Nothing Then _
Call QNo9274321_VBA_セルの色を塗りつぶす(FunctionRange)

End Sub


Private Sub Worksheet_Change(ByVal Target As Range)

Call QNo9274321_VBA_セルの色を塗りつぶす(Target)

End Sub


Private Sub QNo9274321_VBA_セルの色を塗りつぶす(ByVal myRange As Range)

Const w0 As Integer = 4 '塗りつぶすセル範囲の列幅
Dim c As Range, i As Integer, w As Integer

On Error Resume Next
Set myRange = Union(myRange, Cells.SpecialCells(xlCellTypeFormulas, 23))
On Error GoTo 0
For Each c In myRange
For i = 1 To w0
If c.column - i > 0 Then
With c.Offset(0, -i)
If WorksheetFunction.CountIf(.Offset(0, 1).Resize(1, w0), 100) = 0 Then
.Interior.Pattern = xlNone
Else
.Interior.Color = RGB(255, 0, 0)
End If
End With
End If
Next i
Next c

End Sub
補足コメント
KAIJI-000

お礼率 45% (223/488)

回答有難うございます。
しかしながら、上記のコードをsheet1のみに3つとも入れて100と入力しますと、左隣に赤く塗りつぶされたセルその隣3段に緑で塗りつぶされたセルとなってしまっています。
投稿日時:2016/12/30 21:11
お礼コメント
KAIJI-000

お礼率 45% (223/488)

申し訳ないです。補足は無視してください。こちらが色々なマクロを削除してい無いためおかしくなっていました。実際はちゃんと出来ました。
投稿日時:2016/12/30 21:29
  • 回答No.2

ベストアンサー率 27% (4524/16174)

コンピュターに関する質問なのだから、質問文は正確に書くこと。
>ある1つのセルが100の時
(1)決まったある1列の値が100の場合
(2)ある行の、指定した複数列の、どの1列でも、100の場合
どちらか?
4列は連続した4列だろうね。
ーー
むつかしそうな(2)の条件の方を説明すると、
ABCD <-第1行
列として、
データ<-第2行以下として
34 100空白100 <-第2行
仮に、J2セルに =COUNTIF(A2:D2,100)を入れると、100のセルがあれば、その
数が1以上になる。
塗りつぶす4つの列が、E,F,G,H列として、
E-H列の複数行をまず範囲指定(例E2:H10)しておいて、
ホームー条件付き書式ー新しいルールー数式を利用して・・
式に =COUNTIF($A2:$D2,100)>=1
塗りつぶしの色を指定(例 ライトグりーン色など指定)
で仕舞ではないか。VBAなどむつかしく考えなくても良い。
式の範囲指定は$A2:$D2のように、右列の式において、複写的に考えられて、B-E列のように、ズレないように、工夫したらしまい。
VBAで遣る場合も、COUNTIF関数は便利だよ。
Application.Worksheet.Function.CountIf
ーー
VBAでやるなら、セルの値の変化に対応しなければだめで、
Sub change(ByVal Target As Range)はイベントの勉強不足ではないか。
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address
End Sub
のようなところに書くべきだろう。A-D列のイベントの限定取得も勉強してないようだ。
補足コメント
KAIJI-000

お礼率 45% (223/488)

(1)決まったある1列の値が100の場合
(2)ある行の、指定した複数列の、どの1列でも、100の場合
に関してですが、今回は1列だけでいいです。

実際に仰っているやり方を試してみましたが、なぜか入力した段の1つ上の段が
塗りつぶされてしまっています。適用先が間違っているからでしょうか?


数式は=COUNTIF($A3:$D3,100)>=1で、
適用先は=$E$2:$H$10です。
投稿日時:2016/12/30 21:39
  • 回答No.1

ベストアンサー率 51% (2545/4949)

>条件付き書式では出来ないみたいなので

 え? 出来ないという事はないと思います。
 例えば「100」と入力するセルがE2:Z999のセル範囲の中のどこかのセルである場合、次の様な操作を行って条件付き書式を設定すれば良いと思います。

A2セルを選択
  ↓
Excelウィンドウの[ホーム]タブをクリック
  ↓
現れた「スタイル」グループの中にある[条件付き書式]ボタンをクリック
  ↓
現れた選択肢の中にある[ルールの管理]をクリック
  ↓
現れた「条件付き書式ルールの管理」ダイアログボックスの中にある[新規ルール]ボタンをクリック
  ↓
現れた「新しい書式ルール」ダイアログボックスの「ルールの種類を選択して下さい」欄の中にある[数式を使用して、書式設定するセルを決定]をクリック
  ↓
現れた「次の数式を満たす場合に値を書式設定」欄の中に

=COUNTIF(B2:E2,100)

と入力
  ↓
「新しい書式ルール」ダイアログボックスの[書式]ボタンをクリック
  ↓
現れた「セルの書式設定」ダイアログボックスの[塗りつぶし]タブをクリック
  ↓
現れた背景色のサンプルの中にある赤色の四角形をクリック
  ↓
「セルの書式設定」ダイアログボックスの[OK]ボタンをクリック
  ↓
「新しい書式ルール」ダイアログボックスの[OK]ボタンをクリック
  ↓
「条件付き書式ルールの管理」ダイアログボックスの「適用先」欄に設定されているセル範囲を

=$A$2:$V$999

に変更(カーソルとマウスの左ボタンによる範囲選択が使えます)
  ↓
「条件付き書式ルールの管理」ダイアログボックスの[適用]ボタンをクリック
  ↓
「条件付き書式ルールの管理」ダイアログボックスの[OK]ボタンをクリック
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ