ロゴ(青) Excel/VBA Tips ロゴ(緑)

Tips14: Addin関数式のリンクエラー!

  (関連記事 : Tips21: Excel のリンクの管理と格納

  私のkt関数アドインを使っている人からも偶に質問が来ますが、
        ユーザーや他人の作ったアドイン(フリーソフト等)で、そのアドイン
        関数をセルに書き込んで利用しているブックを『他のPC 』で開くと
        リンクエラーが出て来る。アドイン関数式を入れているセルを見ると
        アドインブックの【フルパス】が付いている。相手先のPCでも同等の
        フォルダ内にちゃんとアドインブックがあるのに何故?。

というトラブルの話題が時々見られます(私のkt関数アドインに限った事ではありません)。

  このトラブルの原因は、そのアドインブックの保存先フォルダにあります。

  その前に、同じアドインでも、エクセルに付属して提供されているMS製の『分析ツール』
アドイン(WORKDAY/NETWORKDAYS関数などを使う時に必要なアドインです)の場合に
は、AというPCで作った「アドイン関数を使ったブック」を別のBというPCで開いても何も問
題なく開けますよね。リンクエラーになったり、式がフルパスになどなりませんね。

  実は、ここに、このトラブルの解決の糸口があります。別に、分析ツールアドインがユーザー
に公開されていない秘密のテクニックを使ってエラーを回避している訳ではありません。只、
アドインブックを入れているフォルダが違うだけです。


  アドインブックの保存先フォルダは実は2つ存在します。ここで「アドインの保存先」という
のは、『そのフォルダに入れておけば、自動的に [ツール→アドイン] ダイアログで表示され
る』という場所のことです。

1.ユーザー アドイン フォルダ
  ひとつは、エクセルの「名前を付けて保存」ダイアログで、ファイルの種類を
      【 Microsoft Excel アドイン ( *.xla ) 】
に切り換えた時に自動的に既定の保存先として表示される
      [ C:\Windows\Application Data\Microsoft\AddIns ]    Win98SE/Excel2000の場合のパス)
というフォルダです。
      (補) OSよってパスが異なります。また、WinXP などではユーザーアカウント名が間に入ります。
                  [Windows95/98/Me ] C:\Windows\Application Data\Microsoft\Addins
                  [Windows NT4 ]       C:\Windows\Profile\ユーザーアカウント名\Application Data\Microsoft\Addins
                  [Windows 2000/XP ] C:\Documents and Settings\ユーザーアカウント名\Application Data\Microsoft\Addins
                  [Windows Vista/7/8 ]   C:\Users\ユーザーアカウント名\AppData\Roaming\Microsoft\Addins
                  [ MsgBox  Application.UserLibraryPath ] というマクロを実行すればパスが判ります。


アドイン保存の際に【既定】で表示されるものですから、こちらにそのまま保存する人が多いでしょう。
しかし、上記のトラブルは、こちらのフォルダに保存した場合におきます。

2. Office アプリケーション アドイン フォルダ
  もうひとつは、【分析ツールアドイン】が保存されている
        [ C:\Program Files\Microsoft Office\Office\Library ]    Win98SE/Excel2000の場合のパス)
というフォルダです。
        (補) Office\Library の部分は、Excel のバージョンによって異なります。
                  Excel2000 : Office\Library , Excel2002 : Office10\Library , Excel2003 : Office11\Library 
                  Excel2007 : Office12\Library , Excel2010 : Office14\Library , Excel2013 : Office15\Library

             (2015/4/25 追記)
              Excel2013 では、インストール方法によって パス が異なりますので注意が必要です。
                  C:\Program Files\Microsoft Office\Office15\Library (Windows インストーラーでインストール)
                  C:\Program Files\Microsoft Office 15\Root\Office15\Library  (プリインストール版 , Click-To-Run)
              Windows(64bit) の場合には、Excel が 32bit/64bit の違いでも パス が異なりますので注意が必要です。
                  32bit 版 Excel : C:\Program Files (x86)\....  ,  64bit 版 Excel : C:\Program Files\....  

                  [ MsgBox  Application.LibraryPath ] というマクロ を実行すれば、そのPCでのパスが判ります。


こちらのフォルダに保存しておけばトラブルは起きません

 このフォルダの位置は、エクセル本体 [ Excel.exe ] がインストールされているフォルダ(即ち、
[ C:\Program Files\Microsoft Office\Office ] )の直下になります。この位置関係は、どのバー
ジョンのOS/Excel でも変わりません。つまり、エクセル自身から見た【相対パス】が常に一定
あるフォルダだという事が、どのPCででも正しく参照できる理由ではないかと思います。
(2015/4/25 追記 : 「Excel.exe の "直下" だから」 という理由ではないようです。詳しくは下記の解説をお読み下さい。)

  逆に、先の問題のあるフォルダでは、一端、Cドライブまで遡ってから、Windows フォルダ以下
のフォルダへと降りていきます。この間には、OSによってユーザーアカウウントが有ったり無かっ
たり、当然アカウント名が異なったりと、PCによって相対パスの見え方が全く違ってきますので
参照に失敗するという事だと思います。


(2015/4/25 追記)
  Office 2007 以降では、ワークブックがXML形式になりましたので、NotePad もしくは XML用
エディタを使って、ワークブックの中身を簡単に調べる事ができます(拡張子(xlsx , xlsm)を zip
に変更して解凍します。再び、xlsx/xlsm に変えればワークブックに戻ります)。

  解凍して出来たフォルダの中身は下記のような構成になっており、externalLink1.xml.rels
外部参照のパス情報が記録されています。


(1) Office アプリケーション アドイン フォルダの場合
  アドインブックが[ C:\Program Files\...\Library ]に格納されている場合には下記のように記録されます。
    <Relationships>
      <Relationship
        Id="rId1"
        Type="http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlLibrary"
        Target="kt関数Addin.xla"
        TargetMode="External"/>
    </Relationships>

  ファイル名のみが記録され(パス無し)、リンク先は『(そのPCの) Library フォルダとなっています。

  これにより、このワークブックを別フォルダ/別ユーザー/別PC/別OS/ネットワークフォルダへ移動させ
  ても、問題なくアドイン関数を参照することができます(当然、相手先でも Library フォルダにアドインが
  格納されている事が前提です)


(2) ユーザー アドイン フォルダの場合
    アドインブックが[ C:\...\Microsoft\AddIns ]に格納されている場合には下記のように記録されます。
    (下記は Windows XP の例、●●● はユーザーネーム)

    (a) ワークブックを ユーザーアドインフォルダ と同じ Cドライブ に保存している場合
       <Relationships>
          <Relationship
            Id="rId1"
            Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath"
            Target="/Documents and Settings/●●●/Application Data/Microsoft/AddIns/kt関数Addin.xla"
            TargetMode="External"/>
        </Relationships>

       通常の外部参照として、リンク先が ドライブを除いたルートからのフルパス で記録されます。

    (b) ワークブックを ユーザーアドインフォルダ とは別の Dドライブ等に保存している場合
        <Relationships>
          <Relationship
            Id="rId1"
            Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath"
            Target="file:///C:\Documents and Settings\●●●\Application Data\Microsoft\AddIns\kt関数Addin.xla"
            TargetMode="External"/>
        </Relationships>

       リンク先が file://プロトコル形式 で ドライブが付いたルートからのフルパスで記録されます。

  〜 このワークブックを 別フォルダ/ネットワークフォルダ へ移動させた場合 〜
    (a)  リンク情報にドライブ名が無いので、『移動先のドライブ名+リンク情報のパス』として認識
         されますが、その位置に Addins フォルダ(アドインブック) が無いのでリンクエラーとなります

    (b)  リンク情報が 『ドライブ名からのフルパス』となっていますので、移動先からでも、常に正しく
         Addins フォルダ(アドインブック)を参照できる為、リンクエラーにはなりません
         尚、ワークブックを「アドインフォルダと同じCドライブ」へ移動させると、リンク情報が (a) の
         形式へ書き換えられますので、それ以降は (a) となります。

  〜 このワークブックを 別PC/別ユーザー/別OS へ移動させた場合 〜
    通常は ユーザーアドインフォルダの 『パス または ユーザー名』が移動先では異なります。
          [Windows95/98/Me ]   C:\Windows\Application Data\Microsoft\Addins
          [Windows NT4 ]         C:\Windows\Profile\ユーザーアカウント\Application Data\Microsoft\Addins
          [Windows 2000/XP ]   C:\Documents and Settings\ユーザーアカウント\Application Data\Microsoft\Addins
          [Windows Vista/7/8 ]   C:\Users\ユーザーアカウント\AppData\Roaming\Microsoft\Addins

   その為、リンク情報のパス位置に Addins フォルダ(アドインブック)はありませんので、リンクエラー
   となります(例え、移動先のPC/ユーザー/OSのユーザーアドインフォルダに アドインブック が
   格納されていたとしても、参照するのはリンク情報に記載されているパスです)。



ワークブックの移動に伴って行われるリンクパスの自動変更に関しては下記のKBを閲覧して下さい。
      KB328440 : Excel のリンクの管理と格納について
      https://support.microsoft.com/ja-jp/kb/328440
        (補足)
        この文書では、日本語としては逆に思える表現がされていますので、読み取る際には注意が必要です。
        ・ 「注 : パスを上に移動すると、ルート ドライブまたは共有から離れたフォルダを
                  参照します。パスを下に移動すると、ルート ドライブまたは共有に近くなります。」
              パスを上へ移動 : ネストが深くなる方向 ( C:\ ⇒ C:\ABC ⇒ C:\ABC\XYZ )
              パスを下へ移動 : ネストが浅くなる方向 ( C:\ABC\XYZ ⇒ C:\ABC ⇒ C:\ )

        ・ 「リンク先のファイル と リンク元のデータ ファイル」
          アドイン利用のケースでは下記の意味になります。
              リンク先 : アドイン関数を利用するユーザーブック
              リンク元 : アドインブック

        (参考:英語版) KB328440 : Description of link management and storage in Excel
                            https://support.microsoft.com/en-us/kb/328440



〜 Windows Vista / 7 / 8 の場合の注意事項 〜  (2008/12/28)
  Vista ではUAC(ユーザーアカウント制御)という機能が追加されました。この制御下
  では、[管理者ユーザー]以外が [ C:\Program Files\ ]配下のフォルダ/ファイルを
  操作する事が禁じられている為、ここで紹介する方法が利用できないようです。
  UACを無効にすれば、この方法も行なう事が出来るようですが、
    ・ UACを無効化する危険性
    ・ その後、再びUACを有効にした場合の弊害の有無が、アドインの処理内容
      に左右されて一概に判断できない
  という理由により、私からは「UACの無効化」を薦める事はできません。実施する場合
  は各自の判断において行なって下さい(現在のところ、私はVista環境を持っていな
  い為、これらの事を実際に確認する事が出来ていません)。

  参考 : @IT Tips / Windowsのユーザー・アカウント制御(UAC)を一時的に無効にする




では、次に、既に発生しているエラーを取り除く方法です。

要は2番目のフォルダにアドインブックを移せば良いのですが、既にアドイン関数を使っている
ブックでは1番目のフォルダへのリンクが組み込まれていますので、これを解除&切り換える必要
があります。以下の手順に従って作業を行なってください。
  (1)  アドイン利用ブックを作成したPCで、新規ブックを開き、アドインブックのアドイン登録を
        一端解除します(チェックを外す)。
  (2)  1番目のフォルダに保存されているアドインブックをデスクトップや他のフォルダに一時
        退避させる(どのフォルダでも構いません)。
  (3)  再び新規ブックを開き、再度[ツール→アドイン]ダイアログを出してリストから当該アドイ
        ンを選択します。そうすると「削除確認」が出ますので、それに応答してリストから削除し
        ます。
  (4)  退避しておいたアドインブックを2番目のフォルダに移してから、新規ブックを開き、再
        度[ツール→アドイン]ダイアログを出してアドイン登録します(チェックを入れる)。
  (5)  アドインを使っているブックを開きます。リンクエラーのダイアログがアドイン関数を使っ
        ている分だけ繰り返し表示されますが、気にせずにエラーが出なくなるまで応答してく
        ださい。その後、「編集/リンクの変更」を行なうと、当初アドインを保存していた「1番目
        のフォルダ」がリストに表示されていますので、これを現在アドインを保存している「2番
        目のフォルダ」に変更します。これによって全ての関数式のパスが修正されますので、
        そのまま保存してください。尚、この (5) の作業はブックを作成したPCでのみ行なえば
        充分です。他のPCでも行なう必要はありません(これで修正されたブックを他のPCで
        開く訳ですから)。
  (6)  他のPCでも同様にアドインのフォルダを移し変えてください(1〜4の作業)。そうすれば、
        ブック作成PCから持ってきたアドイン利用ブックを開いてもエラーはでなくなります。





 Home   Back Page   Next Page

ロゴ(ゴールド)   ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2005 Allrights Reserved.