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