半角チルダ

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

■xl2007:ModifyAppliesToRangeメソッドには要注意

2010-08-17 12:00:00 | 気をつけたほうがいいこと
...というか私が抜けてるだけ?懺悔シリーズ2。

■xl2007:ModifyAppliesToRangeメソッド
re2:xl2007:ModifyAppliesToRange でTypeが変わる
ここで暢気にFor Each NextステートメントでModifyAppliesToRangeやっちゃってますが、これ大変危険です。
適用先AppliesToプロパティが同一範囲のFormatConditionに対してModifyAppliesToRangeメソッドを続けて実行すると、Excel2007が落ちます。

最小限の再現コードはこれ。
Sub test() '私の環境では確実に2007が落ちます。安易に実行しない事。
  Dim f As FormatCondition

  On Error Resume Next
  With Range("A1")
    .FormatConditions.Add( _
             Type:=xlExpression, Formula1:="=RC>2" _
             ).Interior.ColorIndex = 35
    .FormatConditions.Add( _
             Type:=xlExpression, Formula1:="=RC>1" _
             ).Interior.ColorIndex = 36
    For Each f In .FormatConditions
      f.ModifyAppliesToRange Range("B1")
    Next
  End With
End Sub

普通、こんな事はしませんが、For EachでDeleteしてみます。
Sub test2()
  Dim f As FormatCondition

  With Range("A1")
    .FormatConditions.Add( _
             Type:=xlExpression, Formula1:="=RC>2" _
             ).Interior.ColorIndex = 35
    .FormatConditions.Add( _
             Type:=xlExpression, Formula1:="=RC>1" _
             ).Interior.ColorIndex = 36
    For Each f In .FormatConditions
      f.Delete
    Next
  End With
End Sub
『9:インデックスが有効範囲にありません。』エラーです。
考えてみりゃ、前から削除とかMoveとかしちゃダメよねorz

...
......ん?前に詰まるの?
Sub test3()
  Dim f As FormatCondition

  Range("A1").FormatConditions.Add( _
        Type:=xlExpression, Formula1:="=RC>2" _
        ).Interior.ColorIndex = 35
  Range("A1:A2").FormatConditions.Add( _
          Type:=xlExpression, Formula1:="=RC>1" _
          ).Interior.ColorIndex = 36
  For Each f In Range("A1").FormatConditions
    f.ModifyAppliesToRange Range("B1")
  Next
End Sub
これは落ちないんだけどなぁ。

今いち不可解ですが...まっとうに生きたいなら
Sub test4()
  Dim i As Long

  With Range("A1").FormatConditions
          .Add(Type:=xlExpression, Formula1:="=RC>2" _
           ).Interior.ColorIndex = 35
          .Add(Type:=xlExpression, Formula1:="=RC>1" _
           ).Interior.ColorIndex = 36
    For i = .Count To 1 Step -1
      .Item(i).ModifyAppliesToRange Range("B1")
    Next
  End With
End Sub
これ?

...それにしたって、落ちなくてもいいじゃない...ねェ...orz

環境:[Windows]XP pro 5.1.2600 SP3 [EXCEL]2007 12.0.6535.5002 SP2

Comments (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■xl2007:SetFirstPriorityメ... | TOP | ■xl2007:条件付き書式の色設... »
最新の画像もっと見る

2 Comments

コメント日が  古い順  |   新しい順
.FormatCOndition.Countの値 (WinArrow)
2010-08-20 10:34:34
プロシジャ test は、私の環境でも落ちます。

話題は違いますが、

条件付き書式を設定してあるセルと、設定してないセルを一緒に選択して、COuntを取得した場合、

Excel2000では、「-1」が返ります。
例えば
A2:3こ
B3:2個
で、A1:C3を対象にCountを取得すると
「5」が返ります。





re:.FormatCOndition.Countの値 (end-u)
2010-08-20 12:18:05
WinArrowさん、こんにちは。
そんな「落ちる」ようなtestまでお試し頂き、恐縮です。
他、情報も有難うございます。
どうやら「落ちる」のは2010でも直ってないようです。
でも複合[適用先]セルのコピー時の順位逆転問題は解消してます。
そのうち、2007用パッチが提供されるかもしれませんね。

post a comment

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

Recent Entries | 気をつけたほうがいいこと