17
  1. ゼロから再作成された 10 枚のシート、更新された 12 枚のシート、生データが読み込まれた 5 枚のシート、およびレポートのマクロで使用される 7 枚のシートを含む巨大なファイルがあります。
  2. 最近新しいシートを追加しましたが、Excel の「セル形式が多すぎます」という問題が発生しています。

私が試したこと

Google の検索結果のいくつかを読んだことがありますが、書式設定を簡素化する必要があると書かれていますが、最大 4000 の異なるセル書式をどのように取得したかさえわかりません。いくつか。

また、ファイルが実行されるたびにポップアップしますが、すべてではありません。マクロは、10 枚のシートをゼロから作成するなど、多くの作業を行っているため、何をすべきかわかりません。

誰か知っていますか

  • すべてのセル形式のリストを取得するために実行できるマクロと、それらを使用しているセルの数は?
  • 余分なセル形式を削除するのに役立つと彼らが信頼しているプログラムは何ですか?

ありがとう

4

14 に答える 14

46

あなたが説明した問題により、Excel 2010 を使用しているときに私 (および同僚) の生産性が何時間も失われました。

' Description:
'    Borrowed largely from http://www.jkp-ads.com/Articles/styles06.asp

Option Explicit

' Description:
'    This is the "driver" for the entire module.
Public Sub DropUnusedStyles()

    Dim styleObj As Style
    Dim rngCell As Range
    Dim wb As Workbook
    Dim wsh As Worksheet
    Dim str As String
    Dim iStyleCount As Long
    Dim dict As New Scripting.Dictionary    ' <- from Tools / References... / "Microsoft Scripting Runtime"

    ' wb := workbook of interest.  Choose one of the following
    ' Set wb = ThisWorkbook ' choose this module's workbook
    Set wb = ActiveWorkbook ' the active workbook in excel


    Debug.Print "BEGINNING # of styles in workbook: " & wb.Styles.Count
    MsgBox "BEGINNING # of styles in workbook: " & wb.Styles.Count

    ' dict := list of styles
    For Each styleObj In wb.Styles
        str = styleObj.NameLocal
        iStyleCount = iStyleCount + 1
        Call dict.Add(str, 0)    ' First time:  adds keys
    Next styleObj
    Debug.Print "  dictionary now has " & dict.Count & " entries."
    ' Status, dictionary has styles (key) which are known to workbook


    ' Traverse each visible worksheet and increment count each style occurrence
    For Each wsh In wb.Worksheets
        If wsh.Visible Then
            For Each rngCell In wsh.UsedRange.Cells
                str = rngCell.Style
                dict.Item(str) = dict.Item(str) + 1     ' This time:  counts occurrences
            Next rngCell
        End If
    Next wsh
    ' Status, dictionary styles (key) has cell occurrence count (item)


    ' Try to delete unused styles
    Dim aKey As Variant
    On Error Resume Next    ' wb.Styles(aKey).Delete may throw error

    For Each aKey In dict.Keys

        ' display count & stylename
        '    e.g. "24   Normal"
        Debug.Print dict.Item(aKey) & vbTab & aKey

        If dict.Item(aKey) = 0 Then
            ' Occurrence count (Item) indicates this style is not used
            Call wb.Styles(aKey).Delete
            If Err.Number <> 0 Then
                Debug.Print vbTab & "^-- failed to delete"
                Err.Clear
            End If
            Call dict.Remove(aKey)
        End If

    Next aKey

    Debug.Print "ENDING # of style in workbook: " & wb.Styles.Count
    MsgBox "ENDING # of style in workbook: " & wb.Styles.Count

End Sub
于 2012-01-19T21:16:32.570 に答える
7

「セルフォーマット」は複雑です。セルには実際には「フォーマット」がありません。フォント (それ自体に名前とサイズがあります)、NumberFormat、Height、Width、Orientation などがあります。

したがって、「フォーマット」の意味を定義する必要があります。

以下は、フォント名とサイズを取得するコードです。好きな属性に置き換えることができます。

以下のコードは、ワークブックに「Formats」という名前のワークシートを作成したことを前提としています。マクロを実行すると、フォント名とサイズがそのワークシートに表示されます。

Public Sub GetFormats()

    Dim CurrentSheet As Integer
    Dim UsedRange As Range
    Dim CurrentCell As Range
    Dim rw As Long

    Sheets("Formats").Cells.ClearContents
    rw = 1
    For CurrentSheet = 1 To Sheets.Count
        Set UsedRange = Range(Sheets(CurrentSheet).Range("A1"), Sheets(CurrentSheet).Range("A1").SpecialCells(xlLastCell))
        For Each CurrentCell In UsedRange
            FontUsed = CurrentCell.Font.Name + ":" + CStr(CurrentCell.Font.Size)
            If Sheets("Formats").Cells.Find(FontUsed) Is Nothing Then
                Sheets("Formats").Cells(rw, 1).Value = FontUsed
                rw = rw + 1
            End If
        Next
    Next CurrentSheet
End Sub
于 2010-03-15T21:04:42.730 に答える
6

多くの人がこの問題に遭遇しているようです。

ほとんどの場合、この問題は、未使用で破損していることが多いスタイルの数が多すぎることに関連しており 、セル固有のセル形式の組み合わせの総数はそれほど多くありません。

XL2003に保存できるXL2007OOXMLファイルを修正するユーティリティを作成しました。ブログ投稿へのリンクは次のとおりです。

  • .Net3.5およびMSExcel2007が必要です。
  • xlsxまたはxlsmファイルを修正します。
  • 投稿には、アプリに対応するReadMeファイルが含まれています。

他のフォーラムで提案されているように、OpenOfficeを使用してファイルをさらに破損するリスクを冒す必要はありません。

于 2010-03-17T05:08:30.060 に答える
2

Excel 2007+ で「セル形式が多すぎます」というエラー メッセージが表示されるバグに対処しました: http://sergeig888.wordpress.com/2011/05/06/msft-released-hot-fix-for-excel-2007 -custom-styles-duplication/ バグ修正は、ファイルの破損に関連する既存のスタイルを削除しないことに注意してください。オープン XML ベースのツール (無料で入手可能) は、Excel オブジェクト モデル ベースのツールにアクセスできない要素を削除できる唯一のオプションです。たとえば、組み込みスタイルや非表示のスタイルに偽装した不適切なスタイルなどです。オープン XML ベースのクリーンアップ手段100% スタイル関連の破損のないファイル。

于 2011-11-29T03:56:45.903 に答える
2

この問題を解決する最も簡単な方法は、この Excel アドインを使用することでした。問題に関するMicrosoftのページからの「公式」の回答のようです。

私が .xlam ファイルを使用していたときと同じように混乱している場合は、ダウンロード後に Excel で次のようにします。

  1. [ファイル] < [オプション] < [アドイン] をクリックします。
  2. [オプションの管理] で [移動] をクリックします。
  3. [アドイン] ウィンドウで [参照] をクリックし、XLAM ファイルが保存されている場所を参照して強調表示し、[OK] をクリックします。
  4. [アドイン] ウィンドウで新しいアドインを有効にして、[OK] をクリックします。
  5. ホーム画面のリボン バーに [スタイルの削除] セクションが表示されます。これは、ブック内のスタイルの数 (この問題が発生している場合はおそらく数千) を示すボタンで構成されています。
  6. リボンのボタンをクリックすると、重複したフォーマットがすべて削除されます。

表示されない場合は、リボンに正しく表示されていることを確認してください。リボンを右クリックして、「リボンをカスタマイズ」と言います。次に、[アドイン] をクリックします。[アクティブなアプリケーション アドイン] の下に、[余分なスタイルの削除] が表示されます。

2019 更新:そのリンクで、彼らはすべてを大きな zip ファイルに入れ、問題に関する議論などを行いました。そのzipファイルには、ソースコードと呼ばれる別のzipフォルダーがあり、そのフォルダーに.xlamファイルがあります。

于 2015-10-02T16:18:05.590 に答える
1

私は以前にこの問題を見たことがあります。私が言っていることを証明するために再現することは可能です。ちょっとしたキャッチ22ですが、「フォーマットが多すぎます」という問題があるシートがある場合は、新しいシートを開き、フォーマットが多すぎるシートから1つのセルをコピーして、新しいブックに貼り付けます。このワークブックは、いわば「感染」し、フォーマットエラーが多すぎます。特別なペーストを使用して制限しない限り、多くのフォーマットデータがそのペーストに含まれているようです。

物事をより良くする方法は?回避策は、[HTMLとして保存]関数を使用することです。これは機能しますが、我慢してください。ここで2003について話しているのですが、2007年に何が起こるかわかりません。おそらく、このバグは修正されています。だから...Htmlとして保存し、Excelを閉じます。新しいセッションをロードし、マクロを実行しないようにこれをロードしてから、ロードしたらスプレッドシートとして保存します。

この新しいスプレッドシートを閉じて再度開くと、フォーマットが多すぎるという問題は解消されます。

于 2010-11-19T18:12:54.930 に答える
1

SpreadsheetGear for .NETは、状況に役立つ可能性がある一意でない形式を結合します。

役立つかどうかを確認したい場合は、ここから無料試用版をダウンロードできます。評価版ソフトウェアと共にインストールされる「SpreadsheetGear 2009 for Windows」アプリケーションにワークブックをロードし、ワークブックを保存するだけです。

実際に独自のフォーマットがたくさんある場合は、単純化する必要があります。フォント/セルの色 (内部)、数値形式、水平方向と垂直方向の配置、境界線、インデント レベル、およびおそらく私が考えていないいくつかの独自の組み合わせにより、テーブルに独自のエントリが作成されます。

もう 1 つのオプションは、一意のセル形式の制限が 4,000 から 64K に増加した Excel 2007 に切り替えることです。

免責事項: 私は SpreadsheetGear LLC を所有しています

于 2010-03-15T20:45:25.463 に答える
1

これにより、デフォルトのスタイル (通常、説明、20% アクセント 1 など) を除くすべてのスタイルが削除されます。ユーザーが作成したスタイルを含めますが、ワークブックをクリーンアップするための簡単で汚い方法です。


Sub NewNukeStyles()
Dim tempstyle As Style

For Each tempstyle In ActiveWorkbook.Styles

 If tempstyle.BuiltIn = False Then
    If tempstyle.Locked = True Then 'not sure what this is
       tempstyle.Delete
    End If
End If

Next tempstyle

End Sub 'NukeStyles

「オブジェクトがロックされているかどうかを示すブール値」以外の tempstyle.locked プロパティが実際に何を参照しているか知りたいです。

于 2016-06-23T03:18:07.070 に答える
1

解決策の 1 つは、 ASAP ユーティリティを使用することです。シートセクションにはremove all unused stylesオプションがあります。その後、ワークブックを閉じて再度開く必要があると思います。

于 2012-07-26T20:59:29.523 に答える
0

ファイルを開くことができる場合は、>編集>クリア>フォーマットを試してください。

それが私のために働いたフォーマットを打つ前にシートをハイライトしてください。

何かが足りない場合に備えて、これを行う前に必ずEXCELのコピーを作成してください。これにより、古いドキュメントと相互参照できます。

于 2013-02-25T12:13:17.327 に答える
-1

これは、リリースされたすべてのバージョンを悩ませている Excel のバグです。

この問題は、このツールを使用して修正できます。

XLSファイルと連携しXLSXます。

于 2011-11-03T08:08:33.367 に答える
-2

「セル形式が多すぎます」というエラーが表示された場合は、すぐにドキュメントを保存してください。とりあえず、ドキュメントの名前を他の名前に変更してください。ドキュメントを開き、前に使用したのと同じ名前で保存します。ドキュメントを閉じて開くと、そのエラーは表示されなくなります。単純な保存で消えてしまうこともありますが、私にはちょっと奇妙です!

于 2013-03-04T18:13:07.440 に答える
-2

ファイルが小さい場合の簡単な解決策の 1 つ:

すべてコピーして、Word に貼り付けるだけです。コンテンツを表として検出します。次に、すべての列 (左上隅の十字記号を使用して完全なテーブルではありません) を選択し、それを新しい .xls シートに貼り付けると、明確な値のみが表示されます。

于 2014-06-16T14:20:25.773 に答える