ラベル Excel の投稿を表示しています。 すべての投稿を表示
ラベル Excel の投稿を表示しています。 すべての投稿を表示

2016年6月15日水曜日

Excelの未使用ユーザースタイルを簡単に削除する

Excel のユーザースタイルは 「XLStylesTool」 を使用することで削除可能ですが、ユーザースタイルを削除するたびに毎回外部ツールを使用しなければならないのはちょっと不便でした。

この投稿では外部ツールやマクロを使用しないで、未使用のユーザースタイルを削除する方法を紹介します。 (動作環境は Windows 10 Pro 64bit, Excel 2013 32 bit です。)



手順は 3 ステップ

  1. すべてのシートを選択。

  2. 移動またはコピーを選択。

  3. 移動先ブック名に「新しいブック」を選択し、「コピーを作成する」をチェック。

このようにすると「新しいブック」には使用中の「ユーザースタイル」のみが引き継がれることになり、結果として未使用のユーザースタイルを削除することができます。



実際に未使用のユーザースタイルを削除する例を紹介します。

対象ファイルのワークブック中に存在するユーザースタイルを、マクロを使って数えたところ 41778 個のユーザースタイルが登録されていることがわかります。

セルのスタイルメニューを開くと、このように多くのユーザースタイルが表示されています。

このワークブックの中で使用しているユーザースタイルを、先日作成した 「Excel のユーザースタイルの使用状況を調べるマクロ」 で調査したところ 41778 個のユーザースタイルの内、実際に使用しているスタイルは標準22のひとつだけで、残り 41777 個のユーザースタイルは全て未使用であることを確認しました。

ここで前述の手順どおり 「新しいブック」 にすべてのシートをコピーして、未使用のユーザースタイルを削除します。ユーザースタイルの削除後 「新しいブック」 のセルのスタイルメニューを開くと、ユーザースタイルの項目は標準22だけが残り、未使用のユーザースタイルが全て削除されたことがわかります。

改めてマクロで確認しても、使用中のユーザースタイルが一つだけであることがわかります。



マクロの処理速度の違い

大量のユーザースタイルはマクロの処理速度に大きく影響を与える場合があります。たとえばユーザースタイル (4,000 個以上) が登録されているブックの中で罫線のLineStyleを標準の太さ以外に変更しようとしたとき、マクロの処理速度が大きく低下する経験をしました。 このような場合、未使用のユーザースタイルを削除することによってマクロの処理速度が向上することがあります。

次の動画は、上記のユーザースタイルの削除前と削除後におけるマクロの処理速度を比較しています。

テスト環境:
CPU: Intel Core i5-2540M 2.60 GHz, RAM: 16 GB,
Windows 10 Pro 64 bit, Excel 2013, Excel 2003 SP3


ユーザースタイルの削除前

(描画処理完了まで約 35 秒要しています)




ユーザースタイルの削除後

(描画処理は約 12 秒で完了) 削除前と比較して 3 倍速くなりました。




Excel 2003 の場合

参考までに、同じアドインを使用した Excel 2003 の処理速度はさらに高速でした。 (描画処理は約 6 秒で完了)削除前と比較して 6 倍速いです。これを今まで使用していました。

注: Excel 2003 のスタイル数は最大 4,000 までのため、事前に XLStylesTool を使用してユーザースタイルを削除しています。



おわりに

Excel 2007 以前のセルスタイルは 4,000 まで使用できましたが、Excel 2007 で 拡張されて最大 64,000 まで使用できるようになりました。 それに伴い 「Excel 2007 で、使用されていないスタイルが、あるブックから別のブックへコピーされます。 - KB2553085」 のような、意図しないスタイルの増加のトラブルなどでユーザースタイルが 4,000 を超えてしまうと 「Word/Excel/PowerPoint 用 Microsoft Office 互換機能パック」 を使用して Excel 2000 や 2003 で xlsx 形式のファイルを開くことができないトラブルが起こりましたが、このような場合は「XLStylesTool」を使用することでユーザースタイルを削除することが可能でした。

そのため、これまでの作業の流れは次のようになっていました。

  1. 作業対象ファイル.xlsx を取得
  2. XLStylesTool でスタイル削除
  3. Office 互換機能パックで変換後 Excel 2003 で開きマクロを実行

既に 2 年前の事ですが、Excel 2003 の延長サポートの終了が残り 1 年となったこともあり Excel 2013 へ移行しようとしました。ところが Excel 2013 ではマクロの処理速度が余りにも遅く、移行をためらうことになりました。結局 Excel 2003 を使い続けることに。

今年になって Windows 10 へ移行したこともあって改めて Excel 2013 に切り替えるべく試行錯誤しているなかで今回の解決方法が見つかりました。 これで安心して Excel 2013 に移行することができます。



関連する過去の投稿

Excelワークブックに登録されたスタイルを数えるマクロ。

2016年6月10日金曜日

Excelのユーザースタイルの使用状況を調べるマクロ

Excel のユーザースタイルの使用状況を調べるマクロを作りました。ユーザースタイルを適用している、ワークシートやセルアドレスを知ることができます。以前に作った「スタイル設定をシートに出力する VBAマクロ」の兄弟ツールになります。

結果は新しいシートに表示されます。この一覧ではユーザースタイルが適用されているシート名、セルアドレス、セルの内容、ユーザースタイル名、ユーザースタイルの設定内容などを表示します。


2012年12月23日日曜日

Excel罫線のオートフィルタの問題点

Excel VBA で描いた罫線で オートフィルタ を使ったとき。フィルタ結果の一部に「 本来表示されるべきではない罫線が表示される現象 」が発生していました。

なかなか解決策が見つからず、この対策としては「 フィルタ結果に対して罫線を再描画する 」といった、場当たり的な方法でやり繰りしていたのですが、ようやく解決策が見つかりました。



「 本来表示されるべきではない罫線、が表示される現象 」とは

ここで改めて、この現象の説明をしておきます。下の図は VBA で罫線を描いた表のオートフィルタ前の状態です。表中で LineColor 列の red 行のデータ red を赤い下罫線、 blue 行のデータ blue を青い下罫線で描いています。

つぎに、オートフィルタを使って LineColor 列の、 red を選択した場合のフィルタ結果が下図です。期待する正しい結果は、赤い下罫線だけの表示なのですが、この表示結果では関係のない所に青い罫線が表示されていたり、赤い罫線のはずの red の所が青い罫線になっており、フィルタ結果がみっともない状態です。

オートフィルタで LineColor 列の、 blue を選択した場合も同様です。


スタイル設定を調べたときにヒントが!

Excel VBA の HELP で、 Bordersオブジェクト を調べると、こんな説明になっています。

このことから下罫線を描く場合には、 Bordersオブジェクト に指定する XlBordersIndex クラス の定数から、 xlEdgeBottom を使って描いていました。

以前、「 スタイル設定をシートに出力する VBA マクロ 」を作りました。このとき Stylesコレクション から取得した、 Bordersプロパティ indexの値 は以下のものでした。

xlLeft, xlRight, xlTop, xlBottom, xlDiagonalDown, xlDiagonalUp

Excel VBA の HELP、 Stylesコレクション のサンプルコードにも xlTop が使われていました。

HELP の Itemプロパティ では、「 xlEdgeXXX 」を使うように書かれています。

さて、ここで疑問が湧き出します。上下左右の罫線にある、「 xlEdgeXXX 」と「 xlXXX 」の定数の違いは何なのでしょうか?



「 xlEdgeBottom 」と「 xlBottom 」を比較してみる

両者の違いを探るため、比較用の VBA マクロを作り調べてみました。(この VBA マクロは文末に記載しています。)

テスト環境は、Excel 2003 SP3・Windows XP SP3 です。

下図左側の下罫線は「 xlEdgeBottom 」、下図右側の下罫線は「 xlBottom 」を使って描いています。その他は同一内容です。

オートフィルタで LineColor 列の、 red を選択したものです。下図右側の「 xlBottom 」の表示が良い感じです。

オートフィルタで LineColor 列の、 blue を選択。こちらの表示結果でも、下図右側の「 xlBottom 」で描いたほうは、正しくフィルタ表示できています。


オートフィルタでは「 xlBottom 」なら OK なの?

そこで、他のバージョンの Excel でも大丈夫なのか調べてみました。

他に使用できる Excel は、

  • Excel 2000 SP3
  • Excel 2010 評価版 (Office Professional 2010 Trial)
  • Excel 2013 Preview (Microsoft Office Professional 2013 Preview)
の 3 種類です。

まずはじめに Excel 2000 SP3・Windows XP SP3 から試してみました。

オートフィルタ項目 red

オートフィルタ項目 blue


つづいて、Excel 2010 評価版・Windows 7 Enterprise 評価版です。

オートフィルタ項目 red

オートフィルタ項目 blue


最後は Excel 2013 Preview・Windows 8 Release Previewです。

オートフィルタ項目 red

オートフィルタ項目 blue


結論、オートフィルタでは「 xlBottom 」を使えば OK

下罫線に「 xlBottom 」を使ったほうでは、いずれの結果もうまく動作しています。これでオートフィルタには「 xlBottom 」を使うことで正しく表示できることがわかりました。

今回調査した結果と、 Web で調べた結果から xlEdgeXXX と xlXXX の違いについて纏めてみると。(内容には未確認部分も含んでいます。)

  • ひとつのセルの上・下・左・右の罫線指定には、それぞれ 「 xlTop 」, 「 xlBottom 」, 「 xlLeft 」, 「 xlRight 」の定数を使う。
  • セル範囲(外周)の上・下・左・右の罫線指定には、それぞれ 「 xlEdgeTop 」, 「 xlEdgeBottom 」, 「 xlEdgeLeft 」, 「 xlEdgeRight 」 の定数を使う。

オートフィルタを使わなければ、どちらの方法で描いても大して変わらないのですが、オートフィルタを使うと挙動が違ってくるという訳です。これがオートフィルタの仕様なのか、バグなのか良く判りませんが、今まで懸案だった問題が少しスッキリした感じです。

今回の調査に使った VBA マクロを以下に記載します

Option Explicit
'/////  罫線のオートフィルタ動作テスト、メイン  /////
Sub Test_Borders()
    Dim mysheet As Worksheet
    Dim rTable_tmp As Range, rTable_left As Range, rTable_right As Range
    Dim xVal As Long
    Const xTable_Width As Integer = 6
    Const xTable_Height As Integer = 19
    Dim sTable_tmp As Variant

On Error GoTo ERR
    '表示データセット
    sTable_tmp = Array(Array("LineColor", "    ", "    ", "    ", "    ", "    "), _
                            Array("red ", "red ", "red ", "    ", "    ", "    "), _
                            Array("blue", "    ", "    ", "    ", "blue", "blue"), _
                            Array("red ", "    ", "red ", "red ", "    ", "    "), _
                            Array("blue", "    ", "    ", "blue", "blue", "    "), _
                            Array("red ", "    ", "    ", "red ", "red ", "    "), _
                            Array("red ", "    ", "    ", "    ", "red ", "red "), _
                            Array("blue", "    ", "blue", "blue", "    ", "    "), _
                            Array("blue", "blue", "blue", "    ", "    ", "    "), _
                            Array("red ", "red ", "red ", "red ", "    ", "    "), _
                            Array("red ", "    ", "red ", "red ", "red ", "    "), _
                            Array("red ", "    ", "    ", "red ", "red ", "red "), _
                            Array("blue", "blue", "blue", "blue", "    ", "    "), _
                            Array("blue", "    ", "blue", "blue", "blue", "    "), _
                            Array("blue", "    ", "    ", "blue", "blue", "blue"), _
                            Array("red ", "red ", "red ", "red ", "red ", "    "), _
                            Array("blue", "    ", "blue", "blue", "blue", "blue"), _
                            Array("red ", "    ", "red ", "red ", "red ", "red "), _
                            Array("blue", "blue", "blue", "blue", "blue", "    "))
    Set mysheet = ActiveSheet
    Set rTable_left = mysheet.Range("A2")
    Set rTable_right = mysheet.Range("H2")
    
    'オートフィルタ解除
    If mysheet.AutoFilterMode = True Then
        mysheet.AutoFilterMode = False
    End If
    
    '領域を消去
    Call DeleteTable(Range("A1:M20"))
    
    'テーブル作成 (失敗する罫線 xlEdgeBottom)
    rTable_left.Offset(-1, 0).Value = "失敗する罫線"
    Call Write_Table(rTable_left, sTable_tmp, xTable_Height, xTable_Width)
    xVal = xlEdgeBottom
    Set rTable_tmp = rTable_left.Offset(1, 1).Resize(xTable_Height - 1, xTable_Width - 1)
    Call Draw_Borders(rTable_tmp, xVal)
    
    'テーブル作成 (成功する罫線 xlBottom)
    rTable_right.Offset(-1, 0).Value = "成功する罫線"
    Call Write_Table(rTable_right, sTable_tmp, xTable_Height, xTable_Width)
    xVal = xlBottom
    Set rTable_tmp = rTable_right.Offset(1, 1).Resize(xTable_Height - 1, xTable_Width - 1)
    Call Draw_Borders(rTable_tmp, xVal)

    'オートフィルタ オン
    If mysheet.AutoFilterMode = True Then
        mysheet.AutoFilterMode = False
    End If
    
    mysheet.Range("A2:M2").AutoFilter
    mysheet.Columns("A:M").AutoFit

ERR:
    Set rTable_right = Nothing
    Set rTable_left = Nothing
    Set rTable_tmp = Nothing
    Set mysheet = Nothing
End Sub
'/////  テーブルデータを表示  /////
Sub Write_Table(ByVal rTable_in As Range, ByVal sTable_in As Variant, nRow As Integer, nCol As Integer)
    Dim nCount As Integer, rTable As Range
    Set rTable = rTable_in.Resize(, nCol)
    
    For nCount = 0 To nRow - 1
        rTable.Offset(rowOffset:=nCount).Value = sTable_in(nCount)
    Next nCount

    Set rTable = Nothing
End Sub
'/////  テーブルに下罫線を描画  /////
Sub Draw_Borders(rTable As Range, xVal As Long)
    Dim r As Range

    '下罫線を描画
    For Each r In rTable
        With r.Borders(xVal)
            Select Case r.Text
            Case "red "
                .LineStyle = xlContinuous
                .Weight = xlThick
                .ColorIndex = 3
            Case "blue"
                .LineStyle = xlContinuous
                .Weight = xlThick
                .ColorIndex = 5
            Case Else
                .LineStyle = xlNone
            End Select
        End With
    Next r

    Set r = Nothing
End Sub

'/////  テーブルを消去  /////
Sub DeleteTable(rTable_range As Range)
    Dim r As Range
    rTable_range.Clear
    
    '下罫線を消去(消去は xlEdgeBottom を使う。)
    For Each r In rTable_range
        r.Borders(xlEdgeBottom).LineStyle = xlLineStyleNone
    Next r

    Set r = Nothing
End Sub

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マクロ

'新しいシートにスタイルを出力。
Sub View_Style()
    Dim nCnt As Long
    Dim BltinCnt As Long
    Dim NotBltinCnt As Long
    Dim i As Long
    Dim st As String
    Dim stVal As Long
    Dim cnt As Long
    Dim sTitle As Variant
    Dim sh As Worksheet
    Dim bk As Workbook
    
    Dim kName As Variant
    Dim kXlValue As Variant
    Dim kStr(5) As String
    Dim kNum As Integer
    sTitle = Array("種類", "スタイル表示", "スタイル名", "表示形式", "配置 縦", "配置 横", "フォント名", _
                "サイズ", "罫線", "罫線", "罫線", "罫線", "罫線", "罫線", "パターン", "保護", "数式表示")
    kName = Array("左", "右", "上", "下", "右斜め下", "右斜め上")
    kXlValue = Array(xlLeft, xlRight, xlTop, xlBottom, xlDiagonalDown, xlDiagonalUp)
    
    On Error GoTo ERR_EXIT
    
    Set bk = ActiveWorkbook
    Set sh = bk.Worksheets.Add
    
    NotBltinCnt = 0
    BltinCnt = 0

    'タイトル表示
    sh.Range("a1").Resize(1, 17).Value = sTitle
    
    'スタイル読み出し
    cnt = bk.Styles.Count
    For i = 1 To cnt
        nCnt = i + 1
        
        '種類
        If bk.Styles(i).BuiltIn Then
            '組込みスタイル
            BltinCnt = BltinCnt + 1
            sh.Range("A" & nCnt).Value = "組込"
        Else
            'ユーザースタイル
            NotBltinCnt = NotBltinCnt + 1
            sh.Range("A" & nCnt).Value = "ユーザー"
        End If
        
        'スタイル表示
        sh.Range("B" & nCnt).Value = 1234567890

        'スタイル名
        sh.Range("C" & nCnt).Value = bk.Styles(i).NameLocal

        '表示形式
        If bk.Styles(i).IncludeNumber Then
            st = bk.Styles(i).NumberFormatLocal
        Else
            st = "-"
        End If
        sh.Range("D" & nCnt).Value = st
        
        '配置
        If bk.Styles(i).IncludeAlignment Then
            '縦 xlVAlign
            stVal = bk.Styles(i).VerticalAlignment
            Select Case stVal
            Case xlVAlignTop
                st = "上"
            Case xlVAlignCenter
                st = "中央"
            Case xlVAlignBottom
                st = "下"
            Case xlVAlignJustify
                st = "両端揃え"
            Case xlVAlignDistributed
                st = "均等割り付け"
            Case Else
                st = ""
            End Select
            sh.Range("E" & nCnt).Value = st

            '横 XlHAlign
            stVal = bk.Styles(i).HorizontalAlignment
            Select Case stVal
            Case xlHAlignGeneral
                st = "標準"
            Case xlHAlignLeft
                st = "左"
            Case xlHAlignCenter
                st = "中央"
            Case xlHAlignRight
                st = "右"
            Case xlHAlignFill
                st = "繰り返し"
            Case xlHAlignJustify
                st = "両端揃え"
            Case xlHAlignCenterAcrossSelection
                st = "選択範囲で中央"
            Case xlHAlignDistributed
                st = "均等割り付け"
            Case Else
                st = ""
            End Select
            sh.Range("F" & nCnt).Value = st
        Else
            sh.Range("E" & nCnt).Value = "-"
            sh.Range("F" & nCnt).Value = "-"
        End If
        
        'フォント
        If bk.Styles(i).IncludeFont Then
            'フォント名
            sh.Range("G" & nCnt).Value = bk.Styles(i).Font.Name
            
            'フォントサイズ
            sh.Range("H" & nCnt).Value = bk.Styles(i).Font.Size
        Else
            sh.Range("G" & nCnt).Value = "-"
            sh.Range("H" & nCnt).Value = "-"
        End If
        
        '罫線 XlLineStyle
        If bk.Styles(i).IncludeBorder Then
            For kNum = 0 To 5
                stVal = bk.Styles(i).Borders(kXlValue(kNum)).LineStyle
                If stVal <> xlLineStyleNone Then
                    kStr(kNum) = kName(kNum)
                Else
                    kStr(kNum) = "なし"
                End If
            Next kNum
            With sh.Range("I" & nCnt).Resize(1, 6)
                .Value = kStr
            End With
            
        Else
            With sh.Range("I" & nCnt).Resize(1, 6)
                .Value = "-"
            End With
        End If
        
        'パターン XlPattern
        If bk.Styles(i).IncludePatterns Then
            If bk.Styles(i).Interior.Pattern = xlPatternNone Then
                st = "網かけなし"
            Else
                st = "網かけ"
            End If
        Else
            st = "-"
        End If
        sh.Range("O" & nCnt).Value = st
        
        '保護
        If bk.Styles(i).IncludeProtection Then
            'ロック
            If bk.Styles(i).Locked Then
                st = "ロック"
            Else
                st = ""
            End If
            sh.Range("P" & nCnt).Value = st
            
            '非表示
            If bk.Styles(i).FormulaHidden Then
                st = "表示しない"
            Else
                st = "表示"
            End If
            sh.Range("Q" & nCnt).Value = st
        Else
            sh.Range("P" & nCnt).Value = "-"
            sh.Range("Q" & nCnt).Value = "-"
        End If
    Next i
    
    '並べ替え 種類:降順、 スタイル名:昇順、 先頭行:タイトル
    With sh.Range("A1").Resize(cnt + 1, 17)
        .Sort Key1:=Range("A2"), Order1:=xlDescending, Key2:=Range("C2"), Order2:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False
        .Font.Size = 9
        .Columns.AutoFit
    End With
    
    'スタイル表示セルに、スタイルを適用
    For i = 2 To cnt + 1
        sh.Range("B" & i).Style = sh.Range("C" & i).Value
    Next i
    
ERR_EXIT:
    If Err.Number <> 0 Then
        MsgBox "エラー№:" & Err.Number & " " & Err.Description, , "エラーのため終了します"
    End If
    
    Set sh = Nothing
    Set bk = Nothing
    
    MsgBox "組込スタイル=" & BltinCnt & ", ユーザースタイル=" & NotBltinCnt & vbCr & _
    "スタイル合計=" & BltinCnt + NotBltinCnt, , "スタイル件数"
End Sub


2011年5月20日金曜日

Excelバージョンによる オートフィルタのリスト件数の違い

先日、Excelオートフィルタを使っている時に気が付いたのですが。オートフィルタのドロップダウンリストに表示される件数に、制限があるようなので調べてみました。

下図のFREQ列で、オートフィルタのドロップダウンリストを表示すると15,670kHzまでしか表示されていません。リスト自体は9,726行目の26,060kHzまでデータがあります。

オートフィルタのオプションを開きます。

ここでフィルタ条件を 20,000kHz以上 30,000kHz以下 に設定すると、条件どおりにフィルタされ、データの最終部分が表示されていることが確認できます。

調べてみると、このオートフィルタのドロップダウンリストで表示可能なデータ数は、Excel の各バージョンによって違いがあるそうです。

オートフィルタのドロップダウンリストに表示可能なデータ数 によると。

Excel5.0, Excel95では
リストの入力データのうち、重複しないものが250件目までが表示されます。

Excel97 / 2000 / 2002 では
リストの入力データのうち、重複しないものが1,000件目までが表示されます。

Excel2003で確認したところ1,000件目まででした。



Excel2007からは10,000件までになったそうなので、Excel2010評価版で確認してみました。
初めにデータを10,010行目まで作成します。

次にオートフィルタを1行目にセットし、ドロップダウンリストを開くと 2行目から10,001行目までのデータが10,000件表示されています。

「一部のアイテムは表示されていません」をクリックしてみると。

やはり10,000件までのようですね。

では青木リストではどうでしょう。

ドロップダウンリストには、データの最終行まで表示されていますね。

Excelも外観の見た目だけではなく、バージョンアップごとに細かい部分で機能が拡張されているのですね。