2016年6月15日水曜日

Excelの未使用ユーザースタイルを簡単に削除する

Excel のユーザースタイルは 「XLStylesTool」 を使用することで削除可能ですが、ユーザースタイルを削除するたびに毎回外部ツールを使用しなければならないのはちょっと不便でした。

この投稿では外部ツールやマクロを使用しないで、未使用のユーザースタイルを削除する方法を紹介します。 (動作環境は Windows 10 Pro 64bit, Excel 2013 32 bit です。)



手順は 3 ステップ

  1. すべてのシートを選択。

  2. 移動またはコピーを選択。

  3. 移動先ブック名に「新しいブック」を選択し、「コピーを作成する」をチェック。

このようにすると「新しいブック」には使用中の「ユーザースタイル」のみが引き継がれることになり、結果として未使用のユーザースタイルを削除することができます。



実際に未使用のユーザースタイルを削除する例を紹介します。

対象ファイルのワークブック中に存在するユーザースタイルを、マクロを使って数えたところ 41778 個のユーザースタイルが登録されていることがわかります。

セルのスタイルメニューを開くと、このように多くのユーザースタイルが表示されています。

このワークブックの中で使用しているユーザースタイルを、先日作成した 「Excel のユーザースタイルの使用状況を調べるマクロ」 で調査したところ 41778 個のユーザースタイルの内、実際に使用しているスタイルは標準22のひとつだけで、残り 41777 個のユーザースタイルは全て未使用であることを確認しました。

ここで前述の手順どおり 「新しいブック」 にすべてのシートをコピーして、未使用のユーザースタイルを削除します。ユーザースタイルの削除後 「新しいブック」 のセルのスタイルメニューを開くと、ユーザースタイルの項目は標準22だけが残り、未使用のユーザースタイルが全て削除されたことがわかります。

改めてマクロで確認しても、使用中のユーザースタイルが一つだけであることがわかります。



マクロの処理速度の違い

大量のユーザースタイルはマクロの処理速度に大きく影響を与える場合があります。たとえばユーザースタイル (4,000 個以上) が登録されているブックの中で罫線のLineStyleを標準の太さ以外に変更しようとしたとき、マクロの処理速度が大きく低下する経験をしました。 このような場合、未使用のユーザースタイルを削除することによってマクロの処理速度が向上することがあります。

次の動画は、上記のユーザースタイルの削除前と削除後におけるマクロの処理速度を比較しています。

テスト環境:
CPU: Intel Core i5-2540M 2.60 GHz, RAM: 16 GB,
Windows 10 Pro 64 bit, Excel 2013, Excel 2003 SP3


ユーザースタイルの削除前

(描画処理完了まで約 35 秒要しています)




ユーザースタイルの削除後

(描画処理は約 12 秒で完了) 削除前と比較して 3 倍速くなりました。




Excel 2003 の場合

参考までに、同じアドインを使用した Excel 2003 の処理速度はさらに高速でした。 (描画処理は約 6 秒で完了)削除前と比較して 6 倍速いです。これを今まで使用していました。

注: Excel 2003 のスタイル数は最大 4,000 までのため、事前に XLStylesTool を使用してユーザースタイルを削除しています。



おわりに

Excel 2007 以前のセルスタイルは 4,000 まで使用できましたが、Excel 2007 で 拡張されて最大 64,000 まで使用できるようになりました。 それに伴い 「Excel 2007 で、使用されていないスタイルが、あるブックから別のブックへコピーされます。 - KB2553085」 のような、意図しないスタイルの増加のトラブルなどでユーザースタイルが 4,000 を超えてしまうと 「Word/Excel/PowerPoint 用 Microsoft Office 互換機能パック」 を使用して Excel 2000 や 2003 で xlsx 形式のファイルを開くことができないトラブルが起こりましたが、このような場合は「XLStylesTool」を使用することでユーザースタイルを削除することが可能でした。

そのため、これまでの作業の流れは次のようになっていました。

  1. 作業対象ファイル.xlsx を取得
  2. XLStylesTool でスタイル削除
  3. Office 互換機能パックで変換後 Excel 2003 で開きマクロを実行

既に 2 年前の事ですが、Excel 2003 の延長サポートの終了が残り 1 年となったこともあり Excel 2013 へ移行しようとしました。ところが Excel 2013 ではマクロの処理速度が余りにも遅く、移行をためらうことになりました。結局 Excel 2003 を使い続けることに。

今年になって Windows 10 へ移行したこともあって改めて Excel 2013 に切り替えるべく試行錯誤しているなかで今回の解決方法が見つかりました。 これで安心して Excel 2013 に移行することができます。



関連する過去の投稿

Excelワークブックに登録されたスタイルを数えるマクロ。

2016年6月14日火曜日

メモ:特定の範囲をMathJaxにレンダリングさせない方法

ブログで MathJax を使用できるように設定していると数式表示がとても便利になるのですが、ちょっと具合の悪い場合もあります。それは、数式に解釈できる文字列を含んだ Gist のコードを貼り付けた場合です。

例えばこのように、数式の部分が自動的に変換されて表示されます。

これを回避するには、MathJax の ignoreClass を使用します。

以下のように MathJax.Hub.Config の設定にignoreClass: "tex2jax_ignore"を追加すると。MathJax にレンダリングさせないクラスを設定することができます。

MathJax.Hub.Config({
    
    ...
    
    tex2jax: {

        ...

        ignoreClass: "tex2jax_ignore"
    }
});

コードのスクリプトを張り付ける際は、下記のようにclass="tex2jax_ignore"のブロックで囲みます。

<div class="tex2jax_ignore">
<script src="https://gist.github.com/icm7216/8409c6e4e7332a03ef5747f7f030fd58.js"></script>
</div>

これで MathJax にレンダリングされず、そのまま表示できるようになります。

2016年6月10日金曜日

Excelのユーザースタイルの使用状況を調べるマクロ

Excel のユーザースタイルの使用状況を調べるマクロを作りました。ユーザースタイルを適用している、ワークシートやセルアドレスを知ることができます。以前に作った「スタイル設定をシートに出力する VBAマクロ」の兄弟ツールになります。

結果は新しいシートに表示されます。この一覧ではユーザースタイルが適用されているシート名、セルアドレス、セルの内容、ユーザースタイル名、ユーザースタイルの設定内容などを表示します。


2016年4月9日土曜日

メモ: ワンライナーで計算

コマンドラインの途中で計算結果をコマンド置換して引数の値に使うときの、ワンライナーで(float 値を含む)計算する方法のメモ。


bc コマンドのワンライナーで計算

小数点以下の桁数を指定するには scale 値を設定する。

  • scale 値とは、式の小数部以下の桁数。
  • -lオプションで起動すると数学ライブラリが読み込まれ、 scale 値が 20 に設定される。

 $ echo '(10+90)/3.0' | bc
33
 $ echo "scale=15; (10+90)/3" | bc
33.333333333333333
 $ echo '(10+90)/3' | bc -l
33.33333333333333333333



awk のワンライナーで計算

小数点以下の桁数は書式で指定可能。フォーマット指定子を使い printf で出力するか、 print 出力の OFMT 値を指定する。 OFMT のデフォルト値は"%.6g"

printf で出力


 $ awk 'BEGIN { printf "%.15f\n", (10 + 90) / 3}'
33.333333333333336

print で出力


 $ awk 'BEGIN { print (10 + 90) / 3}'
33.3333
 $ awk 'BEGIN {OFMT="%.15f"; print (10 + 90) / 3}'
33.333333333333336



perl のワンライナーで計算

print で出力

  • print で出力する場合は、関数に続く括弧は計算の優先順位の括弧とはならない。この場合、関数の引数を指定する括弧と解釈されるようだ。回避するには少しばかりの記述の工夫が必要。

 $ perl -le 'print (10+90)/3.0'
100
 $ perl -le 'print ((10+90)/3)'
33.3333333333333
 $ perl -le 'print +(10+90)/3'
33.3333333333333

printf で出力

  • printf で出力する場合、小数点以下の桁数をフォーマット指定子を使って指定可能。また、引数の計算式も正しく解釈してくれるようだ。

 $ perl -le 'printf "%.15f\n", (10+90)/3'
33.333333333333336



python のワンライナーで計算

Python の float 型は内部で 53bit の精度を持っているそうだ。

式の中に float 値を含めると、計算結果は float 値で返される。


 $ python -c 'print (10+90)/3'                                  
33
 $ python -c 'print (10+90)/3.0'
33.3333333333

float() メソッドで float 値に変換


 $ python -c 'print float (10+90)/3'
33.3333333333
 $ python -c 'print float(10+90)/3'
33.3333333333

書式で桁数を指定

%演算子を使う場合(非推奨)


 $ python -c 'print "%.15f" % ((10+90)/3.0)'
33.333333333333336

format() メソッドを使う場合(推奨)


 $ python -c 'print "{:.15f}".format((10+90)/3.0)'
33.333333333333336



ruby のワンライナーで計算

式の中に float 値を含めると、計算結果は float 値で返される。


 $ ruby -e 'p (10+90)/3'
33
 $ ruby -e 'p (10+90)/3.0'
33.333333333333336

組み込み関数Floatto_fメソッドで float 値に変換して計算

  • Float 直後の空白の有無で結果が違うことに注意。

 $ ruby -e 'p (10+90)/3.to_f'
33.333333333333336
 $ ruby -e 'p Float (10+90)/3'
33.0
 $ ruby -e 'p Float(10+90)/3'
33.333333333333336

組み込み関数 sprintf (または format )を使う

  • 小数点以下の桁数をフォーマット指示子を使って指定可能。
  • String#%メソッドでも可能。

 $ ruby -e 'puts sprintf( "%.10f", (10+90)/3.0)'
33.3333333333
 $ ruby -e 'puts format( "%.15f", (10+90)/3.0)'
33.333333333333336
 $ ruby -e 'puts "%.15f" % ((10+90)/3.0)'
33.333333333333336



まとめ

計算式の記述で気を付ける箇所は括弧が先に来る場合。それが式の括弧なのか、引数の括弧なのか、コマンドによって微妙に違うところに注意。