Excel2010 VBA 「参照設定」のパス解決についての調査
■目的
Excel 2010 VBA 「参照設定」のパス解決について調査する
ExcelVBAでは参照設定でxlsm,xlam,xls,xlaを指定することができる。
これにより、参照元のExcelブックに記述したコードを、参照先で実行することが可能になる。

Excelが参照できるファイル
 ・xlsm:マクロ有効ブック
 ・xlam:アドイン
 ・xls:2003までのExcel
 ・xla:2003までのExcelAddin

今回は参照設定でExcelブックを指定した場合のパスの解決について調査する。

■実験環境
・Office 2010
・Windows 7



■参照設定の検索順番について
下記のように同じフォルダのブックを参照したとする。
参照先のシート
 c:\dev\vbatest\reftest\XlsTest.xls
参照元のシート
 c:\dev\vbatest\reftest\XlsRef.xls

XlsTest.xlsを開いた場合、参照元は次のようになる。

1 参照先と同じフォルダが一番最初に検索される。
例:
 c:\dev\vbatest\reftest\XlsRef.xls

以下、参照先と同じフォルダに存在しない場合に検索するフォルダは次の順になる。
2. アプリケーション ディレクトリ
例:
  C:\Program Files (x86)\Microsoft Office\Office14

3. カレントディレクトリ。これはCurDir関数で取得されるディレクトリで以下のようにマイドキュメントの場所になった。
例:
 C:\Users\[user]\Documents

4. システム ディレクトリ
例:
 C:\Windows

5. PATHで指定した場所

■参照元と参照先が同じ場合、参照先の情報は絶対パスでなく相対パスで記録されている。
下記のように同じフォルダのブックを参照したとする。
参照先のシート
 c:\dev\vbatest\reftest\XlsTest.xls
参照元のシート
 c:\dev\vbatest\reftest\XlsRef.xls

フォルダ c:\dev\vbatest\reftest を c:\xに移動したとする。
c:\x\XlsTest.xlsが参照しているファイルはc:\x\XlsRef.xls になる。

c:\dev\vbatest\reftest\XlsRef.xls は使用されない。

つまり、参照元と参照先が同じ場合、絶対パスでなく相対パスで参照元を検索している。


■参照元が別フォルダの場合、絶対パスを最初検索して、その後に相対パスで検索している。
下記のように別フォルダのブックを参照したとする。
参照先のシート
 c:\dev\vbatest\reftest\sub\XlsTestChild.xls
参照元のシート
 c:\dev\vbatest\reftest\XlsRef.xls

フォルダ c:\dev\vbatest\reftest を c:\xに移動したとする。
c:\x\sub\XlsTestChild.xlsが参照しているファイルはc:\dev\vbatest\reftest\XlsRef.xls になる。
つまり、絶対パスで検索を行っていると考えられる。

しかし、この時、c:\dev\vbatest\reftest\XlsRef.xlsを削除したとする。
この場合は c:\x\XlsRef.xls  が参照される。

この場合は、相対パスで検索をしている。

■参考
今回調べた内容は基本的にMicroSoftに記述されていない保障されていない動作である。
MicroSoftは以下の文章を提供している。

「Access で Visual Basic for Applications の参照を解決する方法 」

参照先のファイル ディレクトリ を検索することだけは確定だとは思われるが、他については保証されない。

以上。
[PR]
by mima_ita | 2012-09-26 00:51 | VBA
<< VBAUnitを使用した単体テスト 社内SNSを導入したときの話 >>



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ