【Excel】リンクされた図を含むワークブックが重いので図のリンク状態を制御する

ワークシートをデザインするときに、リンクされた図をうまく利用すると自由なレイアウトを組むことができます。
使いこなせばとても便利なんですが、以前の記事でも書いたようにリンクされた図にはいろいろ不安定な面があります。
ぶち当たったのは、リンクされた図を含むシートを複数回シートコピーするという要件の中で、
コピー回数に比例してブックの変更が重くなるという現象でした。

観察していて分かったのは以下の通り

  • ブックに存在するリンクされた図の数・範囲に比例してブックが重くなる
  • ブックが重くなる直接の原因はリンクされた図の表示更新によるもののようだ
  • この表示更新はApplication.ScreenUpdatingやApplication.CalculationやApplication.Visibleプロパティで制御することができない
  • この表示更新はブックに何らかの変更が入るタイミングで、すべてのリンクされた図で発生する
  • リンクされた図が表示しない領域への変更であろうと、表示更新はすべてのリンクされた図に平等に発生する

対策として条件式を含む名前定義をすることで更新の制御が可能だったので、以下に方法をまとめます


参考サイト
Performance of linked pictures – Daily Dose of Excel


手順
1.リンクされた図を普通にコピペで作成する

2.名前の管理から更新キーを作成する
f:id:ktts:20180725003841p:plain

3.名前の管理から図のリンク状態を制御する名前を作成する
(数式の範囲部分は1で作成したリンクされた図のリンク元範囲)
f:id:ktts:20181205211904p:plain

4.リンク図の数式を3で作成した名前に変更する
(更新キーが1:更新状態で設定すること!)
f:id:ktts:20180725004158p:plain

リンクされた図を更新する場合
更新キーの参照式を"=1"にする

リンクされた図を更新しない場合
更新キーの参照式を"=0"にする

マクロやプログラムで利用する場合は、テンプレートは更新しない状態にしておいて、
変更が確定してから更新する状態にするのがいいと思います。


使用例(C#の場合)

// リンクされた図更新キーの名前定義を取得する
Excel.Names xlNames = xlBook.Names;
Excel.Name xlName = xlNames.Item("IsLinked");

// 更新をオフにする
xlName.RefersTo = "=0";

// ブックへの変更処理・・・

// 更新をオンにする
xlName.RefersTo = "=1";

// リンクされた図への変更を反映する
xlApp.Calculate();

// ブックの出力処理・・・