SSブログ

エクセルのちょっといい話(22):エクセル2013以降の不都合緩和 [エクセル]

エクセルのちょっといい話(20):エクセル2003の並列実行」で触れたように、直近エクセルを含むエクセル2013以降では、シートを開く度に表示位置がずれて行くという問題があります。

また、マルチスレッド計算(マルチコア演算)を有効にしていると、複雑で重い処理を行うブックではオーバーヘッドが発生し、処理が著しく遅くなったり、場合によってはハングアップしてしまうことが少なからずあります。

こららの問題は、エクセルの設定を変えれば何とかなると言ったものではなく、ブック毎に対処する必要があります。
なお、マルチスレッド計算に関しては、エクセルの設定で無効化することができますが、使用環境によっては解除後に再び有効にしておく必要があり、面倒です。

KFシステムクリエイター及びそれに関する一連のツールにおいては、基本的に全てのブックでマルチスレッド計算を無効化しています。一方、システムに関係ないブックでは、マルチスレッド計算を有効にしています。
これらを上手く使い分けるためには、各ブックのマクロベースで対処する必要があります。

VBAには、マルチスレッド計算を制御するMultiThreadedCalculationというオブジェクトがあります。これをThisWorkBookモジュールに記述することで、ブックオープン時にマルチスレッド計算を無効化し、ブッククローズ時に再び有効にすることができます。

また、ブック(ウインドウ)の表示位置を制御するには、Application.Top及びApplication.Leftというプロパティを使えば可能となります。
これらは表示位置の取得の他に、表示位置の指定にも使用できます。

これらを用いてエクセル2013(マルチスレッド計算についてはエクセル2007)以降で生じる不都合を緩和することができます。
その概要は、次の通りです。


1.標準モジュールでの型宣言

この宣言はシートモジュールに対しても行うため、Publicを用いる必要があります。項目はブックの上位置、ブックの左位置、エクセルのバージョンの3つです。

2.ThisWorkBookモジュールでの起動処理、終了処理

ブックのオープン時に、開いたブックの上位置、同左位置、エクセルバージョンを取得します。更に、バージョンがエクセル2007以降の場合は、マルチスレッド計算を無効化します。
ブックのクローズ前には、マルチスレッド計算を有効に戻します。

3.シートモジュールや標準モジュールでの処理

ブックから他のブックを開く処理がある場合、ブックを開いた直後にそのブックの上位置と左位置を、元ブックの位置に揃えます。
なお、元ブックの位置がずれた場合に備え、上記ブックオープン前に、念のため元ブックの上位置と左位置を再取得しておきます。


これらの処理により、例えばブック上に記載したファイル名をダブルクリックすると、そのブックが開くといったマクロでは、エクセル2010以前と同様に、開いたブックの位置は元ブックに重なるようになります。

また、複雑な処理を行うブックを開く際には、再計算につまづくことが減り、スムーズな処理が期待できます。
もちろん、マルチスレッド計算に適したブックもあり、それらにとっては逆効果となるかもしれません。まあ、ケースバイケースといったところでしょうか。

nice!(0)  コメント(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。