半角チルダ

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

■xl2007:SetFirstPriorityメソッド

2010-06-01 22:00:00 | 雑記
微妙に昨日の続きみたいなものだったりします...

2007での条件付き書式範囲のコピーには、バグが潜んでるみたい。
『コピーして Excel 2007 で [セルを貼り付けると、条件付き書式ルールが重複してください。』
http://support.microsoft.com/kb/973823/ja
これはパッチが当たって直ったようですが。

昨日の例のように、各条件が独立して関連がない時はともかくとして、条件別に優先順位が絡むとちょっとマズいかも、という話です。
昨日と似たような例示で、
Sub Macro1()
  With Sheets.Add
    'A1:C1に条件1
    With .Range("A1:C1").FormatConditions
      .Delete
      With .Add(Type:=xlExpression, Formula1:="=RC>2")
        .Interior.ColorIndex = 35
      End With
    End With
    'B1:C1に条件2
    With .Range("B1:C1").FormatConditions
      With .Add(Type:=xlExpression, Formula1:="=RC>1")
        .Interior.ColorIndex = 36
      End With
    End With
    'C1に条件3
    With .Range("C1")
      With .FormatConditions
        With .Add(Type:=xlExpression, Formula1:="=RC>0")
          .Interior.ColorIndex = 37
        End With
      End With
      .Value = 3
    End With
  End With
End Sub

Macro1 実行後。




こんな感じで、やはり[適用先]のセル範囲が条件ごとに違う場合で、条件1→条件3の優先順位で設定されているとします。
この時、

Sub test()
  Range("C1").Copy Range("C2")
End Sub

などとしてしまうと、




優先順位がひっくり返ってしまいます。
なぜかFillDown、FillRightメソッドだと大丈夫なんですが。


昨日の例で、シートまるごとコピーする場合でも同様です。
単純なFormula1取得が目的だったら昨日のコードでもいいんですけど、優先順位も考慮したいなら、SetFirstPriorityメソッドを使って設定し直したほうが良いかもしれません。

もっとも、あまり深く検証したわけではないので、[適用先]範囲が条件ごとに違う場合の全てのケースで発生するかどうかは不明です。

Sub test1改2()
  Dim r  As Range
  Dim i  As Long
  Dim ret As String

  ActiveSheet.Copy
  With ActiveWorkbook
    .Activate
    Set r = ActiveSheet.Range("C1")
    With r.FormatConditions
      For i = 2 To .Count
        .Item(i).SetFirstPriority '■
      Next
      For i = 1 To .Count
        .Item(i).ModifyAppliesToRange r
      Next
      ret = fcTest(r)
    End With
    '.Close False
  End With
  Set r = Nothing
  MsgBox ret
End Sub
'---------------------------------------------------------------------
Function fcTest(ByRef r As Range) As String
  Dim n As Long
  Dim i As Long

  With r.FormatConditions
    n = .Count
    ReDim ret(1 To n) As String
    For i = 1 To n
      ret(i) = .Item(i).Formula1
    Next
  End With
  fcTest = Join(ret, vbLf)
  Erase ret
End Function

test1改2 実行後。






#2010.08.16 追記)
#>もっとも、あまり深く検証したわけではないので、...
#なんてヨボー線はってやがる。
#懺悔編あり:D
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする