[[20080702212712]] 『条件付書式の書式のみ一括変更』(ファイ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『条件付書式の書式のみ一括変更』(ファイ)

 いつも勉強させていただいております。

 さまざまに設定されている条件付書式の、書式だけを1種類に変更したいと考えています。
設定されている条件の数式は一切変更しないで書式(セルの網掛け)だけを
すりかえられたら・・・と思ったのですがどうにもできなかったので、
条件1,2,3の数式を変数に格納して条件付書式をいったん削除、
その上で改めて書式を変えたものを設定しなおすというマクロを設定してみました。
(といっても貴重な過去ログ↓をほんの少し変えただけですが・・)
http://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi?mycmd=read&mypage=[[20040923111802]]

 ですが、このマクロを走らせたところなぜか条件の優先が
入れ替わって設定されてしまうのです。
(条件1,2が条件2→1 条件1→2で設定される)
何かつまらない見落としをしているのだろうと思いますが
ご指摘いただけないでしょうか。

 Sub 条件付き書式の書式変更()
'*****************************
'変数の宣言
Dim C As Range
Dim i As Long
Dim MyFormat() As String
'画面更新の停止
Application.ScreenUpdating = False
'********************************
'あらかじめ選択された範囲に対してループのはじまり
For Each C In Selection
'相対参照ずれ防止
C.Select
    With C.FormatConditions
        '条件付き書式があったら
        If .Count > 0 Then
        '動的配列 MyFormat にメモリ領域の再割り当てを行う
        ReDim MyFormat(1 To 3)
            For i = 1 To .Count
                With .Item(i)
                   MyFormat(i) = .Formula1
                End With

            '****************************************

            Selection.FormatConditions(i).Delete
            Selection.FormatConditions.Add Type:=xlExpression, Formula1:=MyFormat(i)
            Selection.FormatConditions(i).Interior.Pattern = xlGray16

            '****************************************

            Next
        End If
    End With
Next
'画面更新の解除
Application.ScreenUpdating = True
'配列の初期化
Erase MyFormat
End Sub

 ※条件付書式は全て「数式で」のみです。
※セルの選択で条件付書式のあるセルのみを選択して実行します。

 条件付書式を削除するタイミングで、優先順位が入れ替わってしまうせいかな・・と
考えているのですがどう変えれば順序良く設定されるのかわかりません。
どうかご教授よろしくお願いします。

 Excel2003 WindowsXP

 1番から順番にDeleteしてからAddしているため、へんな動きになっていると思います。
すべて削除してから順番にAddしていけばよいのではないのでしょうか。
また、セルのSelectは不要です。
以上を踏まえますと、以下のようになると思います。
(ROUGE)
'----
Sub 条件付き書式の書式変更()
'*****************************
'変数の宣言
Dim C As Range
Dim i As Long
Dim MyFormat() As String
'セルが選択されていなかったらマクロを終了する。
If TypeName(Selection) <> "Range" Then Exit Sub
'********************************
'あらかじめ選択された範囲に対してループのはじまり
For Each C In Selection
    With C.FormatConditions
        '条件付き書式があったら
        If .Count > 0 Then
            '動的配列 MyFormat にメモリ領域の再割り当てを行う
            ReDim MyFormat(1 To .Count)
            For i = 1 To .Count
                MyFormat(i) = .Item(i).Formula1
            Next
            .Delete
            For i = 1 To UBound(MyFormat)
                .Add xlExpression, , MyFormat(i)
                .Item(i).Interior.Pattern = xlGray16
            Next
        End If
    End With
Next
'配列の初期化
Erase MyFormat
End Sub


 ROUGEさん、美しい修正をありがとうございます。
 優先順どおりの条件付書式の再設定をする事ができました。

 全てを削除してから再設定するということは考えたのですが
 エラーが出たり条件1しか再設定されなかったりでうまくできなかったのです。
 2回目のFor〜Nextがきちんと書けなかったのだと思います。

 やはり理解が足りていない状態のまま
 切り貼りでマクロを組み立てるとうまくいかないですね・・・。
 勉強します、ありがとうございました!
 (ファイ)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.