Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
シート内の相対リンクを絶対リンクへの置換について
投稿日時: 24/07/18 16:37:49
投稿者: えっくん

おせわになります。
サーバにある変更したいファイル【総括.xls】のA1セルに記載されているリンク先が【../個別/***】になっています。
【総括.xls】をデスクトップにコピーしてあるA1セルを選択してもリンク先が開けません。実際に開こうとしているリンク先は「2つ上位の個別フォルダ以降を開こうとしています。
 
この相対リンクで記載されたリンク先がたくさんあるので、【../個別/***】を【\アドレス1\アドレス2\個別/***】のように絶対リンクへ置換させたいのですが、excel内部の置換ではリンク先の文字列はできないようです。
 
マクロで来れた作業を行うやり方を教えて頂けないでしょうか。
リンク表示の【../個別/***】を【\アドレス1\アドレス2\個別/***】に置換したいです。
 
宜しくお願いします。
 

回答
投稿日時: 24/07/18 17:00:10
投稿者: WinArrow

リンク情報の設定場所を教えます。
 
Range("A1").Hyperlinks(1).Address
 
このプロパティを変更すれば、よいでしょう。

回答
投稿日時: 24/07/19 06:44:01
投稿者: simple

絶対参照で指定しても、相対参照に戻ってしまう。絶対参照のままにできないか?
という話が基本でしょうか。
 
(【参考】Wordでも同じような話があうようです。(最後にある、「 返信数(6) ∨ 」は記事が折りたたまれているので注意)
https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E5%85%B1%E6%9C%89%E3%83%8D%E3%83%83%E3%83%88/565b2944-98c8-4629-bd9a-1282487acfa0

私には、ネットワーク環境がなく、また詳しくもありませんが、絶対参照のままにするには次の二つの手段があるようです。
 
(1)ブックの「情報」から入って、「ハイパーリンクの基点」を"\"とする方法。
   手順は、下記を参照。
   https://mirai-digital.net/excel-hyperlink-not-open-file
 
(2)「オプション」設定の「詳細設定」‐「全般」‐「Webオプション」をクリックして
   「ファイル」の「保存する時にリンクを更新する」のチェックをオフにする
   (これがオンになっていると、デフォルトである「相対参照」になる、ということのようです)
 
上記を試して見て下さい。(なお、(1)かつ(2)の両方が必要ということではありません。)
 
■質問についての不明点
(1)
> 【../個別/***】になっています。
ということなら、【総括.xls】のあるサーバ上のフォルダの「親フォルダの下の個別フォルダ」ですから
現在のフォルダの兄弟フォルダじゃないですか?
>「2つ上位の個別フォルダ以降を開こうとしています。
というのが理解しかねます。
 
(2)
> 【総括.xls】をデスクトップにコピーしてあるA1セルを選択してもリンク先が開けません。
日本語の意味が通じにくいです。
 
(3)
> 絶対リンクへ置換させたいのですが、excel内部の置換ではリンク先の文字列はできないようです。
どのようなトライをされたのか、具体的に書いてください、
「excel内部の置換ではリンク先の文字列はできない」ようだとは、何を以てそう判断されたのでしょうか。

投稿日時: 24/07/19 12:39:49
投稿者: えっくん

皆さん コメントありがとうございます。説明が足りず申し訳ありません。
以下 例で説明します。
(1)下記のフォルダとファイルで構成されてます。
 C:\Folder1\Folder1.txt
 C:\Folder1\Folder2\Folder2.txt
 C:\Folder1\Folder3\Folder3.txt
 C:\Folder1\Folder2\Folder4\Folder4.txt
 C:\Folder1\Folder3\Folder5\Folder5.txt
(2)マイドキュメントフォルダにExcelファイル(a)を新規作成して
各セルに上記ファイルのリンク先を登録、保存しました。
リンク先への記載は下記の文字列を入力しています。
 C:\Folder1\Folder1.txt
 C:\Folder1\Folder2\Folder2.txt
 C:\Folder1\Folder3\Folder3.txt
 C:\Folder1\Folder2\Folder4\Folder4.txt
 C:\Folder1\Folder3\Folder5\Folder5.txt
(3)Excelファイル(a)をマイドキュメントから開いて各セルをクリックすると正しいテキストが開けます。
この時の各セルのリンク先の記載は以下の通りです。
..\..\..\Folder1\Folder1.txt
../../../Folder1/Folder2/Folder2.txt
../../../Folder1/Folder3/Folder3.txt
../../../Folder1/Folder2/Folder4/Folder4.txt
../../../Folder1/Folder3/Folder5/Folder5.txt
 
(4)Excelファイル(a)をCドライブ直下にコピーしてから開いて、各セルをクリックするとリンク先がないので
開けません。
この時の各セルのリンク先の記載は以下の通りです。
../../../Folder1/Folder1.txt
../../../Folder1/Folder2/Folder2.txt
../../../Folder1/Folder3/Folder3.txt
../../../Folder1/Folder2/Folder4/Folder4.txt
../../../Folder1/Folder3/Folder5/Folder5.txt
新規に作ったExcelファイル(a)がマイドキュメントからの相対フォルダでのリンクを登録しているのでCドライブ直下にコピーすると相対するファイルが無いため開けない状態です。
 
(5)Excelファイル(a)を作成後に「ハイパーリンクの基点」を"\"とすると、それ以降のリンク先が絶対参照になることは知っています。
(6)これまでマイドキュメント内で相対リンクで作られたExcelファイル(a)の各セルのリンク先を、絶対リンク先に変更したいのです。
Excelファイル(a)の各セルのリンク先を下記の記載に一括置換したいのです。
 C:\Folder1\Folder1.txt
 C:\Folder1\Folder2\Folder2.txt
 C:\Folder1\Folder3\Folder3.txt
 C:\Folder1\Folder2\Folder4\Folder4.txt
 C:\Folder1\Folder3\Folder5\Folder5.txt
 
>excel内部の置換ではリンク先の文字列はできないようです。
>どのようなトライをされたのか、具体的に書いてください、
Excelでの置換(Ctrl+F)を開いて、置換する文字列に【../../../】を、置換後の文字列に【C:\】としましたが、一致するデータが見つかりません と出てきてしまいます。
 
宜しくお願いします。
 

投稿日時: 24/07/19 12:55:49
投稿者: えっくん

追加で記載します。
 
(1)ブックの「情報」から入って、「ハイパーリンクの基点」を"\"とする方法。
これは前文で確認しました。マイドキュメントにあるExcelファイル(a)に"\"登録、ファイル保存、
ファイルを開いて
(あるセル)に「C:\Folder1\Folder3\Folder5\Folder5.txt」とリンク先を登録、保存後にCドライブ直下に
コピー、開いて(あるセル)をクリックするとFolder5.txtが開けます。リンク先の記載は
C:\Folder1\Folder3\Folder5\Folder5.txt となっています。
  
(2)「オプション」設定の「詳細設定」‐「全般」‐「Webオプション」をクリックして
   「ファイル」の「保存する時にリンクを更新する」のチェックをオフにする
マイドキュメントにあるExcelファイル(a)を開いて、「保存する時にリンクを更新する」のチェックを
オフにした後に保存、 にCドライブ直下にコピー、開いて各セルをクリックしてもリンク先がなく開けません。
セルのリンク先は「../../../Folde、、」のままでした。
 
この作業を行いたい理由ですが、Excelファイル(a)を別人に送って絶対参照してあるリンク先を開いてもらいたいためです。
リンク先が数十個あるので一括置換ができればと思っています。
 
以上 よろしくお願いいたします。

回答
投稿日時: 24/07/19 13:17:27
投稿者: simple

>Excelファイル(a)を別人に送って絶対参照してあるリンク先を開いてもらいたいためです。
別人と同じフォルダ構造なんですか?
(1)絶対参照で固定できているのかどうか
(2)変更前後のフォルダはどのようなものか
などが分からないので、回答のしようがないです。
いったんROMに回ります。

投稿日時: 24/07/19 15:31:31
投稿者: えっくん

simple さん コメントありがとうございます。
 
 
>Excelファイル(a)を別人に送って絶対参照してあるリンク先を開いてもらいたいためです。
別人と同じフォルダ構造なんですか?
(1)絶対参照で固定できているのかどうか
(2)変更前後のフォルダはどのようなものか
などが分からないので、回答のしようがないです。
 
今回の例はわかりやすくPC内でのExcelファイル(a)の保存先で記載していますが、実際は
最初の質問に書いたようにサーバ上のファイルでの運用です。
社内サーバの場所は私もファイル渡し先も同じように見えます。
 
渡し先でも私と同じExcelファイル(a)の保存先にファイルを保存してやれば、私と同じように
リンク先を見ることができるのですが、私のフォルダのアクセス権は私にしかありませんので、
渡し先では違うフォルダに置いたExcelファイル(a)を開くことになりますので、絶対参照リンク
の状態で渡し先に送りたい というのが実際の運用になります。
 

回答
投稿日時: 24/07/19 17:24:30
投稿者: QooApp

どのブックのどのシートを処理するか決めてFor文でループすればこれだけで完了しませんか?
設定したいリンクは「\\」から始まる絶対パスURLで定義してください。
間違っても「../」で始めないでください。
 

Option Explicit

Function setHyperlink(ws As Worksheet, set_range As Range, set_address As String, view_name As String)
    
    Call ws.Hyperlinks.Add(Anchor:=set_range, Address:=set_address, TextToDisplay:=view_name)
    
End Function

Sub main()
    
    Dim wb As Workbook
    Dim ws As Worksheet
    
    ' ここから [どのブックのどのワークシートか、の再定義から含めてループ処理] すれば絶対パスで保存できるはず
    
    ' ブックを指定
    Set wb = ThisWorkbook
    ' シートを指定
    Set ws = wb.Worksheets("Sheet1")
    
    ' ハイパーリンクの上書き関数をもとに上書き
    Call setHyperlink(ws, ws.Range("A1"), "\\会社鯖パス\絶対パス\ファイル名", "表示したいファイル名")
    
    ' 保存
    wb.Save
    
    ' ここまで来たら次のブックのループ
    
End Sub

回答
投稿日時: 24/07/19 20:13:23
投稿者: MMYS

当方の環境では、リンク先を「フルパス」で設定すると、相対参照にならず、絶対参照でで設定されますが。(もちろんネットワーク指定しても)
 
 
下記は、指定パスへの置き換え例です。当方の環境では、これで動作します。
※一括で設定する場合はコメントアウトを参照願います。
 

Option Explicit

    Dim fso As Object

Sub main()
    Dim rng As Range
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Const absolute = "\\サーバ\パス"
    Set rng = Range("A1")

    ReplaceHyperlink rng, absolute
    
   'For Each rng In Selection
   '    ReplaceHyperlink rng, absolute
   'Next
    
End Sub

Private Sub ReplaceHyperlink(targetCell As Range, absolute As String)
    Dim fileName As String
    Dim fullName As String
    
    If targetCell.Hyperlinks.Count <= 0 Then Exit Sub
    
    fileName = fso.GetFileName(targetCell.Hyperlinks(1).Address)
    fullName = absolute & "\" & fileName
    With targetCell.Hyperlinks
        .Delete
        .Add targetCell, fullName
    End With
End Sub

投稿日時: 24/07/20 12:25:52
投稿者: えっくん

皆さんへ
情報ありがとうございます。
 
 
MMYS さんが確認して頂いた下記情報 がExcelファイル(a)と異なっているのでこちらで再確認しました。
>当方の環境では、リンク先を「フルパス」で設定すると、相対参照にならず、絶対参照でで設定されますが。(もちろんネットワーク指定しても)
 
新規Excelシート(絶対参照\指定なし)で同一サーバA内に(リンク先一覧Excelファイル)を作ってサーバA内のファイルのリンクシートを作りました。
MMYS さんと同じように、
セルにリンク先を(\\サーバA\、、)の形式で書込み、保存、開いてリンク情報法を見ても(\\サーバA\、、)と表記されています。
 
これまで私が説明していたExcelファイル(a)では、
セルにリンク先を(\\サーバA\、、)の形式で書込み、保存、開いてリンク情報法を見ると(../フォルダ/)と表記されています。
何かがおかしいようです。先人が何年も前から運良い鵜していたファイルでどこかに設定があるのかもしれません。
 
ファイルの情報を調べ直してみます。今回はこれでいったん終了とさせてください。
皆さんのお時間を取らせてしまって大変申し訳ありませんでした。