2012年6月14日木曜日

Excel スタイル設定一覧を、シートに表示するマクロ

先週に悩まされた、「表示形式を追加できません。」や、「セルの書式が多すぎるため、書式を追加できません」のエラーメッセージでは、いろいろと勉強になりましたので、ここで少しまとめておきます。


Excelのスタイルについて

Excelのスタイルとは、「表示形式」「配置」「フォント」「罫線」「パターン」「保護」等の一連の書式をひとまとめにして名前を付けたものです。 よく使う書式の組み合わせをスタイルとして登録しておくと一度に設定できるため、書式を別々に設定するよりも効率が良くなるというわけです。 実はこの機能、今まで使ったことが無く今回初めて知りました。

Excel2007では組み込みスタイルが増えて、こんなスタイルが登録されているようです。


使用できるスタイルの件数

Excel 2007 では、一意のセル書式を 64,000 使用することができますが、以前のバージョンの Excel では一意のセル書式は最大で 4,000 しか使用することができません。一意のセル書式には、ブック内で適用される特定の書式の組み合わせすべてが含まれます。

「以前のバージョンの Excel でサポートされない Office Excel 2007 の機能」より引用  http://office.microsoft.com/ja-jp/excel-help/HA010077823.aspx


ワークシートをコピーするとスタイルが増える

Excel2000やExcel2003ではセル書式は最大4,000使えるので、一般的な使い方ならばセル書式が4,000もあれば十分かもしれません。しかし、ここに落とし穴がありました。

それはExcel2007で作成されたブックを「Microsoft Office互換機能パック」で変換後、Excel2003を使って編集しようとした時に発生した「ワークシートのコピーでスタイルが増加する」という現象でした。

コピー前は1608件だったスタイル件数が、シートコピー後に3065件に増えました。 この不思議な現象はワークシートのコピーで発生しましましたが、シートからシートへのセル範囲のコピーでは発生しませんでした。 

Microsoftサポートサイトの
「Excel 2007 で、使用されていないスタイルが、あるブックから別のブックへコピーされます。」 http://support.microsoft.com/kb/2553085/ja 
が解決の糸口になるのかもしれませんが、Excel2007を持っていないのでこれは未確認です。

スタイルはブックに登録されるのでブックごとにスタイルの件数が違うようです。 Excel2007で作成されたブックでは、ワークシートのコピーでスタイルが増えるようなので、Excel2007で繰り返しワークシートをコピーして編集するような使い方をしている場合は、気づかないうちにスタイルが増えているのかもしれません。


スタイルが増えすぎるとどうなるのか

Excel2007で作成された、「スタイルが増えすぎたブック」を「Microsoft Office互換機能パック」で変換後に調べてみました。(この時のスタイル件数は3065件)

まっさらなワークシートをひとつだけ残して、他のワークシートをすべて削除した状態で書式設定をすると Excel2000では「表示形式を追加できません。」 が表示されました。 Excel2003では「セルの書式が多すぎるため、書式を追加できません」 が表示されました。

次にユーザースタイルをマクロを使って一括削除すると再び書式設定が出来るようになりました。

このことから、ワークシート内の書式数では無くて、スタイルの登録件数が多い場合に、このようなエラーが発生することがわかりました。(4,000件に満たない場合でも起こるようです。)



追記:2013年4月10日
スタイルが増えすぎて開くことができない場合は、この投稿が役立つかもしれません。

Office 互換機能パックでxlsxファイルが開けない。
Office 互換機能パックでxlsxファイルを開こうとすると「表示形式を追加できません。」や「セルの書式が多すぎるため、書式を追加できません」が表示される。


追記:2016年6月22日
Excelのスタイルに関連する他の投稿




スタイル設定をシートに出力するマクロ

大量のスタイル設定の内容を一覧表形式で確認したかったので、スタイル設定をシートに書き出すマクロを作ってみました。 一覧表に出力したスタイルを見てみると、Excelが自動的に(勝手に)追加したと思われるスタイルが大量にありました。

シートに出力したスタイル
シートに出力したスタイル

このマクロは、Excel2000とExcel2003を使って、WindowsXP SP3で動作確認しました。 マクロを実行すると、アクティブなブックに新しいシートを追加してスタイル一覧を出力します。

出力する書式設定の内容は、

  • スタイルの種類
  • セルにスタイル適用した結果を表示
  • スタイル名
  • 表示形式
  • 配置
  • 縦横位置
  • フォント名とサイズ
  • 罫線 左、右、上、下、右斜め下、右斜め上
  • パターン
  • 保護
  • 数式表示
としました。

組込スタイルとユーザースタイル別に、登録されたスタイル名順に並んでいます。

スタイルダイアログで「スタイルに設定されている書式」にチェックのない項目は適用されないため、書式の登録があっても表示していません。

スタイルの内容が確認できるように、B列のセルにスタイル設定を適用した表示をしています。


スタイル設定をシートに出力する VBAマクロ

  1. '新しいシートにスタイルを出力。
  2. Sub View_Style()
  3. Dim nCnt As Long
  4. Dim BltinCnt As Long
  5. Dim NotBltinCnt As Long
  6. Dim i As Long
  7. Dim st As String
  8. Dim stVal As Long
  9. Dim cnt As Long
  10. Dim sTitle As Variant
  11. Dim sh As Worksheet
  12. Dim bk As Workbook
  13. Dim kName As Variant
  14. Dim kXlValue As Variant
  15. Dim kStr(5) As String
  16. Dim kNum As Integer
  17. sTitle = Array("種類", "スタイル表示", "スタイル名", "表示形式", "配置 縦", "配置 横", "フォント名", _
  18. "サイズ", "罫線", "罫線", "罫線", "罫線", "罫線", "罫線", "パターン", "保護", "数式表示")
  19. kName = Array("左", "右", "上", "下", "右斜め下", "右斜め上")
  20. kXlValue = Array(xlLeft, xlRight, xlTop, xlBottom, xlDiagonalDown, xlDiagonalUp)
  21. On Error GoTo ERR_EXIT
  22. Set bk = ActiveWorkbook
  23. Set sh = bk.Worksheets.Add
  24. NotBltinCnt = 0
  25. BltinCnt = 0
  26.  
  27. 'タイトル表示
  28. sh.Range("a1").Resize(1, 17).Value = sTitle
  29. 'スタイル読み出し
  30. cnt = bk.Styles.Count
  31. For i = 1 To cnt
  32. nCnt = i + 1
  33. '種類
  34. If bk.Styles(i).BuiltIn Then
  35. '組込みスタイル
  36. BltinCnt = BltinCnt + 1
  37. sh.Range("A" & nCnt).Value = "組込"
  38. Else
  39. 'ユーザースタイル
  40. NotBltinCnt = NotBltinCnt + 1
  41. sh.Range("A" & nCnt).Value = "ユーザー"
  42. End If
  43. 'スタイル表示
  44. sh.Range("B" & nCnt).Value = 1234567890
  45.  
  46. 'スタイル名
  47. sh.Range("C" & nCnt).Value = bk.Styles(i).NameLocal
  48.  
  49. '表示形式
  50. If bk.Styles(i).IncludeNumber Then
  51. st = bk.Styles(i).NumberFormatLocal
  52. Else
  53. st = "-"
  54. End If
  55. sh.Range("D" & nCnt).Value = st
  56. '配置
  57. If bk.Styles(i).IncludeAlignment Then
  58. '縦 xlVAlign
  59. stVal = bk.Styles(i).VerticalAlignment
  60. Select Case stVal
  61. Case xlVAlignTop
  62. st = "上"
  63. Case xlVAlignCenter
  64. st = "中央"
  65. Case xlVAlignBottom
  66. st = "下"
  67. Case xlVAlignJustify
  68. st = "両端揃え"
  69. Case xlVAlignDistributed
  70. st = "均等割り付け"
  71. Case Else
  72. st = ""
  73. End Select
  74. sh.Range("E" & nCnt).Value = st
  75.  
  76. ' XlHAlign
  77. stVal = bk.Styles(i).HorizontalAlignment
  78. Select Case stVal
  79. Case xlHAlignGeneral
  80. st = "標準"
  81. Case xlHAlignLeft
  82. st = "左"
  83. Case xlHAlignCenter
  84. st = "中央"
  85. Case xlHAlignRight
  86. st = "右"
  87. Case xlHAlignFill
  88. st = "繰り返し"
  89. Case xlHAlignJustify
  90. st = "両端揃え"
  91. Case xlHAlignCenterAcrossSelection
  92. st = "選択範囲で中央"
  93. Case xlHAlignDistributed
  94. st = "均等割り付け"
  95. Case Else
  96. st = ""
  97. End Select
  98. sh.Range("F" & nCnt).Value = st
  99. Else
  100. sh.Range("E" & nCnt).Value = "-"
  101. sh.Range("F" & nCnt).Value = "-"
  102. End If
  103. 'フォント
  104. If bk.Styles(i).IncludeFont Then
  105. 'フォント名
  106. sh.Range("G" & nCnt).Value = bk.Styles(i).Font.Name
  107. 'フォントサイズ
  108. sh.Range("H" & nCnt).Value = bk.Styles(i).Font.Size
  109. Else
  110. sh.Range("G" & nCnt).Value = "-"
  111. sh.Range("H" & nCnt).Value = "-"
  112. End If
  113. '罫線 XlLineStyle
  114. If bk.Styles(i).IncludeBorder Then
  115. For kNum = 0 To 5
  116. stVal = bk.Styles(i).Borders(kXlValue(kNum)).LineStyle
  117. If stVal <> xlLineStyleNone Then
  118. kStr(kNum) = kName(kNum)
  119. Else
  120. kStr(kNum) = "なし"
  121. End If
  122. Next kNum
  123. With sh.Range("I" & nCnt).Resize(1, 6)
  124. .Value = kStr
  125. End With
  126. Else
  127. With sh.Range("I" & nCnt).Resize(1, 6)
  128. .Value = "-"
  129. End With
  130. End If
  131. 'パターン XlPattern
  132. If bk.Styles(i).IncludePatterns Then
  133. If bk.Styles(i).Interior.Pattern = xlPatternNone Then
  134. st = "網かけなし"
  135. Else
  136. st = "網かけ"
  137. End If
  138. Else
  139. st = "-"
  140. End If
  141. sh.Range("O" & nCnt).Value = st
  142. '保護
  143. If bk.Styles(i).IncludeProtection Then
  144. 'ロック
  145. If bk.Styles(i).Locked Then
  146. st = "ロック"
  147. Else
  148. st = ""
  149. End If
  150. sh.Range("P" & nCnt).Value = st
  151. '非表示
  152. If bk.Styles(i).FormulaHidden Then
  153. st = "表示しない"
  154. Else
  155. st = "表示"
  156. End If
  157. sh.Range("Q" & nCnt).Value = st
  158. Else
  159. sh.Range("P" & nCnt).Value = "-"
  160. sh.Range("Q" & nCnt).Value = "-"
  161. End If
  162. Next i
  163. '並べ替え 種類:降順、 スタイル名:昇順、 先頭行:タイトル
  164. With sh.Range("A1").Resize(cnt + 1, 17)
  165. .Sort Key1:=Range("A2"), Order1:=xlDescending, Key2:=Range("C2"), Order2:=xlAscending, _
  166. Header:=xlGuess, OrderCustom:=1, MatchCase:=False
  167. .Font.Size = 9
  168. .Columns.AutoFit
  169. End With
  170. 'スタイル表示セルに、スタイルを適用
  171. For i = 2 To cnt + 1
  172. sh.Range("B" & i).Style = sh.Range("C" & i).Value
  173. Next i
  174. ERR_EXIT:
  175. If Err.Number <> 0 Then
  176. MsgBox "エラー№:" & Err.Number & " " & Err.Description, , "エラーのため終了します"
  177. End If
  178. Set sh = Nothing
  179. Set bk = Nothing
  180. MsgBox "組込スタイル=" & BltinCnt & ", ユーザースタイル=" & NotBltinCnt & vbCr & _
  181. "スタイル合計=" & BltinCnt + NotBltinCnt, , "スタイル件数"
  182. End Sub
  183.  
  184.  

0 件のコメント :