半角チルダ

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

■xl2007:条件付き書式の色設定だけ残す

2010-09-10 22:00:00 | VBA Tips
『条件付き書式によって表示された色だけ残し、条件付き書式を解除する』あるいは『条件付き書式よって表示された色を取得する』というお題です。

以前の記事でもリンク貼って紹介しましたが、例えば
http://www.keep-on.com/excelyou/2000lng4/200005/00050350.txt
のように、2003までは条件付き書式の条件式を評価する方法で取得が可能でした。
2007からは仕様変更とバグの為、この類の手法はかなり面倒な事になります。
詳細は■xl2007:ModifyAppliesToRangeメソッドなどの一連の過去記事に書いてます。
[適用先]のセル範囲が条件ごとに違う場合に[Formula1プロパティ]などが正しく取得できない、といった事が主な理由です。

条件付き書式の結果である色設定などを単純に取得したいだけなら、[Webページとして発行]機能が使えます。
2007ではWebページで保存したmhtファイルをExcelで開くと、セル背景色などの書式情報が保持されています。
2003以前では取れませんでした。

まずはシートを追加し、条件付き書式を設定するコード。

Option Explicit

Sub pre()
  With Sheets.Add.Range("B5:D10")
    .Formula = "=INT(RAND()*100)"
    .Value = .Value
    .FormatConditions.AddColorScale ColorScaleType:=2

    Call try(.Cells)

  End With
End Sub

Sub try(ByRef r As Range)
  Dim rg As Range
  Dim x As Long
  Dim y As Long
  Dim i As Long

  Set rg = r.Offset(, r.Columns.Count + 1).Item(1)
  For x = 1 To r.Columns.Count
    For y = 1 To r.Rows.Count
      With rg.Offset(i)
        .Value = r(y, x).Address(0, 0)
        .Offset(, 1).Value = r(y, x).Value
        .Offset(, 2).Value = r(y, x).Interior.Color
        .Offset(, 3).Interior.Color = .Offset(, 2).Value
        i = i + 1
      End With
    Next
  Next
  Set rg = Nothing
End Sub

(結果)


[PublishObjects.Addメソッド]を使って、表示された色だけ残し条件付き書式を解除するコード。

Sub test()
  Dim ws As Worksheet
  Dim tmp As String

  '既存ファイルに注意
  tmp = Application.DefaultFilePath & "¥temp.mht"
  With ThisWorkbook
    Set ws = .ActiveSheet
    .PublishObjects.Add( _
      xlSourceSheet, tmp, ws.Name, "", xlHtmlStatic _
      ).Publish True
  End With
  ws.UsedRange.FormatConditions.Delete
  With Workbooks.Open(tmp)
    .Sheets(1).UsedRange.Copy
    ws.Cells(1).PasteSpecial xlPasteFormats
    Application.CutCopyMode = False
    .Close False
  End With
  Kill tmp

  Call try(ws.Range("B5:D10"))

  Set ws = Nothing
End Sub

(結果)


※ただし、書式に「データバー」や「アイコンセット」、グラデーション色などを使用している場合はmhtファイルでも保持されませんので取得できません。

他に、Wordを経由させる手法でも書式が固定されて取得できるようです。これは2003以前も共通でいけるような気がしますね。
http://moug.net/faq/viewtopic.php?t=53734
(ログ保管期間が限られてます。リンク切れたらごめんなさい。)
機会あったらこちらを試行してもいいかも。

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■xl2007:ModifyAppliesToRan... | TOP | ■Worksheet_Scrollイベント(... »
最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。

Recent Entries | VBA Tips