古いOSで作成したショートカットは新しいOSでは使えない
VBAの話ではあまり話題になりませんが、WindowsのショートカットはOSによって作られるものが違うようで、例えばWindows7で作成したショートカットをWindows10で使おうと思っても使えない、なんてことがあります。
理由は詳しく調べていませんが、逆のWindows10のショートカットをWindows7で動かすことが出来ます。
バイナリエディタで比較したところ、結構違ったので何かが違うのでしょう。(てきとーですみません)
このように、古いOSで作成したショートカットを作り直すために、数が多い場合などは手で行うよりも自動化した方がラクなため、ショートカットが持つリンク先や引数の取得が必要になることがあります。
ここではVBAでショートカットのリンク先や引数の取得を行う方法を紹介します。
また、ショートカットの再作成についてもサンプルコードを紹介します。
参照設定
参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
これでWshShellクラスとWshShortcutクラスを利用できるようになります。
以下はWshShellクラスのインスタンス変数の作成サンプルです。書き方は2通りあります。どちらでもいいです。1つ目のように1行で書いてもいいですし、2つ目のように変数定義とSetを別に書いてもいいです。
Newを1行で書くか2行で書くかは「VBAでクラス変数の宣言とNewを1行で書いてよいか」をご参照ください。
1 |
Dim obj As New IWshRuntimeLibrary.WshShell |
1 2 |
Dim obj As IWshRuntimeLibrary.WshShell Set obj = New IWshRuntimeLibrary.WshShell |
ショートカットのリンク先や引数を取得するには
ショートカットの情報はWindows Script HostのWshShellクラスとWshShortcutクラスを利用すると取得できます。
なお、ショートカットの作成については「VBAで指定ファイルのショートカットを作成する」をご参照ください。
ショートカットの設定と取得はほとんどコードが同じです。
プロパティに値を代入する場合は「設定」で、プロパティから値を取得する場合が「取得」になります。
ショートカットのリンク先と引数を取得するサンプル
以下はショートカットのリンク先と引数を取得するサンプルコードです
ショートカットは以下になります。
リンク先はExcel自身で、引数として/rを指定してBook1.xlsxを読み取り専用で開くようにしています。
ちなみに/rを/xに変えると別のExcelアプリケーションを起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub GetShortcutInfoTest() Dim wsh As New IWshRuntimeLibrary.WshShell '// WshShell Dim sc As IWshRuntimeLibrary.WshShortcut '// WshShortcut Dim sPath '// ショートカットのパス sPath = "C:\test\EXCEL.EXE - ショートカット.lnk" '// ショートカットを取得 Set sc = wsh.CreateShortcut(sPath) Debug.Print sc.TargetPath '// リンク先 Debug.Print sc.Arguments '// 引数 End Sub |
実行結果
C:\Program Files\Microsoft Office\Office14\EXCEL.EXE
/r “C:\test\Book1.xlsx”
ショートカットの再作成
ショートカットのリンク先と引数の取得は上のサンプルコードの通りですが、さらに再作成を行う場合のコードは以下になります。
古いOSのショートカットを新しいOSのショートカットに作り直したい場合などに使います。
ちなみに、当たり前ではありますが、以下のマクロは新しいOS(Windows7と10であれば、Windows10)で動かさないと新しいOS用のショートカットにはなりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub RemakeShortcutTest() Dim wsh As New IWshRuntimeLibrary.WshShell '// WshShell Dim sc As IWshRuntimeLibrary.WshShortcut '// WshShortcut Dim sPath '// ショートカットのパス Dim sLink '// リンク先 Dim sArgs '// 引数 sPath = "C:\test\EXCEL.EXE - ショートカット.lnk" '// ショートカットを取得 Set sc = wsh.CreateShortcut(sPath) sLink = sc.TargetPath '// リンク先を取得 sArgs = sc.Arguments '// 引数を取得 '// ショートカットを一旦削除 Call Kill(sPath) '// ショートカットを作成 Set sc = wsh.CreateShortcut(sPath) sc.TargetPath = sLink '// リンク先を設定 sc.Arguments = sArgs '// 引数を設定 sc.Save '// ショートカットを保存 End Sub |