- ベストアンサー
ExcelでVBAを使って色付けのプログラムを作成する方法
- Excelでレンジの値に基づいて色付けを行うVBAプログラムを作成する方法を教えてください。
- シート名が「aaa」で、レンジ「A3<A2<A1」がだんだん大きくなる場合、シート「bbb」のレンジ「B1」の文字を黄色にし、シート「bbb」のレンジ「C1」の文字を赤色にするプログラムを作成しましたが、うまく動作しません。
- また、シート「aaa」のレンジ「A3<A2<A1」が空白の場合は、シート「bbb」のレンジ「C1」の文字を赤色にするプログラムも作成しましたが、正しく動作しません。プログラムに間違いがあるか、修正方法を教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでいかがでしょう。 Sub 注意() Dim rA1 As Range, rA2 As Range, rA3 As Range Set rA1 = Worksheets("aaa").Range("A1") Set rA2 = Worksheets("aaa").Range("A2") Set rA3 = Worksheets("aaa").Range("A3") With Worksheets("bbb") If rA1.Value = "" Or rA3.Value = "" Then .Range("B1").Font.Color = RGB(0, 0, 0) ElseIf rA1.Value < rA2.Value And rA2.Value < rA3.Value Then .Range("B1").Font.Color = RGB(0, 255, 0) ElseIf rA1.Value > rA2.Value And rA2.Value > rA3.Value Then .Range("B1").Font.Color = RGB(255, 255, 0) Else .Range("B1").Font.Color = RGB(0, 0, 0) End If .Range("C1").Font.Color = RGB(255, 0, 0) End With End Sub
その他の回答 (6)
- nattocurry
- ベストアンサー率31% (587/1853)
#5のお礼に書いてある質問に関してですが、 試してみた上での質問でしょうか? それとも、試さずに質問していますか? それによって、回答が変わってきます。
お礼
お礼が遅れて申し訳ございません。おかげ様で旨く走らせることが出来ました。 本当にお世話になりました。
- hananoppo
- ベストアンサー率46% (109/235)
ANo.3です。お礼(補足)に対して回答致します。 例えば次のようなマクロを考えてみます。 Sub Sample() Dim rA1 As Range, rA2 As Range Set rA1 = Range("A1") Set rA2 = Range("A2") If rA1.Value < 50 Then rA2.Value = "50未満" rA2.Font.Color = RGB(255, 0, 0) Else rA2.Value = "50以上" rA2.Font.Color = RGB(0, 0, 255) End If End Sub このマクロは、A1セルの値が50未満ならA2セルに「50未満」と表示し、A2セルのフォントの色を赤にします。また、A1セルの値が50以上ならA2セルに「50以上」と表示し、A2セルのフォントの色を青にします。 rA1、rA2はセルを参照できるオブジェクト型(Range)の変数として宣言しています。 オブジェクト型以外の変数には数値や文字列等を代入しますが、オブジェクト型の変数にはオブジェクトそのものを代入します。そして、その場合は先頭に「Set」を付けなければいけません。例えば「Set rA1 = Range("A1")」の場合は、変数rA1にA1セルそのものを代入しています。決してA1セルの値を代入しているわけではありません。 また、オブジェクト型の変数にオブジェクトを代入すると、変数はオブジェクトそのものとして扱うことができます。つまり、オブジェクト型の変数に対してプロパティを参照したり、プロパティを設定したり、メソッドを実行したりすることができるわけです。例えば「rA2.Value = "50未満"」の場合は、変数rA2(=A2セル)のValueプロパティに「50未満」という文字列を設定するという意味になり、A2セルにその文字列が書き込まれます。「rA2 = "50未満"」や「Range("A2") = "50未満"」のようにValueプロパティを省略することも許されますが、文法的には不自然なので省略するべきではないと思います。
お礼
とてもわかりやすい説明で理解することが出来ました。 また何度も解答してくださり大変感謝いたしております。 この度はどうもありがとうございました。
- nattocurry
- ベストアンサー率31% (587/1853)
> 1つ目の条件の場合は、黄にする、 > 2つ目の条件の場合は、緑にする、 > 3つ目の条件の場合は、そのままにしておく、 > どれにも当てはまらない場合は、黒にする、 > ということで良いのでしょうか? > > 気になっているのは、『3つ目の条件の場合は、そのままにしておく』というところなのですが、これはこのとおりで大丈夫ですか? この質問に関して回答していただいていませんが、YESだという前提で。 Sub 注意() Dim aaaA1 As Range, aaaA2 As Range, aaaA3 As Range, bbbB1 As Range, bbbC1 As Range Set aaaA1 = Worksheets("aaa").Range("A1") Set aaaA2 = Worksheets("aaa").Range("A2") Set aaaA3 = Worksheets("aaa").Range("A3") Set bbbB1 = Worksheets("bbb").Range("B1") Set bbbC1 = Worksheets("bbb").Range("C1") bbbC1.Font.Color = vbRed If aaaA1.Value = "" Or aaaA3.Value = "" Then '何もしない ElseIf aaaA3.Value < aaaA2.Value And aaaA2.Value < aaaA1.Value Then bbbB1.Font.Color = vbYellow ElseIf aaaA3.Value > aaaA2.Value And aaaA2.Value > aaaA1.Value Then bbbB1.Font.Color = vbGreen Else bbbB1.Font.Color = vbBlack End If End Sub
お礼
解答ありがとうございます。とても参考になり、一つの仕事をするのにも色々考え方があるのだと勉強になりました。 最後にもう少し質問させて下さい、If文で何もしない場合 then の後を改行して Else bbbB1.Font.Color = vbBlack を入力すると、たとえばこのプログラムなら、"空白なら何もしないで、空白以外なら、bbbB1を黒にしなさい" なると考えていいのでしょうか? あと > 1つ目の条件の場合は、黄にする、 > 2つ目の条件の場合は、緑にする、 > 3つ目の条件の場合は、黒にする、 > どれにも当てはまらない場合は、黒にする、 だったら Sub 注意() Dim aaaA1 As Range, aaaA2 As Range, aaaA3 As Range, bbbB1 As Range, bbbC1 As Range Set aaaA1 = Worksheets("aaa").Range("A1") Set aaaA2 = Worksheets("aaa").Range("A2") Set aaaA3 = Worksheets("aaa").Range("A3") Set bbbB1 = Worksheets("bbb").Range("B1") Set bbbC1 = Worksheets("bbb").Range("C1") bbbC1.Font.Color = vbRed If aaaA1.Value = "" Or aaaA3.Value = "" Then bbbB1.Font.Color = vbBlack ElseIf aaaA3.Value < aaaA2.Value And aaaA2.Value < aaaA1.Value Then bbbB1.Font.Color = vbYellow ElseIf aaaA3.Value > aaaA2.Value And aaaA2.Value > aaaA1.Value Then bbbB1.Font.Color = vbGreen Else bbbB1.Font.Color = vbBlack End If End Sub と考えていいのでしょうか? お手数ですがよろしくお願いいたします。
- nattocurry
- ベストアンサー率31% (587/1853)
プログラムありきで考えないでください。 何をしたいから、どういうプログラムを組んで、その結果、こうなってしまう、という説明をして欲しいのですが、何をしたいのかを文章ではなくプログラムで説明されても、そういうプログラムになっているから、としか答えられません。 何をしたいのかは、プログラムを引き合いに出さないで、日本語の文章で説明してください。 もう一度同じ質問をします。 1つ目の条件と1つ目の条件が同じなのですが、間違ってませんか? 1つ目の条件は『シート "aaa" のレンジ "A3<A2<A1" とだんだん大きくなれば』、 2つ目の条件は『シート "aaa" のレンジ "A3<A2<A1" とだんだん大きくなれば』、 ですが、まったく同じです。間違ってませんか? 1つ目の条件の場合は、黄にする、 2つ目の条件の場合は、緑にする、 3つ目の条件の場合は、そのままにしておく、 どれにも当てはまらない場合は、黒にする、 ということで良いのでしょうか? 気になっているのは、『3つ目の条件の場合は、そのままにしておく』というところなのですが、これはこのとおりで大丈夫ですか? 追加で質問します。 『シート "aaa" のレンジ "A3,A1" が空白の場合』という条件ですが、これは「どちらも空白の場合」と「少なくともどちらか一方が空白の場合」、つまり AND か OR か、どちらでしょうか?
お礼
すみません表記ミスでした。 二つ目の条件は"A3<A2<A1"ではなく"A3>A2>A1"とだんだん小さくなれば・・です。 表記ミスになかなか気が付く事が出来ず申し訳ございませんでした。 もう一つの『シート "aaa" のレンジ "A3,A1" が空白の場合』は OR です。 お手数ですがよろしくお願いします。
- nattocurry
- ベストアンサー率31% (587/1853)
条件別の処理ですが、 どの条件でも常にbbbのC1の文字を赤くして、 bbbのB1の文字の色を、 1つ目の条件の場合は、黄にする、 2つ目の条件の場合は、緑にする、 3つ目の条件の場合は、そのままにしておく、 どれにも当てはまらない場合は、黒にする、 ということで良いのでしょうか?
お礼
はい、書かれた3つの条件で、どれにも当てはまらない場合は黒にする。 といった感じで作ったのですが、 7,8行目の ElseIf Worksheets("aaa").Range("A1") <> "" Then GoTo Sub1 とプログラムを加えたら、A1が空白でも(A3<A2、A1=空白) A3,A2と2つの値がだんだんと小さくなっていた場合でも、緑に表示されてしまいます。 この7,8行目を加えなければ、うまく走りました。 初心者の自分では、ここの何がおかしいのかよくわかりません。 お手数とは思いますがよろしくお願いいたします。
補足
すみません。ちっと言葉がたりませんでした。 この7,8行目を加えなければ、うまく走ったというのは、A1=空白 時を除いて うまく走ったと訂正させてください。
- nattocurry
- ベストアンサー率31% (587/1853)
1つ目の条件と1つ目の条件が同じなのですが、間違ってませんか? あと、順番としては、3つ目に書いてある条件が先頭にあるべきだと思います。 「うまく走らない」というのは、具体的にどういうことでしょうか? ○○○のようになってほしいのに、×××のようになってしまう、と具体的に説明願います。
お礼
すみません説明不足でした。 書かれた条件が同じというのは、 Worksheets("aaa").Range("A3")と.Range("A1")が空白だった場合 GoTo Sub1へというのでしょうか? このVBAを走らしてみたら、レンジに何も記入しないという事があるというので A1が空白でも(記載なし)、A3>A2>A1が成り立ってしまいます。 あとA3が空白でもA3<A2<A1が成り立ってしまうので それをなくす為、空白があった場合Sub1を飛ばしてSub2へ・・・。 というつもりで作りました。 あうまく走らないというのは、 7,8行目の ElseIf Worksheets("aaa").Range("A1") <> "" Then GoTo Sub1 とプログラムを加えたら、A1が空白でも(A3<A2、A1=空白) A3,A2と2つの値がだんだんと小さくなっていた場合でも、緑に表示されてしまいます。 この7,8行目を加えなければ、うまく走りました。 初心者の自分では、ここの何がおかしいのかよくわかりません。 お手数とは思いますがよろしくお願いいたします。
補足
すみません。ちっと言葉がたりませんでした。 この7,8行目を加えなければ、うまく走ったというのは、A1=空白 時を除いて うまく走ったと訂正させてください。
お礼
解答ありがとうございます。一つずつ比較していく方法しか知らなかったのですが (以前欲張って全部比較するのを作ったらエラーばかりで出来ないのかと思ってました) この様に、一回で比較する方法があったのですね。勉強になりました。 それと、もう3つ教えていただきたいのですが、よろしいでしょうか? 一つ目は、 Dimの宣言には色々あるみたいですが、As Rangeの選定理由を教えてもらえないでしょうか? 二つ目は Set rA1 = Worksheets("aaa").Range("A1") のように、("A1")に値を入れたい場合、頭にSetを付けた方がいいのでしょうか? 自分はいつも付けなかったもので・・・。 三つ目は If rA1.Value = "" Or rA3.Value = "" Then の"rA1.Value" ように自分はいつも"Value"を付けずにif文を書いてましたが どういったときに"Value"を付けるのでしょうか? 本当にお手数とは思いますが、よろしくお願いいたします。