- ベストアンサー
エクセルVBAでショートカットリンクの変更方法
- エクセルVBAで既存のショートカットファイル(~.lnk)のリンク先を変更する方法を教えてください。
- 既存のショートカットのリンク先を調べ、条件に一致した場合、そのリンク先を変更するためのVBAの作成方法を知りたいです。
- Qドライブのネットワーク割り当てやファイルの指定を変更するため、エクセルVBAでショートカットのリンク先を自動変更する方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 昨日から、ネットワークを組もうと格闘しているのですが、もともと、ネットワークを組むための前のパソコンが調子が悪くて、エラーを出した挙句に、起動できなくなって、今回の実験環境が整いません。 >Windows2000Pro Office2000の環境です。 >これを解決する目処はたっていませんが、何とかしたいと考えております。 こういう時は、可能性のあることは、全部試してみるのがよいし、場合によっては、Wsh からやっても良いと思います。ともかく、こちらでは環境による違いは、試すことが出来ません。 当面、こういう時には、一度、参照設定で事前バインディングして試してみるのが良いかもしれませんね。パフォーマンスが変わります。(ダメ元ですが) Wscript.Shell →Windows Script Host Object Model Dim WSHShell As WSHShell '←ちょっとまずいですね(^^; 'Set WSHShell = CreateObject("Wscript.Shell") ↓ Set WSHShell = New WSHShell でも、あまりあれこれ考えるよりも、始めからダメだと決めて進めたほうが簡単だったりしますね。それは、Dir で取ったものに、情報を確保してから、、*.lnk を、*.bak でRename するか、Kill で削除して、新たに、その情報から、*.lnk のショートカットを作ればよいのですね。やっていることは同じですから。それで、出来ないとなれば、また、話は別です。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 ほっとしました。;; そういう私は、今回、ネットワーク化はついに間に合わないというのか、壊れたパソコンには、ネットワーク化は、うまく行かないようです。こちらは欠陥状態のままで、なんとか最後まで行き着けたことは、私としても、うれしい限りです。 今回、私自身、チェック用のマクロも出来たし、ふだんは、考えないようなことに対して、勉強させていただきました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 しばらく検証してみました。 >フォルダのショートカットを修正すると、どういう訳か属性が変わってしまうようです。 >変更後のショートカットをクリックすると、フォルダが開かずファイルを開くプログラムの選>択が出てきてしまいます。 1)は、製作時のミスでしたが、2) のほうは、MSのサポートを見ると、共有フォルダのショートカットに対しては、ずいぶん作り方が違いようですから、それに関してはなんともいえないのですが、一般フォルダのショートカットとは違うのかもしれません。 ショートカットは、Windows の配下で、クリックすると、実際にそれがあるのか探しています。 だから、置換するときには、そのリンク先が存在していることと、置換した後に、正しく変わっているか、以下のマクロで、一度プロパティで調べていただくぐらいしか、今のところ言えません。 基本的には、TargetPath 内の文字列を置換すれば、稼動するのではないかとは思っていますが、ただ、もしかしたら、一旦、共有フォルダが利用できる状態を確保しておいてから、置換しないといけないかもしれません。そうすると、少し内容の趣も違ってきてしまいます。 こちらは、スタンドアロンで、まったく必要もないので、共有フォルダは、今のところ作っていません。 そのご様子ですと、ショートカットは、フォルダという認識をしていませんね。とりあえず、必要な情報を取るマクロを置いておきます。 以下のフルネーム(fullname)の「ショートカット名」だけは、読み取り専用です。 テスト用 ------------------------------------------------------ Sub ShowShortCutProperties() 'ショートカット検査用マクロ Dim ful, tp, dsp, arg, rel, wd, hk Dim objFSO As Object 'FileSystemObject Dim objFile As Object 'File Dim objFolder As Object 'Folder Dim WSHShell As Object Dim msg As String Dim fn As String Dim bln As Boolean Dim rdy As String fn = "xxxx.lnk" 'ファイル名(*.lnk) Set objFSO = CreateObject("Scripting.FileSystemObject") If Dir(fn) = "" Then MsgBox fn & " が見つかりません", 64: Exit Sub End If Set objFile = objFSO.GetFile(fn) With objFile If InStr(1, .Type, "ショートカット", vbTextCompare) = 0 Then MsgBox "ショートカットファイルではありません。", 64: Exit Sub End If End With Set WSHShell = CreateObject("Wscript.Shell") With WSHShell.CreateShortcut(fn) ful = .FullName tp = .TargetPath dsp = .Description arg = .Arguments ' rel = .RelativePath wd = .WorkingDirectory hk = .Hotkey End With msg = "ショートカット名: " & ful & vbCrLf & _ "リンク先: " & tp & vbCrLf & _ "コメント: " & dsp & vbCrLf & _ "引数: " & arg & vbCrLf & _ "RelativePath: " & rel & vbCrLf & _ "作業用フォルダ: " & wd & vbCrLf & _ "ショートカットキー: " & hk & vbCrLf Set objFolder = objFSO.GetFolder(tp) bln = objFile.Drive.IsReady rdy = IIf(bln, "リンク先利用可", "リンク先利用不可") msg = msg & vbCrLf & rdy MsgBox msg Set objFile = Nothing Set objFolder = Nothing Set objFSO = Nothing Set WSHShell = Nothing End Sub
補足
回答ありがとうございます。 どうもネットワークフォルダが原因ではないようです。 WindowsXP Office2003の環境ではフォルダのショートカットは問題なく変更することができました。 問題が起きているのはWindows2000Pro Office2000の環境です。 恐らくWindowsの違い(XP⇔2000)が原因であると思われます。 これを解決する目処はたっていませんが、何とかしたいと考えております。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 ちょっと考えてみました。一気にしないで、ステップマクロなどで試してみてください。 ただ、ある程度のファイルの移動は検索するので、自動的にリンク先がつなぎ変わるようですね。 Sub MacroTest1() Dim WSHShell As Object Dim myPath As String Dim fn As String Dim i As Integer Dim flg As Boolean Dim p(1) As String myPath = **************** & "\" 'リンクのあるパス Set WSHShell = CreateObject("Wscript.Shell") fn = Dir(myPath & "*.lnk") Do While fn <> "" With WSHShell.CreateShortcut(fn) p(0) = .TargetPath p(1) = .WorkingDirectory For i = 0 To 1 '作業フォルダのために、末尾は \ を入れないほうが良いようです。 If InStr(p(i), "\\Domain01\Kanto\Tokyo") > 0 Then p(i) = Replace(p(i), "\\Domain01\Kanto\Tokyo", "\\Domain01\Kanto") flg = True ElseIf InStr(p(i), "Q:\Kaihatsu1") > 0 Then p(i) = Replace(p(i), "Q:\Kaihatsu1", "Q:\Tokyo\Kaihatsu1") flg = True End If Next i If flg Then .TargetPath = p(0) .WorkingDirectory = p(1) .Save Erase p() End If flg = False fn = Dir() End With Loop Set WSHShell = Nothing End Sub
補足
回答ありがとうございます。 実行してみて2つ問題がありました。 1つはDir関数の戻り値がファイル名のみなので、With WSHShell.CreateShortcut(fn)を実行する時にパスを追加しなければならなかったこと。これは修正いたしました。 2つめはファイルのショートカットはOKでしたが、フォルダのショートカットがNGでした。 フォルダのショートカットを修正すると、どういう訳か属性が変わってしまうようです。 変更後のショートカットをクリックすると、フォルダが開かずファイルを開くプログラムの選択が出てきてしまいます。 色々調べましたが皆目検討がつきません。 よろしくお願い申し上げます。
- KenKen_SP
- ベストアンサー率62% (785/1258)
恐らくですが。。。Lnk ファイルのバイナリを読み込んで自力で 解析するしかないと思います。
お礼
回答ありがとうございます。
お礼
お礼が遅くなって申し訳ありません。 今日原因が分かりました。 Windowsやエクセルのバージョン、ネットワークドライブかどうか、全く関係ありませんでした。 >だから、置換するときには、そのリンク先が存在していることと、 >置換した後に、正しく変わっているか、以下のマクロで、 >一度プロパティで調べていただくぐらいしか、今のところ言えません。 原因はこれでした。 ネットワークドライブ割当てを旧のままでショートカットを変更していました。 ファイルのショートカットはリンクの存在の有無を確認していないようで上手く変更できましたが、フォルダの方はリンクの存在を確認しているようですね。 ネットワークドライブ割当てを変更した後、ショートカットの変更をしたら全てOKになりました。 ありがとうございました。