KB0204: データ リンクを含む一部の Excel ファイルが遅い

問題

Excel ファイルに Excel データ リンク (Excel データ リンク を参照) と非常に多くのセル スタイルが含まれている場合、スクロールが非常に遅くなり、Excel が応答していないように見えることがあります。

この問題は、Excel ファイルに約 3000 を超えるセル スタイルが含まれている場合に発生することがあります。セル スタイルの数は、Immediate Window で次の VBA コマンドを使用して確認できます。

print Activeworkbook.Styles.Count もっと読む

これを確認する手順の詳細は次のとおりです。

  1. Alt+F11 を押して VBA エディターを開きます。
  2. Immediate Window に移動します。表示されていない場合は、View > Immediate Window をクリックすると表示できます。
  3. 次のコマンドを入力して Enter を押します
    print Activeworkbook.Styles.Count

解決策: 影響を受けるワークブックをクリーンアップする

  • ワークシートを新しいワークブックにコピーする もっと読む

    Office 2013 以降では、ワークブック間でワークシートをコピーしても、既定で未使用のセル スタイルが蓄積されないようになっています。

    • SHIFT を押しながら最初と最後のワークシートをクリックして、ワークブック内のすべてのシートを選択します
    • 選択範囲を右クリックします: Move or copy… > To book: (new book) を選択し、Create a copy にチェックを入れます > OK
    • 新しいワークブックを別の名前で保存します

  • クリーンアップ ツールでワークブックをクリーンアップする もっと読む

    KB213904 で Microsoft が推奨しているクリーンアップ ツールを使用してください。XLStyles Tool を使用して、Get Excel File をクリックし、Force all cell styles to 'Normal' にチェックを入れてから、Process File をクリックします。クリーンアップされたファイルが Excel で開いたら、別の名前で保存します。

  • VBA マクロを使用して、ワークブックからカスタム セル スタイルを削除する もっと読む

    Alt+F11 で VBA エディターを開きます。ワークブックを選択し、Insert > Module をクリックします。次に、以下のいずれかのマクロを貼り付け、F5 を押して実行します。

    DeleteCustomStyles() は、ワークブックからすべてのカスタム セル スタイルを削除します。

    Sub DeleteCustomStyles()
    Dim st As Style
    Dim i, i_cust As Long
    i_cust = 0
    For i = (ActiveWorkbook.Styles.Count) To 1 Step -1
    	With ActiveWorkbook.Styles(i)
    		If .BuiltIn = False Then
    			On Error Resume Next
    			.Locked = False
    			On Error GoTo 0
    			If Not .Locked Then
    				.Delete
    				i_cust = i_cust + 1
    			End If
    		End If
    	End With
    	If (i Mod 100) = 0 Then Debug.Print i
    Next
    MsgBox "Styles deleted: " & i_cust & " styles" & Chr(13) & "Styles left: " & ActiveWorkbook.Styles.Count
    End Sub

    Remove_Styles() は、ワークブックから未使用のカスタム セル スタイルのみを削除します。上記のマクロに似ていますが、実行に非常に時間がかかる場合があります。このマクロは Microsoft Office Support から提供されたものです。

    Option Explicit
    Dim st_array() As String
    Dim i_x As Long
    Sub Remove_Styles()
    Dim stname As String
    Dim ustname As String
    Dim uc As Range
    Dim retval As Boolean
    Dim ust As Style
    Dim sh As Worksheet
    i_x = 0
    For Each sh In ActiveWorkbook.Worksheets
        For Each uc In sh.UsedRange
            stname = uc.Style.Name
            retval = Check_Array(stname)
            If retval = False Then
            ReDim Preserve st_array(i_x)
            st_array(i_x) = stname
            i_x = i_x + 1
            End If
        Next uc
    Next sh
    For Each ust In ActiveWorkbook.Styles
        If ust.BuiltIn = False Then
            ustname = ust.Name
            retval = Delete_Styles(ustname)
            On Error Resume Next
            If retval = True Then ust.Delete
            On Error GoTo 0
        End If
    Next ust
    End Sub
    Function Delete_Styles(stylename As String) As Boolean
    Delete_Styles = True
    Dim i_y As Long
    For i_y = 0 To i_x - 1
        If st_array(i_y) = stylename Then Delete_Styles = False
    Next i_y
    End Function
    Function Check_Array(stylename As String) As Boolean
    Check_Array = False
    Dim i_y As Long
    For i_y = 0 To i_x - 1
        If st_array(i_y) = stylename Then Check_Array = True
    Next i_y
    End Function

最善の解決策は、未使用のセル スタイルが貼り付けられないようにすることですが、これには Microsoft が Excel 2007 以降のバグを修正する必要があります。これまでのところ、Microsoft はこの修正を提供するほどビジネスへの影響が大きいとは判断していません。貴社にMicrosoft Officeサポートの連絡先があり、この問題についてMicrosoftに連絡して修正プログラムを要請なさりたい場合は、Microsoftケース番号113012810172527を使用してください。

説明

一部の .xlsx ワークブックには、Excel のバグや問題のあるコード設計により、非常に多数(数万個)のセル スタイルが含まれています。また、レポート ツールが不要に多くのセル スタイルを生成することがある点も一因です。