条件付き書式の計算式と適用先範囲

このQ&Aのポイント
  • VBAで条件付き書式を設定する際に、値の比較式を指定します。
  • この場合、A列とB列の値が異なる場合に赤い色を付けるように設定しています。
  • しかし、なぜ2行目以外のセルでも同様の効果が効いてしまうのかわからないという質問です。
回答を見る
  • ベストアンサー

条件付き書式の計算式と適用先範囲

通常のExcel操作による条件付き書式も同じなのですが、VBAで書いているときに疑問が出たので、VBAで質問させていただきます。 図のようにA列とB列の値を比較し、A列とB列の値が同じでない場合、つまり「A列-B列」の値が0でないセルに赤い色をつけることにしました。A列が正で、B列が違っている場合色をつける、という考えかたの処理です。 不思議なのは、手動で条件付き書式画面からやっても、下のコードのVBAでやっても「--A」のところのように、比較式を「"=$A2-$B2<>0"」と、2行目で行っているだけ(比較はここだけ)なのです。 しかし実行結果は、A列とB列の値が同じではない行すべてのB列に色がついています。 B列のセルの同じ行のA列と値が異なる場合、赤い色をセルにつけるのが目的なので、結果としてはこのコード(条件付き書式)は正しく動作しています。 質問は、比較式が「--A」のところ=2行目にしかないのに、なぜ3行目~20行目も同様の効果が効いているのでしょうか。 この挿入している効果は条件付き書式であるため、B列のセル上の値を左の行(A列)と合致させると、ちゃんと赤い色は消えてくれます。 この謎が解けません。 ---------------------- Sub 左列と異なる値は赤に() '条件書式を挿入 With ActiveSheet Range("B2:B20").Select With Selection .FormatConditions.Delete .FormatConditions.Add Type:=xlExpression, Formula1:="=$A2-$B2<>0" ' --A .FormatConditions(1).Interior.Color = RGB(255, 200, 200) End With Range("A1").Select End With End Sub

  • ketae
  • お礼率86% (295/343)

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8020/17142)
回答No.3

#1です。 補足で「逆にいえば、20行目に=$A20-$B20<>0が自動的に挿入されているのなら、理解できる」なんて言っているところから判断すると,条件付き書式のルールがセルごとに設定されていると思い込んでいるようです。 (あなたの考え) B2に=$A2-$B2<>0 B3に=$A3-$B3<>0 途中省略 B20に=$A20-$B20<>0 > ほかのセルに設定された条件は > =$A2-$B2<>0 > となっています(B20セルを選択して条件付き書式の画面で確認)。 ここでも条件付き書式のルールがセルごとに設定されていると思い込んでいることがわかります。条件付き書式はセルには設定されていないのです。セル範囲に設定されています。 この例では条件付き書式のルールはB2:B20に設定されているものだけです。一つしかありません。そしてそのルールの内容が=$A2-$B2<>0です。 (実際の設定) B2:B20に=$A2-$B2<>0 このときの式の書き方が理解できていないのでしょう。設定範囲がB2:B20と言うように複数セルになっていますが,ルールを書くときに参照するセルは必ず左上のセルです。参照セル以外にルールを適用するときには相対参照の考えを使って式を解釈します。だからB20ではあたかも=$A20-$B20<>0が入力されているかのように振る舞います。

ketae
質問者

お礼

思い込んでいるというか、条件付き書式を手動でやっていたころから、なんでそうならないのか?という問いかけでした。 >ルールを書くときに参照するセルは必ず左上のセル 条件付き書式について、この説明をどの本でも見たことがないので疑問でした。 これでストンと胸に落ちました。

その他の回答 (2)

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

小生は、数度質問を読んだが、意図がはっきり理解できたと思えない。 しかし推定して、下記のようなことかな? 今までのこのコーナーの条件付き書式に関した質問者(初学者が多いようだ)は、 条件付き書式を考えるとき、下記(1)が多かったように思う。 私が思うに、下記の2つの考え方・やり方があって、 (1)「1つのセル」(書式設定するセル範囲の左上隅1セルの場合がほとんど)に、 条件のための数式を設定して、それを以下(以右)のセル範囲にコピーして、全体のセル範囲に拡張する。 (2)「書式を設定したいセル範囲全体」を範囲指定しておいて(通常は手動操作で) 、範囲指定した左上隅の1セルを念頭に(かつ左上隅の1セルをアクチブセルにしておいてー>この点重要)(代表して)1セル用の数式を設定する。 私は当然(2)のやり方で考えてきた。 ーー 今回の質問のVBAなどは(2)のやり方により、コードが作成されているもので、 (Range("B2:B20").Select の部分) 書式を設定する範囲のセルの、左上隅のセルを範囲の代表として、数式を設定する のだ。 他のセルは、エクセルシートの数式の複写の考えで、各セルの数式が拡張設定され、セル番地が適当に自動で変化させられる(してくれる)。 だから、それらの仕組みを逆手に取って、式を考えるべき、ことになる。 変化させるべき場合は行や列の番号や記号の前に$を付けてはならず、固定すべきセル には、行や列の番号や記号の前に$を付けておくべきことになる。 こういうことを理解しておれば、この質問のようなことは、疑問が出ないと思うがいかがかな。 質問者は上記(1)と(2)のうちで、(1)中心の考えで来たものだから、不思議なのかなと思った。 小生が質問の疑問や意図を誤解したかな。 ーー VBAの条件付き書式FormatConditionsは、VBAでいうRange=セル範囲=複数セル(といっても近接の塊になったセルだが、とびとびの複数セルは、さらなる拡張形の問題)に対して設定する(できる)ものです。 VBAではメソッドやプロパティはRangeに対して、設定できるものが多く、この点を 、十分留意すべきなんだ。 エクセル初心者は、シートのセル枠(マス目の集まり)を見て、1セルがシートの構成単位だ、という考えを抱きやすいと思うが、VBAのシートでは、基本オブジェクトはRangeで、複数セル(ただし四角形の範囲です)を基本単位と考えたRangeの考えは、MSなどのエクセル設計者は、よく考えていて流石、と思うがどうかな。

ketae
質問者

補足

手動で(Excelのリボンから)条件付き書式を設定しても同じなのですが、条件というか判定式に =$A2-$B2<>0 と設定しており、比較しているのはA列もB列も2行目だけを記述しています。 条件付き書式の設定する範囲は20行目までも理解しています。 しかしB2セルに条件付き書式設定後オートフィルで20行目まで(B3→B20)に書式を設定した場合も、あるいは上のコードを走らせたあとでも、ほかのセルに設定された条件は =$A2-$B2<>0 となっています(B20セルを選択して条件付き書式の画面で確認)。 で、B20のセルを、入力で100とすると色がつかず、100ではない数字を入れると赤く色がつきます。 なぜ式は =$A2-$B2<>0 なのに、ほかの行(20行目など)で効果が出るのかが、わからないのです。 逆にいえば、20行目に =$A20-$B20<>0 が自動的に挿入されているのなら、理解できる、という意味です。 結局Excelが、最初の行の条件式を参照して、自動的に$がついていない行方向に適用しているという仕様なのでしょうか。

  • f272
  • ベストアンサー率46% (8020/17142)
回答No.1

Range("B2:B20").Select というようにB2:B20を選択して,その選択した範囲に .FormatConditions.Add で条件付き書式を追加していますよ。2行目で行っているだけではありません。 条件付き書式の書き方が,選択した範囲の先頭のセルを基準にした書き方になっているだけです。

ketae
質問者

補足

手動で(Excelのリボンから)条件付き書式を設定しても同じなのですが、条件というか判定式に =$A2-$B2<>0 と設定しており、比較しているのはA列もB列も2行目だけを記述しています。 条件付き書式の設定する範囲は20行目までも理解しています。 しかしB2セルに条件付き書式設定後オートフィルで20行目まで(B3→B20)に書式を設定した場合も、あるいは上のコードを走らせたあとでも、ほかのセルに設定された条件は =$A2-$B2<>0 となっています(B20セルを選択して条件付き書式の画面で確認)。 で、B20のセルを、入力で100とすると色がつかず、100ではない数字を入れると赤く色がつきます。 なぜ式は =$A2-$B2<>0 なのに、ほかの行(20行目など)で効果が出るのかが、わからないのです。 逆にいえば、20行目に =$A20-$B20<>0 が自動的に挿入されているのなら、理解できる、という意味です。 結局Excelが、最初の行の条件式を参照して、自動的に$がついていない行方向に適用しているという仕様なのでしょうか。

関連するQ&A

  • ExcelVBA異なる適用先範囲の条件付き書式取得

    お世話になります。ExcelVBA(Excel2007)にて質問となります。 A1:E1セルにに「1」、「2」、「-」、「4」、「5」と入っており、 条件付き書式で以下の条件が登録されている場合、 FormatConditionsコレクションのFormula1で目的の数式を取得出来ません。 条件1:数式「=A1=1」の適用先「=$A$1」 条件2:数式「=A1="-"」の適用先「=$A$1:$E$1」 イミディウィンドウで実行した結果、次のようになります。 ~~~~~~~~~~~~~~~~~~~~~~~~ debug.print range("A1").FormatConditions.Count 2 debug.print range("A1").FormatConditions(1).Formula1 =A1="-" debug.print range("A1").FormatConditions(2).Formula1 =A1="-" ~~~~~~~~~~~~~~~~~~~~~~~~ セルA1を照査対象とした場合、count数は2と得られるのですが、 FormatConditions(1).Formula1で「=A1="-"」が取得されます。 「=A1=1」を取得する方法はどうすればいいでしょうか? 条件2の適用先を「=$A$1」とした場合は意図した値を取得できました。 ~~~~~~~~~~~~~~~~~~~~~~~~ debug.print range("A1").FormatConditions.Count 2 debug.print range("A1").FormatConditions(1).Formula1 =A1=1 debug.print range("A1").FormatConditions(2).Formula1 =A1="-" ~~~~~~~~~~~~~~~~~~~~~~~~

  • 単一セルではなく範囲に対して条件付き書式を設定するとき

    条件付き書式について質問です。 A7:M15の範囲を「色範囲」と名前定義しているとして、 その範囲の中で「あ」から始まる文字列の場合、 フォントの色を赤色に設定したいのですが、 1つ1つのセルに対して条件付き書式を設定していくのであれば当然出来きるのはわかります。 Workbooks(book1).Sheets(sheet1).Cells("A7").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF(A7,""あ*"")" .FormatConditions(1).interior.colorIndex = 6 Workbooks(book1).Sheets(sheet1).Cells("A8").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF(A8,""あ*"")" .FormatConditions(1).interior.colorIndex = 6 ・・・ ・・・ ・・・ しかし、 範囲全てに対して下記の設定をしてVBAを起動 Workbooks(book1).Sheets(sheet1).Cells(色範囲).FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF(A7,""あ*"")" .FormatConditions(1).interior.colorIndex = 6 エクセル側でA8のセルの条件付き書式をみると、 =COUNTIF(A8,"あ*") と自動で行(列)が変わっているのかわかりません。 要は名前定義をした範囲選択、行番号選択、列番号選択どの場合でも、 左上に表示されたセル座標をCOUNTIFの文字列の引数に設定すればいいのでしょうか。 よろしくお願いいたします。

  • 条件付書式をVBAでセルに設定するときのルール

    図のような列があります。 C列にこだわっているわけではないのですが、その左側にある列で計算をしているという意味で、A、B列はあけただけです。 で、IF文で計算してある条件に合致するとC列で「TRUE」を表示し、合致していない場合はそのときの計算結果を表示させています(IF文的に正しくないので、計算したままの値が計算結果として表示される)。 この結果の見せ方として、これまではC列に「条件付書式」を手動で設定し、文字がTRUEのとき字を青くする表示にしていたのですが、同様の処理を行うExcel Bookファイルが多いため、VBAで条件書式を設定しようとし、次のような記述を実行しました。 すると、図のような結果になりました。 ---------------------------------------------- Sub TestSample() Dim i As Long i = 20 '実際には最終行はBookによって異なるので、 ’行末検索させせていますが、とりあえずここでは20としておきます。 With ActiveSheet Range(Cells(2, 3), Cells(i, 3)).Select With Selection     FormatConditions.Add Type:=xlTextString, String:="TRUE", _     TextOperator:=xlContains     .FormatConditions(1).Font.Color = RGB(0, 50, 255) ’ーーA     .FormatConditions(1).Interior.TintAndShade = 0   ’ーーB End With End With End Sub ---------------------------------------------- 質問が2つあります。 1. 背景がいわゆる「色なし」ではなく白くなっていますが、背景「色なし」かつ「罫線でかこむ」には、どのような記述をすればよいでしょうか 2. FormatConditions.Add Type:~~~~ につづく別の行(Aのところ)に「FormatConditions.」と記述すると実行できません。 マクロで条件書式の自動記録をやって参考にしたところ、添値のような(1)が記録されることに気が付き、それを真似して FormatConditions(1). としたところ、動作しました。 最初だけFormatConditionsで、なぜAのところはFormatConditions(1).となるのか、またAとBはどちらも「FormatConditions(1).」でダブっているのに処理上エラーを返さないのか、理屈がわかりません。 (1)がつく意味と、AとBはどちらも(1)で(ダブっても)動作するのか(逆にいえば、なぜ最初のFormatConditionsだけ、番号がついていないのか、たぶんデフォルトで(0)の意味?) について、このへんの仕組みの解説をよろしくお願いします。

  • スプレッドシートの条件付き書式で2条件を適用したい

    Googleスプレッドシートの条件付き書式を利用して、添付画像のように、 1. B列の値が0ならば、A列のセルをピンク色にする。 2. C列の値が0ならば、A列の文字を太字にする。 というふうにしたいと考えています。 しかし、現時点で私は「1」しか実現できていません。 というのも、条件付き書式で 範囲に適用→A1:A3 書式ルール→カスタム書式「=B1=0」 書式設定のスタイル→セルをピンク色に とすればまずセルをピンクにはできますが、「+条件を追加」ボタンから 範囲に適用→A1:A3 書式ルール→カスタム書式「=C1=0」 書式設定のスタイル→文字を太字に を設定しても、こっちは無視されるのです。どうすればよいでしょうか。

  • Excelの条件付き書式を行に適用するには

    Excelで条件付き書式ってありますよね。 あの機能を使って セルの値が○○に等しいとき セルの色を設定することはできますが,その行すべてを色を変えるというのはできませんか? 例えばA1セルの値が1なら 1行は赤色。A7セルの値も1なら7行も赤色。 A3セルの値が5なら 3行は青色。 A9セルの値も5なら 9行も青色。 というようにしたいのですが・・・ また, もう一つ質問ですが この条件付き書式は 条件が3つまでしかできませんよね。 例えば 上の条件に付け加えて さらに A10セルの値が4なら 10行は黄色と設定したとすると それ以上できないですよね つまりA11行セルの値が9なら 11行は 緑色としたい場合は どうすればいいでしょうか?

  • excelの条件つき書式で

    こんにちは!excel97使用です。 条件つき書式のことなんですが、例えば、   A  B 1 200 100 2 150 160 3  50 100 というデータで、B列のセルの値がA列の同じ行のセルの値より少ないとき、Bの文字色を変えたい、という場合、設定はどうすればいいのでしょうか? 例の場合、1行目のB列100だけ色が変わればいいんですが、1行目のBのセルの設定を2行目以下にコピペすると、全部が1行目のAの値に対して反応してしまいますよね?(わたしだけ???) 1個1個設定すればできるんですが、メンドウなので^^;、一気に条件付けする方法を知りたいです。 宜しくお願いします。

  • マクロ 列ごとの条件付き書式

    マクロで列ごとの条件付き書式を作成したいです 条件としては ・列ごとに上限値が1行目に下限値が2行目に入力されている ・3行目以降に測定値が入力される ・その3行目位以降の測定値のセルの書式を上下限値から外れた値は色を変えたい ・50列ほどデータがある (例) A1 10 A2 5 A3~A100 数字 条件をA3~A100に設定 A1(10)より大きいもの、A2(5)より小さいものはセルの色を黄色 B1 15 B2 7  B3~B100 数字 条件をB3~B100に設定 B1(15)より大きいもの、B2(7)より小さいものはセルの色を黄色 こんな感じで列ごとにデータと規格値が入っているものが50列あります。 どうかよろしくお願い致します。

  • Excelの条件付き書式の書式の適用先について

    Excelの「条件付き書式」についての質問です。 「条件付き書式」⇒「新しいルール」⇒「数式を利用して,書式設定するセルを決定」 数式の中に「B$2 = 1」 と入力して 適用先に「$B$2:$H$5」と入力しました。 その時に,2行目で「1」がある列の書式が5行目まで変わりました。 また 数式の中に「$B2 = 1」 と入力して 適用先に「$B$2:$H$5」と入力しました。 その時に,2行目で「1」がある列の書式が5行目まで変わりました。 その時,B列で「1」がある行のがH列まで変わりました。 条件付き書式の行全体・列全体が変わる理由はなぜでしょうか?

  • 条件付き書式について

    セルA1の値が1の時、セルA2のセルの色を赤で塗りつぶすみたいなことを 条件付き書式でできますか? 条件付き書式でなくても良いのですが、VBA以外で 自分以外のセルの値に応じて、塗りつぶす色を変えたいです。

  • 複数の条件付書式

    B列に1~5までに数字がランダムにはいっています。 条件は ・B列が空白ならA列は無色 ・B列が1ならA列は赤 ・B列が2ならA列は青 ・B列が3ならA列は黄色 ・B列が4ならA列は緑 というのをマクロで行ないたいです。 自分で記録して Sub Macro32() Columns("A:A").Select Selection.FormatConditions.Delete Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=B1=""""" Selection.FormatConditions(1).Interior.Pattern = xlNone Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=B1=1" Selection.FormatConditions(2).Interior.ColorIndex = 38 Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=B1=2" Selection.FormatConditions(3).Interior.ColorIndex = 40 End Sub 4つ目に Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=B1=3" Selection.FormatConditions(4).Interior.ColorIndex = 32 とするとエラーになります。 3つ以上の条件付書式の書き方を教えてください。 あとこの構文のSelectionはwithで省略できますか? よろしくお願いします。