LoginSignup
3
6

More than 5 years have passed since last update.

名前定義もマクロもないブックが重くなる原因

Posted at

きっかけ

マクロもない…条件付き書式もない…名前定義もない…見た目の情報量も少ない…
それなのにブックの動きがもっさりするので原因と解決法が知りたかった。わかったのでここに書く。

原因

半端ない量の全く使用しないスタイル。
デフォルトの状態だとスタイルは40件程度しかなかったはず。
でも手元にあるおっそいブックはなんと4万件を軽く超えていた…(;´д`)ヒエッ

以下の条件に一致する場合、この現象が発生することを確認。

  • 大量スタイルを持っている かつ、
  • 保護されたビュー(「編集を有効にする」をクリックしない)の状態

の、ブックから1セルでもコピーした場合、そのブックが持っているすべてのスタイルが貼り付け先ブックにコピーされる。

環境

Excel 2010
それ以外のExcelはこの現象が起きるかはわからない。

解決法

個人的にスタイルを使うことはまったくないので一括削除する。

以下のVBスクリプトをデスクトップとか適当な場所において該当ブックをドラッグ&ドロップするだけ。
やっているのはビルトイン分を除いた全てのスタイルを一括削除。

スタイル削除.vbs

ans = MsgBox("スタイル数が多いと20分くらいかかるよ。" & vbCr & "その間エクセル操作すると強制終了しちゃうよ!", vbYesNo, "ビルトイン以外のスタイルを削除します。いいですか?")

If ans = vbNo Then WScript.Quit

MsgBox "処理開始"

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True

For Each strFname In WScript.Arguments
    Set objDoc = objExcel.Workbooks.Open(strFname)

    '全体スタイル数
    All = objDoc.Styles.Count
    '進捗
    i = 0

    'スタイル削除
    For Each S In objDoc.Styles
        '進捗表示
        objExcel.StatusBar = CStr(i) & " / " & CStr(All)
        'ビルトインは除く
        If Not S.BuiltIn Then
            S.Delete
        End If

        i = i + 1
    Next

    '進捗表示を消す
    objExcel.StatusBar = False
    '保存&クローズ
    objDoc.Save
    objDoc.Close

    Set objDoc = Nothing
Next

objExcel.Quit

一応複数ドロップしても対応できるようにしたつもりだが、動作確認してないので1個ずつドロップする。

最後に

なぜエクセル上でスタイルの一括削除ができないのかは不明。
名前定義はできるのに…

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6