微妙に昨日の続きみたいなものだったりします...
2007での条件付き書式範囲のコピーには、バグが潜んでるみたい。
『コピーして Excel 2007 で [セルを貼り付けると、条件付き書式ルールが重複してください。』
http://support.microsoft.com/kb/973823/ja
これはパッチが当たって直ったようですが。
昨日の例のように、各条件が独立して関連がない時はともかくとして、条件別に優先順位が絡むとちょっとマズいかも、という話です。
昨日と似たような例示で、
Macro1 実行後。
こんな感じで、やはり[適用先]のセル範囲が条件ごとに違う場合で、条件1→条件3の優先順位で設定されているとします。
この時、
Sub test()
Range("C1").Copy Range("C2")
End Sub
などとしてしまうと、
優先順位がひっくり返ってしまいます。
なぜかFillDown、FillRightメソッドだと大丈夫なんですが。
昨日の例で、シートまるごとコピーする場合でも同様です。
単純なFormula1取得が目的だったら昨日のコードでもいいんですけど、優先順位も考慮したいなら、SetFirstPriorityメソッドを使って設定し直したほうが良いかもしれません。
もっとも、あまり深く検証したわけではないので、[適用先]範囲が条件ごとに違う場合の全てのケースで発生するかどうかは不明です。
test1改2 実行後。
#2010.08.16 追記)
#>もっとも、あまり深く検証したわけではないので、...
#なんてヨボー線はってやがる。
#懺悔編あり:D
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