Excel2013の外部参照について

# はじめに

弊社サーバーのデプロイに伴って、ディレクトリ構成の変更を行う予定です。
が、その際に他ブックのセルの値を利用した数式なんかのリンク更新がうまくいかなくなる危険性が出てきたので調査してみました。
基本的にExcelは絶対パス指定だと思っていました。だって数式バーに絶対パスっぽく表示されてるし。
ところがどうやらそういうわけでもないらしいです。...うーん難しい。
~~そもそも同じブック内ならともかく、別ブックをまたいで関数書くなよって話なんですけどその辺は触れない方向で。~~

# 技術資料

+ [Excel のリンクの管理と格納について](https://support.microsoft.com/ja-jp/help/3054770)
+ [Excel 2013 でブック内のセルから別のブックを外部参照していると外部参照の情報が絶対パスで保存される](https://support.microsoft.com/ja-jp/help/328440/description-of-link-management-and-storage-in-excel)

# そもそものExcelの仕様

## 相対パスについて

> Microsoft Excel では、外部のブックを参照する数式を使用して、ブック内のセルを別のブックにリンクできます。このリンクの作成時に相対パスを使用できます。相対リンクを使用すると、リンクを破損することなくブックを移動できます。

OKOK、相対パスちゃんは使えるのね。素晴らしい。

> 数式バーに表示される情報は、必ずしも格納される情報でないことにも注意してください。たとえば、リンク元のデータ ファイルを閉じると、そのファイルの完全なパスが表示されますが、実際にはファイル名だけが格納されることがあります。

この辺は念頭に置いておかないと頭おかしくなりそう。

### ファイルが同じドライブ上にない場合

> ドライブ文字がファイルのパスおよびファイル名と共に格納されます。

んー...リンク先ファイルのドライブ名＋ファイルパス＋ファイル名が保存されるってことかな。
つまりは絶対パスってことですよね？この辺は理解理解。

### ファイルが同じフォルダにある場合

> ファイル名だけが格納されます。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/165355/aecbbf1d-d449-0253-25b2-a5ab809c9b80.png)
これは完全に相対パスですね。
ファイル名さえ変えなければOK、と。

### 同じルート　フォルダからネストしたフォルダにある場合

> ルート フォルダを示すプロパティ情報が格納されます。共有されるパスのすべては格納されません。
たとえば、リンク先のファイル C:\Mydir\Linked.xls が C:\Mydir\Files\Source.xls を参照している場合、パスの格納される部分は \Files\Source.xls だけです。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/165355/9a3157eb-86fd-eb48-e698-d614bb02ee4c.png)
ふむふむ。つまりは自分自身を起点に相対パスとして保存されると。

### リンク先のファイルの 1 つ下のフォルダにある場合

> これを示すプロパティ情報が格納されます。

たとえば、リンク先のファイルが C:\Mydir\Files\Myfile\Linked.xls で、リンク元のデータ ファイルが C:\Mydir\Files\Source.xls である場合、\MyDir\Files\ .. \Source.xls だけが Excel で格納されます。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/165355/15a19ed3-0879-bb8c-e913-2464180b7397.png)
だんだん分からなくなってきた...。

### ネットワークドライブの扱い

> リンク元のデータ ブックをリンクするとき、そのブックを開いた方法に応じてリンクが作成されます。ブックがネットワーク ドライブ経由で開かれた場合、ネットワーク ドライブを使用してリンクが作成されます。

ネットワークドライブ切ってブックにアクセスすれば、アクセスしたユーザーのネットワークドライブ文字を利用してリンクが生成されるってこと？

> それ以降は、リンク元のデータ ブックが開かれる方法には関係なく、リンクの形式は同じままです。リンク元のデータ ファイルが UNC パスで開かれた場合、該当するドライブが見つかっても、リンクはネットワーク ドライブの形式には戻りません。
> そのリンクは、それ以降にファイルが開かれる方法には関係なく UNC リンクのままになります。

えーと...日本語でお願いします。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/165355/5c05ecd0-b13f-ccb2-1b80-31370e1a1b1a.png)
つまりは一度でもUNCパス（\\\\ServerName or IP Adress）からディレクトリ内のブックにアクセスしてしまったらUNCパスになって、絶対パス扱いになるということなのかな...？

# Excel2013の製品問題について

> Microsoft Excel 2013 で、ブック内のセルから別のブックを外部参照している場合、外部参照の情報が絶対パスで保存されます。
> Excel 2013 では、[ドキュメントのプロパティと個人情報] をファイルに保存しないように設定している場合、外部参照を絶対パスで保存します。

過去のバージョンの Excel では、外部参照パスはこの設定による影響を受けません。

えぇえ、そうなんですか...。
技術資料の2つ目に解決手段は掲載されていますが、根本的な解決はできないみたいです。
~~バグ~~仕様として割り切るしかなさそうですね。

# 実際にやってみた

## ファイルが同じフォルダにある場合

Microsoftさんの仰せのままにドキュメント情報を保存させた結果、問題なく移行できました。

## 同じルート　フォルダからネストしたフォルダにある場合

これもクリアー。今まで悩んでたのは何だったんだ...ってくらいすんなりと。

## リンク先のファイルの 1 つ下のフォルダにある場合

ここで問題発生。できません。
こちらの環境の問題なのか、そういう仕様なのか...あとはもうMicrosoftさんに問い合わせるしかないかー。しょうがない。
これである程度原因と対策の目処はついたので良しとします。

# 番外編

## 一度絶対パスになった外部参照を再リンクせずに貼り直すことは可能なのか？

***結論：***
移動前に絶対→相対に変更していればOK。
一度でも場所を変えてしまったら再度リンクを貼り直す必要あり。

## ディレクトリを複数回ネストしたファイルも相対パスで表示できるのか？

***結論：***
可能です。階層が変わったり、ディレクトリの名前が変わったりしたら当然アウトだと思われる。

## 他のバージョンで作った相対パスをExcel2013で更新したらどうなるんです？

***結論：***
(✿´◡｀✿)
これほどMicrosoftを恨んだ日があっただろうか。いや、ない。
ドキュメント情報を保存する設定にした上で上書き保存すればOK。
設定忘れてて上書き保存→ディレクトリ移動を行った後はAUTO。

***いずれの場合も、一度リンクのパスを貼り直せば問題なく復元します。一応。***

# 所感

しばらくMicrosoftは見たくないです...ブック間リンクを構成してる資源がどれだけあるのかが謎。多分とんでもない量があるんだよなぁ。
しかもその中でどれだけのファイルが絶対パスになってるのかを洗い出すとなると。
それはそれとして今後は社内ルール的なアレを定めたほうがいいのかなぁ。

+ ブック間のリンクを貼る場合は同ディレクトリ内に入れる
+ そもそもブック間リンクは貼らないようにする
+ ブック間リンクではなく、別ブックのデータをシートにコピーして作業する

とか。