半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■条件付書式。数式はR1C1形式で。(検証編)

2009-12-01 22:00:00 | 雑記
昨日の記事が少しぶっきらぼうだったので、補足。
それにmoug.netのログが消えたら意味がわからないでしょうし。

結論から簡単に書くと、
『VBAで条件付書式を設定する時、その条件がセルアドレスを参照する数式条件の場合は、コード実行時のActiveCellの位置によって数式条件のセルアドレスが相対的に変化してしまう。
∴条件付書式を設定する範囲の基点セルをSelectして実行するか、数式をR1C1形式で記述する。
(R1C1形式で設定する場合はSelect不要)』
という事です。

まずテストコード全掲載。
Option Explicit
Const KITEN = "B2" 'テスト範囲基点のアドレス
'---------------------------------------------------------------------
Sub pre()
  Dim r As Range
  Dim f As Boolean

  f = True
  With Sheets(1)
    For Each r In .Range(KITEN).Resize(5, 5)
      If f Then r.Value = 1
      f = Not f
    Next
  End With
End Sub
'---------------------------------------------------------------------
Sub test1()
  Dim r As Range

  With Sheets(1)
    Set r = .Range(KITEN)
    r.Offset(1).Select
    With r.Resize(5, 5).FormatConditions
      .Delete
      .Add(Type:=xlExpression, Formula1:="=" & KITEN & "=1" _
        ).Interior.ColorIndex = 6
    End With
  End With
  Debug.Print "test1_1", r.FormatConditions(1).Formula1
  r.Select
  Debug.Print "test1_2", r.FormatConditions(1).Formula1

  Set r = Nothing
End Sub
'---------------------------------------------------------------------
Sub test2()
  Dim r As Range

  With Sheets(1)
    Set r = .Range(KITEN)
    r.Offset(1).Select
    With r.Resize(5, 5).FormatConditions
      .Delete
      .Add(Type:=xlExpression, Formula1:="=RC=1" _
        ).Interior.ColorIndex = 6
    End With
  End With
  Debug.Print "test2_1", r.FormatConditions(1).Formula1
  r.Select
  Debug.Print "test2_2", r.FormatConditions(1).Formula1

  Set r = Nothing
End Sub
'---------------------------------------------------------------------
Sub test3()
  Dim r  As Range
  Dim ref As Long

  With Application
    ref = .ReferenceStyle
    .ReferenceStyle = xlR1C1
  End With
  With Sheets(1)
    Set r = .Range(KITEN)
    r.Offset(1).Select
    With r.Resize(5, 5).FormatConditions
      .Delete
      .Add(Type:=xlExpression, Formula1:="=RC=1" _
        ).Interior.ColorIndex = 6
    End With
  End With
  Debug.Print "test3_1", r.FormatConditions(1).Formula1
  r.Select
  Debug.Print "test3_2", r.FormatConditions(1).Formula1
  Application.ReferenceStyle = ref

  Set r = Nothing
End Sub

Sub pre()実行後。


基点セルから5x5の範囲に条件付書式を設定します。
Sub test1()実行後。


本当は『=自アドレス=1』の数式条件を満たすセルに色づけしたいのですが、
r.Offset(1).Select
しているために、基点セルB2の数式条件がずれてしまいます。


(Offsetせず、基点rをSelectすればずれません)

Selectしたくない、もしくはSheetをActiveにしたくない場合、数式をR1C1形式にします。
Sub test2()実行後。


ActiveCellの位置関係なく、数式条件が正しく設定されます。


ついでに。
条件付書式で設定された条件内の数式を取得したい場合もActiveCellとの相対位置によって数式が変化します。
これは数式をR1C1形式で記述したtest2でも同様です。
Debug.Print "test2_1", r.FormatConditions(1).Formula1
r.Select
Debug.Print "test2_2", r.FormatConditions(1).Formula1
この部分。結果は
test2_1    =B3=1
test2_2    =B2=1
同じ r の条件が変化しています。
これを、ActiveCell位置に関係なく取得したい場合は、Applicationのアドレス参照形式をR1C1形式に変更します。
Sub test3()での
With Application
  ref = .ReferenceStyle
  .ReferenceStyle = xlR1C1
End With
この部分。(後で戻しています)

test1からtest3まで実行したイミディエイトウィンドウの結果は
【2003の場合】
test1_1    =B2=1
test1_2    =B1=1
test2_1    =B3=1
test2_2    =B2=1
test3_1    =RC=1
test3_2    =RC=1
こうなります。

ちなみに、
【2007の場合】
test1_1    =B1=1
test1_2    =B1=1
test2_1    =B2=1
test2_2    =B2=1
test3_1    =B2=1
test3_2    =B2=1
2007では条件取得時のアドレスの変化については改善されているようです。

こういった事象に対する質疑って、Q&A掲示板ではあまり見かけませんが、VBAで条件付書式を設定する時のセオリーのようですね。
『Excelノート 6-1 書式 14 マクロで条件付書式(数式)を設定するには?』
http://park11.wakwak.com/~miko/Excel_Note/06-01_shoshiki.htm#06-01-14

さらに深い過去ログ
『条件付書式の数式の評価について』
http://www.keep-on.com/excelyou/1999lng4/199909/99090110.txt
『条件付書式による色をVBAから取得するには?』
http://www.keep-on.com/excelyou/2000lng4/200005/00050350.txt

#こういった情報があると、やっぱり過去ログって先人の経験と知恵が詰まったおタカラだよなぁって思います。
#それを探り当てる検索エンジンも凄いっ...てのも言えるかもしれませんけどね :D

Comment    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■条件付書式。数式はR1C1形式... | TOP | ■Filter状態での可視セルから... »
最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。

Recent Entries | 雑記