2015年11月5日木曜日

【VBA for Excel】分割された条件付き書式の統合

Excelおいて条件付き書式を設定し、設定されたセルをコピー&貼り付けを行った場合に、
条件付き書式が分割されてしまうという既知の問題に対して、
未然に防ぐ方法はいくつかあるものの、
分割されてしまった場合に同条件だった場合に統合する方法が見つからなかった。
これらを事後においても統合できるようにするため、
VBAにて統合処理のアドインを作成した。

 アドイン

アドインより追加すると「アドイン」というタブが追加され、「メニュー コマンド」というグループ内に
「条件付き書式の統合」というボタンが追加される。
これをクリックすることで条件書式の統合が行われる。

同条件同書式に関しては全て統合してしまうため、
あえてグループ毎に分けている場合なども統合されてしまうので注意。

※本アドインの使用により発生した損害については、一切関知致しません。
  使用は個人責任でお願い致します。



一番面倒かと思われた数式の一致判定に関しては、
セル値と思われる箇所を正規表現で取得し、
それらをした文字列が同様かどうかを比較。
その後絶対参照か絶対参照を判定し、絶対参照であれば一致するかどうか、
相対参照であれば適用範囲の先頭セルとの相対位置が一致するかどうかで、
同数式かどうかを判定で思いの外簡単に対応できた。

あとは全条件、全書式網羅を粛々と対応するだけの作業。

主にはFormatConditionクラスのオブジェクトに対応すればよいものの、
各条件によって、使用しているクラスが異なるかつ、インタフェース実装でもないため、
リフレクションによってアクセスしなければいけないのがExcel側の設計としてどうかと思われる。
リフレクションしたうえで実装されていないメソッド、プロパティがあった場合は、
実行時エラー不可避というのも改善して欲しい。
※何か回避策を知っている人がいたら教えてください。
  CallByName関数でアクセスしているのですが、
  IsImplimented関数(仮)などでサポートしているかどうかの事前チェックがしたい。

また、罫線に関しては、上下左右の4か所しか設定できないはずが、
Bordersオブジェクトが6つのBorderオブジェクトを持っているケースがあり、(CellValuesなど)
5つ目、6つ目を参照すると、
LineStyleプロパティをサポートしていないという問題が発生してしまう。
暫定として4つで判定しているが、(単一セルの書式設定なので問題ないはず?)
もし必要になる場合があるならば不具合となってしまう。

現状、テストした環境では問題なく動作しているため、
必要に応じて改良を加えていく。

0 件のコメント:

コメントを投稿