• ベストアンサー

エクセルで他のファイルへのリンクが切れてしまう

エクセル2016で表の品名一覧表の品名が入ったセルに別フォルダに入っている当該品の説明書(pdf)にリンクを張って品名セルのクリックで当該品のpdfファイルが参照できるようにしているのですが、かなりの頻度、確率でリンクが切れてしまいます。 NETで調べてみたら原因はエクセルのバグ、との情報もあるのですが何とか回避する方法は無いのでしょうか? また、この現象を回避するリンクの張り方があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.3

◇コンテキストメニューとは マウスを右クリックしたときに表示されるメニューのことです。 セルを右クリックすることで表示されるメニューに 利用者が使うオリジナルなメニューをここに追加しよう ということです。 ◇下準備 (1)以下のコードを標準モジュールに配置 Option Explicit '//-------------------------------------------------------- '// コンテキストメニュー追加/削除 '//-------------------------------------------------------- Sub AddMenu() '//---------追加  Dim Newb  Set Newb = Application.CommandBars("Cell").Controls.Add(Before:=1)  With Newb   .Caption = "PDFを開く"   .OnAction = "OpenPdf"   .BeginGroup = False  End With End Sub Sub DelMenu()  '//---------削除  On Error Resume Next  Application.CommandBars("Cell").Controls("PDFを開く").Delete  Application.CommandBars("Cell").Controls("PDFを開く").Delete End Sub '//-------------------------------------------------------- '// PDFを開く '//-------------------------------------------------------- Sub OpenPdf()  CreateObject("Shell.Application").ShellExecute ActiveCell.Value End Sub (2)以下のコードをThisWorkbookオブジェクトに配置 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean)  DelMenu End Sub Private Sub Workbook_Open()  AddMenu End Sub (3)課題ブックをいったん保存して開きなおす ◇使い方 PDFファイルのフルパスの埋まったセルを右クリックし コンテキストメニューから "PDFを開く"をクリックします。 先に示した添付画像の要領です。 ◇補足 開くpdfファイルの保存先がある特定のフォルダー、 あるいはネットワーク上のファイルサーバーの ある特定の共有フォルダーに限定できるのであれば セルに埋める文字列を単なるファイル名とし、 パス部分をソースコードの中に埋め込んでしまう対応も考えられます。

akira0723
質問者

お礼

あれから昼休みもずっと色々調べたのですが、エクセルのリンク切れに関する情報は「補足」の1、2の内容ばかりでしたが、1つだけ「勝手にリンクが変わってしまう」という当方のケースと類似の情報がありました。 昔、恐らくHohoPapaさんに教わった下記のVBAで新ためてリンク先を確認した処、やはりパスが勝手に変わってしまうケースが見つかりました。 例えば、リンクが生きているパスは\\サーバから始まる¥が4~6個付くパスなのですが,リンクが切れているパスは同じサーバ内のパスなのにC:から始まる長いローカルパスが先頭に付いたり、不思議なのはパスの先頭に¥が無い3つ目のフォルダの名前から始まるパスに書き換わっていました。 目的のpdfは全て \\XXXから始まる全社サーバにある 各部署別のフォルダ内のどこかの階層のフォルダにあるpdfファイルにリンクを張ったので フルパスの先頭は全て\\XXXとなっているはず。 現在1458個のファイル中78個(5%)がパスが書き換わってリンクが切れていました。 そのうちのいくつかは対処1、2で改善される可能性はありますが、やはりご回答のVBAで探しに行く方法に変えないと再発する可能性が高そうなのでVBA法にコツコツ改定していきます。 これまでは勝手にフォルダの名前が変えられたり(他部署のフォルダなので仕方なし)、ファイルを移動されたりしていたので半年毎にメンテしていたのですが、今年初めに各部署長にお願いしてフォルダの変更を禁止にしたのに相変わらずリンクが切れることに気付きました。 ============================== ところで下記のリンク切れを探すコードは恐らくHohopPapaさん作だと思うのですが、このようなリンクのメンテ時に有効に使用させていただいています。 自分では出来ないことが色々出来るようになってます。感謝! 感謝!! 感謝!!! Option Explicit '// リンク状況確認 Sub LinkCheck() Dim Rowcnt As Long Dim wklink As String With ThisWorkbook.Sheets(1) Rowcnt = 2 Do If .Cells(Rowcnt, 4).Value = "" Then Exit Do Worksheets(2).Cells(Rowcnt, 1) = .Cells(Rowcnt, 4).Value Worksheets(2).Cells(Rowcnt, 2) = .Cells(Rowcnt, 4).Address If .Cells(Rowcnt, 4).Hyperlinks.Count > 0 Then wklink = .Cells(Rowcnt, 4).Hyperlinks(1).Address Worksheets(2).Cells(Rowcnt, 4) = wklink If FileExists(wklink) = True Then Worksheets(2).Cells(Rowcnt, 3) = "ファイルあり" Else Worksheets(2).Cells(Rowcnt, 3) = "ファイル無し" End If Else Worksheets(2).Cells(Rowcnt, 3) = "リンク未設定" End If Rowcnt = Rowcnt + 1 Loop End With End Sub '// ファイル有無判定関数 Function FileExists(ChkFile As String) As Boolean FileExists = True On Error GoTo ErrorHandler ' エラー処理ルーチンを定義 FileDateTime (ChkFile) On Error GoTo 0 ' エラーのトラップを無効にします。 Exit Function ' エラー処理ルーチンが実行されないように Sub を終了 ErrorHandler: ' エラー処理ルーチン FileExists = False Resume Next End Function

akira0723
質問者

補足

いつもお世話になっております。 朝一で検証して一発で期待通りに動きました。 pdfが保存されているフォルダはサーバ上の色んな場所(部署別フォルダ)に点在しています。 NETではリンク切れの対処法として、 1.ファイルオプションのwebオプションで「保存時にリンクを更新する」のチェックを外す、というのがあってこれを試して駄目だったので同時に記載のあった「バグ説」を信用したのですが、 今回改めてググってみたら 2.ファイル情報のプロパティの「ハイパーリンクの基点」に¥を入れる、というのが見つかりました。(絶対パス化?) そこで改めて対処法1+2のBookと、ご回答のフルパス指定でVBAで開く、の2つの方法を混在させてみて経過観察してみることにします。最初は各100個程度で様子を見ます。 (現在のリンクはカーソルを当てた時に表示される窓では絶対パスになっているのですが) ご回答のコードが期待通りに動くことが確認できたので一旦締め切らせていただきます。 結果報告は次の機会にします??????(今後とも宜しくお願いします) ===================================================== 前回の関数をVBAで作るとか、リンクをメニュにしてしまうとか、当方が思いつくこと(以上)は何でもできる、という認識になってきました。 但し、私には3行マクロも書けないのが悲しい現実・・・・ 教えていただいたコードは将来引き継ぐときに備えて全て共通フォルダの「マクロTech」フォルダに検証用Bookのシートに解説付きで保存してあります。<感謝!!>

その他の回答 (2)

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

#1のHohoPapaです。補足します。 #1の仮説が正しく、 提示したインターフェースで行けそうなら、 VBAのコードを紹介します。ということです。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.1

リンクの張り方に複数の方法があるわけではないので >この現象を回避するリンクの張り方 というのはないと思います。 少なくとも私は思いつきません。 >原因はエクセルのバグ、との情報 が信頼できる情報なら、MSが直すのを待つしかありませんが 私には経験がありません。 代替え案とすれば、 akira0723さんはVBAを扱えるわけですから リンクを使うのではなく、 VBAで代用することを思いつきます。 セルの値として、 例えば C:\MyData\2019確定申告\申告書(第一表).pdf と埋まっており、 同ファイルにリンクが張ってあるという理解でいいですか? ならば、その埋まっている文字列をVBAで拾い、 VBAで、 C:\MyData\2019確定申告\申告書(第一表).pdf を開くという案が考えられますがいかがでしょうか。 さらに、 この開く指示をコンテキストメニューから行う というのはいかがでしょうか? イメージとすると、添付画像のイメージです。

akira0723
質問者

補足

ご回答の内容が良く理解できないので確認させてください。 例えば現在製品リスト(一覧表)の製品名が入力されたセルに右クリックで出てくるメニューの「リンク」という項目からサーバの各部署別のフォルダをたどってpdfファイルにリンクを張っています。 これをセルに品名ではなくファイルのパスを入れるとVBAでpdfファイルが開ける、ということでしょうか? もしこういうことならこの方法で解決できると思います。 pdfの品名をセルに入力してフォルダをたどってリンクを張る作業をしているので、品名セルの隣にファイルのパスをコピペすればよいと思いますので。 日々各部署の特定のフォルダに追加されるpdfを月末に確認して新規に保存されたpdfをリストに追加する作業をしていりる状況です。 追加する尻から切れていく感じで何とかせねば、状態ですので宜しくお願いします。 コンテキストメニューはよく分かりませんがどんな方法でもpdfファイルが開ければ十分です。

関連するQ&A

専門家に質問してみよう