ナレッジ ベース KB0204

データ リンクを使用すると一部のExcelファイルの速度が落ちる

問題

Excelファイルにthink-cellデータ リンクが含まれており、セル スタイルが多すぎる場合は、スクロールの速度が非常に遅くなり、Excelが反応していないように見えます。

この問題は、Excelファイルに3000以上のセル スタイルが含まれている場合に発生する可能性があります。イミディエイト ウィンドウで以下のVBAコマンドを使用すると、セルのスタイル数をチェックできます。

print Activeworkbook.Styles.Count

これをチェックする手順を以下に詳述します。

  1. Alt+F11を押してVBAエディターを開きます。
  2. イミディエイト ウィンドウに進みます。表示されない場合は、表示、 → イミディエイト ウィンドウ をクリックすると表示できます。
  3. 以下のコマンドを入力し、Enterを押します。
    print Activeworkbook.Styles.Count

解決策:該当するブックをクリーンアップ

  • ワークシートを新しいブックにコピーします。

    Office 2013以降では、ブック間でワークシートをコピーすると、既定で未使用のセルのスタイルが蓄積されません。

    • ブックのシートをすべて選択します。SHIFTを長押ししたまま、最初と最後のワークシートをクリックします
    • 選択肢を右クリックします:[ 移動先またはコピー先…、 → ブック:(新しいブック)コピーの作成にチェックを入れる → 、OK
    • 新しいブックを新しい名前で保存します

    Office 2007および2010では、ワークシートを新しいブックにコピーすると、未使用のセルのスタイルがすべてコピーされます。これを防ぐには、以下の修正プログラムを最初にアクティブ化してください。

    Officeのバージョンが完全に更新されている場合、この修正プログラムはおそらくすでにインストールされています。ただし、Microsoftの提供するFix itソリューションを使用するか、以下のMicrosoftの記事で説明されているようにレジストリでこの修正を有効にする必要があります。

    修正プログラムをアクティブにしてもうまくいかない場合は、上記のMicrosoftの記事の「解決策」セクションに記載されている更新を適用してください。

  • クリーンアップ ツールでブックをクリーンアップします。

    KB213904でMicrosoftが推奨しているクリーンアップ ツールを使用してください。XLStylesツールを使用し、[Excelファイルを取得] をクリックし、[すべてのセルのスタイルを ‘標準’ にする] をチェックして [ファイルの処理] をクリックします。クリーンアップ ファイルでExcelが開いたら、新しい名前で保存します。

  • VBAマクロを使用して、ユーザー設定のセルのスタイルをブックから削除します。

    Alt + F11でVBAエディターを開きます。ブックを選択し、挿入、 → モジュールをクリックします。以下のいずれかのマクロを貼り付け、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サポートによって提供されています。

    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のバグと問題のあるコードのデザインが原因で、多数(数万)のセルのスタイルが含まれています。また、不要に多くのセル スタイルを生成する可能性がある報告ツールも要因になります。