きっかけ
マクロもない…条件付き書式もない…名前定義もない…見た目の情報量も少ない…
それなのにブックの動きがもっさりするので原因と解決法が知りたかった。わかったのでここに書く。
原因
半端ない量の全く使用しないスタイル。
デフォルトの状態だとスタイルは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個ずつドロップする。
最後に
なぜエクセル上でスタイルの一括削除ができないのかは不明。
名前定義はできるのに…