- ベストアンサー
条件付き書式の計算式と適用先範囲
- VBAで条件付き書式を設定する際に、値の比較式を指定します。
- この場合、A列とB列の値が異なる場合に赤い色を付けるように設定しています。
- しかし、なぜ2行目以外のセルでも同様の効果が効いてしまうのかわからないという質問です。
- みんなの回答 (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が入力されているかのように振る舞います。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
小生は、数度質問を読んだが、意図がはっきり理解できたと思えない。 しかし推定して、下記のようなことかな? 今までのこのコーナーの条件付き書式に関した質問者(初学者が多いようだ)は、 条件付き書式を考えるとき、下記(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などのエクセル設計者は、よく考えていて流石、と思うがどうかな。
補足
手動で(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% (8467/18126)
Range("B2:B20").Select というようにB2:B20を選択して,その選択した範囲に .FormatConditions.Add で条件付き書式を追加していますよ。2行目で行っているだけではありません。 条件付き書式の書き方が,選択した範囲の先頭のセルを基準にした書き方になっているだけです。
補足
手動で(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が、最初の行の条件式を参照して、自動的に$がついていない行方向に適用しているという仕様なのでしょうか。
お礼
思い込んでいるというか、条件付き書式を手動でやっていたころから、なんでそうならないのか?という問いかけでした。 >ルールを書くときに参照するセルは必ず左上のセル 条件付き書式について、この説明をどの本でも見たことがないので疑問でした。 これでストンと胸に落ちました。