Excel VBA 条件付書式の条件満たすセル取得

このQ&Aのポイント
  • Excel2010のVBAで条件付書式の条件を満たすセルの番地を取得する方法について教えてください。
  • Excel2010のあるシートのあるセル範囲に条件付き書式が付けてあり、この条件を満たすセルに指定した書式が付けられています。VBAでこの条件を満たしたセルの番地を取得する方法を教えてください。
  • Excel2010のVBAで条件付書式を使用していて、条件を満たすセルの番地をVBAで取得したいです。どのように記述すれば良いでしょうか。
回答を見る
  • ベストアンサー

Excel VBA 条件付書式の条件満たすセル取得

Excel2010のVBAで条件付書式の条件を満たすセルの番地を取得したい 具体的には、 Excel2010のあるシートのあるセル範囲(例えばA1~XFD1048576)に 条件付き書式が付けてあって、 (例えば、数式の条件が満たされたら背景色を赤色にするなど) この条件を満たすセルに指定した書式が付けられて表示されています。 この状態で、VBAで、この条件を満たしたセルの番地を、 順番に取得したいのですが、どのように記述すればよいでしょうか。 【追記】 数式をすべてのセルに入れて検出する方法や セルをひとつずつ数式に当てはめてみていく方法は、 セルが膨大なため容量的・時間的にNGです。 このため、条件付き書式で回避しています。 条件付き書式の判定結果である書式(この場合でしたら背景色が赤色) で判断する必要があります。(書式は背景色が赤色でなくてもいいです) よく分かりませんが、検索の中の書式で指定しても、 この条件付き書式の判定結果の書式はヒットしませんでした。

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

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

No.2補足欄、拝見しました。 > この目的は、元々は、2つのシートの内容が、 > 完全に一致することを確認したかったのですが、 完全に【一致】するか[y/n] だけを調べるなら、 【相違】がひとつもないか[y/n] を調べる方が簡単ですよね? 【相違】ではなく【一致】を採る理由が、 ご説明からは読み取れないです。 さておき、 > 条件付書式では、すぐに結果が出たので、 > この結果を利用して、一致しないセルが > あるかどうかとその場所を取得できれば、 > 2つのシートの内容が完全に一致することを > 確認できるのではないかと考えたわけです。 お気持ちは理解できます。 なるほど、条件付き書式であれば、 即時に、結果を表示された書式に反映させることは出来ますが、 そもそも条件付き書式は、 閲覧時の表示用、或いはプリント用に用意された修飾に特化した機能ですから、 条件に合致したセル範囲を返すような属性は 残念ながら用意されていませんので、 これを分析に用いるというのは本来の目的に適うものではありません。 No.2で紹介した、range.DisplayFormat プロパティは、 ユーザーの要望に応える形でxl2010で追加された新しい機能ですが、 条件付き書式の結果としての表示された書式[以下、"表示書式"] を利用するということだと(方法は幾つかありますが) 例えばDisplayFormatより簡単なもの、は、ありません。 表示書式を見れば、せっかく結果が表示されているのだから、 これを使いたい、ということがお望みなのでしょうけれど、 フラグやマークアップとして使える情報は保持してませんので、 速さで言うならば、結論として、 表示書式とは無縁に、愚直にVBAで値を比較した方が速いです。 手元で走り書きのマクロで試してみましたが、、  データ(数値):二千五百万セル、  表示書式としての塗りつぶし:八百万セル、  という条件で、 DisplayFormatを調べた場合は、10分ほど(戻り値は単一セル範囲多数)  データ(数値):二千五百万セル、  というシートを二つ  一致するセル:三百万セル、  という条件で、 二つのシートの値を比較した場合は、1分ほど(結果はセル座標多数) の所要時間でした。 セルの数に比してこの結果を膨大な時間と呼ぶかどうかは、 主観の問題ですが、私の感覚としてはこれ以上をExcelに求めるのは酷かな、と。 > セル数が膨大 もう少し具体的であれば、その概数によって、 どんな計算方法が速いのか、というお話なら出来るとは思います。 とは言え、【一致】を調べて本当は何をしたいのか、 全体を理解出来ないと提示できる情報は少ないです。 手法としては、 想定されるセル数が比較的少ない順に(概ね数万セルから数千万セル程度のスケール) ●Evaluate メソッドを介してExcel側に計算させる   (使用メモリが多く喰うけど、比較的高速)(結果は座標) ●第三のシートに比較する数式を展開する   (一致する範囲を選択するのが目的なら、最適) ●一旦HTMLテーブルとして読み込んで、正規表現やDOMで処理する   (一致したセルを編集するのに向いている)(結果はセルの書換え) ●配列変数に格納した値を比較する   (使えるメモリは有限だけど、比較的高速)(結果は座標) ●一旦、テキストファイルに書きだして(端からテキストにする)テキストを比較する   (ハードディスクを使うのでメモリ消費を抑えられる) ●ADODBで読み比べる。 など方法はいくつか考えられます。 > Excel2010のあるシートのあるセル範囲(例えばA1~XFD1048576)に 百億超のセルを扱うのは、Excelには(ブックとして扱うのは)まず無理ですから、 > セル数が膨大 ある程度想定される最大セル数を決めておいて、 それに合った手法を選んでいくことになると思います。 後は全体の処理や具体的な仕様にどう合わせていくかだと思いますし、 簡単さと処理速度のコストバランスをどう考えるかでしょうか。 要約すると、 条件付き書式は表示用、プリント用。 結果をフラグとして分析に使うことは難しい。 直接、値の方を比べる事になるでしょう。 題意への理解が未だ不十分なのかも知れませんが、 この程度で御容赦ください。 それではまたいつか。

yam2012
質問者

お礼

>そもそも条件付き書式は、 >閲覧時の表示用、或いはプリント用に用意された修飾に特化した機能ですから、 >条件に合致したセル範囲を返すような属性は >残念ながら用意されていませんので、 そういうことでしたか。 特定の書式がついたセルを抽出することが できないということが分かりましたので、 値の入っているセルに限定して、 書式ではなく値で1つずつセルの内容を 確認していく方向で検討してみることにします。 いろいろ調べていただきましてありがとうございました。

その他の回答 (2)

回答No.2

こんにちは。 基本的な方法としては以下のように。 ' ' /// Sub ReW9121222a() Dim c As Range For Each c In ActiveSheet.UsedRange If c.DisplayFormat.Interior.Color = vbRed Then Debug.Print c.Address(0, 0) End If Next End Sub ' ' /// もしかして、セルの結合などしてあって、 ご自身で応用が出来ない場合は、 If c.DisplayFormat.Interior.Color = vbRed Then If c.MergeCells Then If c.MergeArea(1).Address = c.Address Then Debug.? c.MergeArea.Address(0, 0) 等の例を用いて工夫してみて下さい。 range.DisplayFormat プロパティ(オブジェクト) を使って「表示された書式」をチェックする方法以外にも、 worksheet.AutoFilter オブジェクトで 列毎に色フィルターを掛けて、表示された範囲を拾う方法 の方が(列が限定されているケースなど)効率良い場合 もあるのかも知れません。 基本的な構文はマクロの記録などでも、十分なものが得られます。 > セルが膨大なため容量的・時間的にNGです。 そう聞くと、寧ろ条件付き書式を使うことを選択肢から排除する という人、結構いると思いますし、私も俄かに同意できない面もあります。 膨大なデータを扱うからこそ、 Excelに再計算させる機会を限りなく減らし、 それによって扱い易い(使える)ブックを維持できるようにする ということを優先的にに考えてしまいます。 xl2010でしたら、 条件付き書式を適用した範囲に絡んで、 コピー、貼付け、切り取り、等の操作をする場合は、 [条件付き書式の結合]モードで貼り付けることを意識する等、 条件付き書式の増殖を避けるように十分に注意しておかないと、 ファイルサイズと再計算の量が膨大になってしまって、 「或る日開けなくなった」 というような相談に繋がることもありますので 留意してあげてください。 何か不足があれば、補足してください。

yam2012
質問者

補足

すいません。質問の仕方がまずかったです。 For Each c In ActiveSheet.UsedRangeでは、 すべてのセルをひとつずつチェックしていく ことになってしまうため膨大な時間がかかります。 このため、セルをひとつずつチェックしなくても 条件付書式の条件を満たすセルだけを短時間で 抽出することができないかを知りたかったのです。 例えば、 条件付書式の条件を満たすセルだけを 何らかの方法 (すべてのセルをひとつずつチェックしていくのではなく、  あるメソッドを実行するなどの方法で一瞬または短時間) で選択することができれば、 Dim targetCell As Range For Each targetCell In Selection.Cells  Debug.Print targetCell.Address Next などで取得することができます。 UsedRangeの範囲のセルの数は膨大ですが 条件付書式の条件を満たすセルの数はわずかなので 処理は一瞬で終わります。 この目的は、元々は、2つのシートの内容が、 完全に一致することを確認したかったのですが、 セル数が膨大なため、すべてのセルをチェック していたのでは、時間がかかりすぎていましたが、 条件付書式では、すぐに結果が出たので、 この結果を利用して、一致しないセルが あるかどうかとその場所を取得できれば、 2つのシートの内容が完全に一致することを 確認できるのではないかと考えたわけです。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 条件付書式で設定した背景色はInterior.ColorIndex等では検索出来ないので Evaluate(条件の数式)で判定していくしかないと思います。

yam2012
質問者

お礼

通常の背景色と同じように 条件付書式で設定された背景色も検索ができれば 何も悩まなかったのですが・・・・ ありがとうございました。

関連するQ&A

  • エクセルVBAで条件付書式の色を取得

    セルに条件付書式で書式設定してあります。 A1は「値」100以下 A2は「値」500以下 A3は「値」1~10の間 B1は「数式」で=B1<A1 以下さまざまな数式があります。 条件に一致すると、セルの文字が「赤」になります。 このとき、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox Target.Font.ColorIndex End Sub を実行しても、ColorIndexは、赤の「3」ではなく「-4105」と表示されます。 「-4105」は何もフォントの色を指定してないセルでも同じく表示されます。 質問1.条件付書式で、条件が一致して表示されたフォントの色は取得できないのでしょうか? 質問2.-4105とは何でしょうか?

  • エクセル 条件付書式の結果がすぐに反映されない

    仮にセルA1に、次のような条件付書式を入力します。 数式が =A2<>"" のときにセルの色を赤にする。 そしてセルA2になにか値を入力しても、セルの色がかわりません(セルA1とセルA2の境界が赤になるときもある)。 条件付書式の入力が間違っているのかと思っていたら、 ・スクロールしてセルA1とセルA2を画面上から見えなくした後、再度表示させる。 ・印刷プレビューで確認し、再度表示させる と、条件付書式が反映され、セルの色が指定どおり赤にかわっています。 WinNT Execel97 と WinNT Execel2000 両方で試してみましたが、結果は同じでした。 この現象を回避し、入力後、即条件付書式の結果が反映される方法はないのでしょうか? どなたかよろしくお願いします。

  • EXCEL2003 条件付書式が狂ってくる

    条件付書式は、見ためにどのセルに入っているのかわからないというのと、複数の条件付書式が入ると、なぜかその前に決めていた条件付書式が消えてしまっているということがあって、なかなか不便に思っています。(やりかたが悪いのかもと思うのですが) それで、VBAの entireculumn というのを見つけたのですが、 これで対応できるでしょうか? やりたい事は、 1 2*--------------------------- 3*--------------------------- 4 5 6*--------------------------- 7*--------------------------- 上記のように、「*」をつけた行にだけ、行全体に色をつけておく、 というのを条件付書式で、 「数式が」「=$A1="*"」 としたもので、その設定をしているシートに、横にずっと、いろんな関数を入れていってます。 ですが、関数を入れたり、そのプロセスで列挿入などすると、 色がずれてしまうのです。 その回避策として、VBAで最初に色の設定をしておけないでしょうか? 「*がある行だけに色をつける。」 よろしくお願いします。

  • エクセルのVBAを使った条件付き書式

    VBAの初心者です。というか使ったことがありません。 4つ以上の条件付き書式はVBAが必要になるようなので困惑中です。 下記の条件付き書式をVBA作りたいと思っています。 「1」を含む値の場合セルの背景を黄色に 「2」を含む値の場合セルの背景を緑色に 「3」を含む値の場合セルの背景を水色に 「4」を含む値の場合セルの背景を赤色に 例) 1北海道 → セルの背景を黄色 2山形 → セルの背景を緑 これを実現するVBAのコードを教えてください。 また、そのコードをどこに貼付ければいいのでしょうか? まったくの初心者で申し訳ありません。

  • EXCELで条件付書式を使いたいが

    またまた質問させていただきます。 条件付書式を使ってセルの色を変えようとしたのですが、条件が6条件有り出来ませんでした。 やりたいことは、C5~AJ54の範囲のセルに下記の文字が入ったとき、そのセルの色を変えたいのです。 入力  セル色 赤外---黄色 青外---黄色 赤中---緑色 青中---緑色 赤内---青色 青内---青色 といったことがしたいのです。 VBAを使ってセルを塗りつぶす例などを調べてやってみましたが、勉強不足で旨くいきませんでした。 どうか、宜しくお願いします。

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

    Excelの条件付書式について教えてください。 次のようなことをしたいです。 (1)10個のセルに次のような条件付書式を設定します。  ・条件1:セルの値が5以上だったらセルの塗りつぶし(パターン)を青色にする。  ・条件2:セルの値が5未満だったらセルの塗りつぶし(パターン)を赤色にする。 (2)別の1つのセルで上の10個のセルを監視して  すべてのセルが青色だったら"PASS"と表示する。  ひとつでも赤色のセルがあったら"FAIL"と表示する。 VBAを使用して、条件付書式が設定されたセルを参照し、 どちらの条件付書式が適用されているのか調べられるのなら、 それでもかまいません。 条件付書式でセルの色(パターン)を設定した場合、 セルの.Interior.ColorIndex 及び PatternColorを参照しても、 塗りつぶしはされてないという扱いになっているようです。 なにか方法があるでしょうか?

  • エクセル 条件付書式について

    エクセルの条件付書式について、お尋ねします。 A1のセルには、背景と同じ色で文字が入力されていて、そこに文字を上書きすると、A1のセルの文字の色が黒に変更されるようにしました。 その後B1のセルに文字を入力すると、A1からE1までのセルの背景がグレーになるようにしたかったのですが、A1のセルだけが、塗りつぶされませんでした。 説明が十分かどうかわからないのですが、質問としては、このようなことが、条件付書式で可能かどうか、可能ならば、その方法を教えていただけますでしょうか。 どうぞよろしくお願いいたします。

  • EXCELの条件付書式について

    I1のセルに赤色太文字で日付を入力すると、B1~H1のセルが水色に塗り潰されると言う条件付き書式を設定したところ、I1のセルに入力した日付の色が黒色になってしまいました。 I1のセルの日付を赤色太文字で表示したい場合、どの様な条件を設定(追加)すれば宜しいでしょうか? 条件付書式:数式が=AND(ISNUMBER($I1),LEFT(CELL("format",$I1),1)="D") ⇒ B1~H1のセルが水色に塗り潰される。 過去に似た様な質問がある中大変恐縮ですが、ご回答をお待ちしております。

  • エクセル 条件付書式で時刻の判定

    エクセル2000を使用しています。 VBAでボタンを押した時にFileDateTimeで複数のファイルの更新時間を取得してきて表のように一覧で表示する形になっています。 その更新時間が今日じゃなかったら、エラーなので条件付書式で今日じゃない日付のセルだけ赤くしたいのですが、条件付書式に=today()を入れてもうまくいきません。 あと日に何回か更新されるファイルの場合、時間でも判定したいのですがどんな数式にすればよいのでしょうか? 例えば、10時と14時と17時に更新される場合、12時に判定した時に10時に更新されていれば正常で、15時に判定した時に10時のままだとエラー、のような形で条件付書式で設定できると思うのですが、どうやればいいのでしょうか? ここで検索したら、条件付書式だけで千件以上ヒットして検索しても余計に分からなくなってしまいました。 ご存知の方がいたら是非教えて下さい。 よろしくお願いします。

  • EXCEL2007セルの色を数式で取得したい

    EXCEL2007セルの色を数式で取得したい EXCEL2007で条件付き書式を使って現在使って特定の値が入っているセルを 条件付き書式を使って背景を赤色を変えるというシートを作成しました。 さらに、特定のセルをダブルクリックすると書式を水色に変わるという処理 をVBAで実現したのですが、既に条件付き書式によって赤くなっているセルの 背景色を水色に変えることができません。 つまり、書式設定した背景色が条件付き書式の背景色につぶされてしまいます。 書式設定した背景色(水色)の方を優先させたいので、条件付き書式の条件に セルの書式に背景色が設定されているときには条件外とするようにしたいのですが。 どうやって、数式で書式設定した背景色を取得できますか? もしくは、他の方法で実現できるアイデアがありましたら、紹介してください。 どうぞ、よろしくお願いいたします。

専門家に質問してみよう