ハイパーリンクをクリックすると編集可能状態で開いてしまう
Excelブックが増えてくると管理が結構大変になってきます。フォルダ分けをしたのはいいものの、「あのブックどこだっけ?」とエクスプローラを開いて探し回ったことは誰でも経験があることでしょう。
そのような経験を経て、すぐ開けるようにとショートカットを作ったりリンク集を作ったりして効率化を図っていると思います。私も同様でリンク集のようなブックを作って管理しています。リンク集は便利でいいのですが、1つ不便な点があります。それは、ハイパーリンクでブックを開くと編集可能状態で開いてしまうことです。
個人的なブックだけであればあまり問題はないのですが、仕事で使うファイルはファイルサーバに置いてあることが多く、不特定多数の人が編集や参照するようなブックも少なくありません。このようなファイルを参照するだけで編集するつもりがなくてもハイパーリンクの場合は編集可能な状態で開いてしまうため、間違えて上書き保存してしまうミスや本当に編集したい人が編集可能状態で開けずに作業の邪魔をすることにもつながります。
このような場合は対象のブックを読み取り専用で開くことで他の人の編集を邪魔をせずに済みます。
ブックを読み取り専用で開く方法
読み取り専用で開くには主に2つの方法があります。
1つは対象のブックを保存するときにオプション設定で「読み取り専用を推奨する」にチェックを付ける方法で、次から開くときに読み取り専用で開くかどうかを確認するダイアログが表示されるようになります。ただこの方法は各ブックで読み取り専用の推奨の設定をしなければならず、関係者全員にお願いしてもなかなか周知徹底は難しいでしょう。
もう1つはEXCEL.EXEに引数「/r」を付けて起動する方法で、Excel.exeのバージョンによって多少フォルダの場所は変わりますが「”C:\Program Files\Microsoft Office\Office14\EXCEL.EXE” /r “C:\aaa\a.xlsx”」のように実行すると読み取り専用で開きます。この方法は先の「読み取り専用を推奨する」の方法とは異なり、ブックに特別な設定をする必要がありません。
なお、VBAを使えばEXCEL.EXEの場所はOSやOfficeのバージョンに関わらずApplication.Pathを使って特定することが可能です。詳細は「VBAでExcel.exeのフォルダやフルパスを取得する」をご参照ください。
以下に紹介する読み取り専用で開くコードは2つ目の「/r」スイッチでの起動方法をShell関数で呼び出して読み取り専用で開くことを実現しています。
ちなみに、「”C:\Program Files\Microsoft Office\Office14\EXCEL.EXE”」のショートカットを「C:\Users\PCNAME\AppData\Roaming\Microsoft\Windows\SendTo\」に入れて、作ったショートカットのプロパティのリンク先「”C:\Program Files\Microsoft Office\Office14\EXCEL.EXE” /r」を設定すると、エクスプローラでブックを右クリックして送るメニューを見ると、作ったショートカットが表示され、それでブックを開くと読み取り専用になります。SendToフォルダのショートカットファイル名がそのまま「送る」配下の表示名になります。
ハイパーリンクのクリックで読み取り専用で開くコード
以下の図はA列にファイルパスとそのファイルへのハイパーリンク、B列に読み取り専用のハイパーリンクを設定しています。B列のハイパーリンクをクリックすると以下のコードにより左のセルのA列のブックが読み取り専用で開きます。
A列のハイパーリンクは普通のハイパーリンクですが、B列のハイパーリンクは自分自身のセルを参照するハイパーリンクを設定しています。ここで重要なのは、B列で「ハイパーリンクを貼っている」という状態であることです。なぜハイパーリンクであることが重要かというと、ハイパーリンクのクリックイベントを契機としてブックの「Workbook_SheetFollowHyperlink」メソッドやシートの「Worksheet_FollowHyperlink」メソッドを利用したいためです。
B列のハイパーリンクを自分自身のセルにしているのも理由があります。それは、「Workbook_SheetFollowHyperlink」メソッドと「Worksheet_FollowHyperlink」メソッドのどちらもハイパーリンクで対象のファイルが開いたあとに呼び出されるため、実際のブックに対してハイパーリンクを貼っていると読み取り専用で開くためのコードが実行される前に普通の呼び出され方でブックが開いてしまいます。それを防ぐためにブックが開かないように自分自身のセルを参照するハイパーリンクにしています。
Worksheet_FollowHyperlink
Sheet1などのワークシートモジュールに書く場合はWorksheet_FollowHyperlinkメソッドになります。
EXCEL.EXEの場所はApplication.Pathで取得できます。取得できるのはEXCEL.EXEが格納されているフォルダまでですので、\EXCEL.EXEを連結させています。
対象のブックのパスはハイパーリンクのセルのB列の1つ左のA列になるため、「ActiveCell.Offset(0, -1).Value」で取得しています。
なお、Worksheet_FollowHyperlinkとWorkbook_SheetFollowHyperlinkの両方が書いてある場合は、先にWorksheet_FollowHyperlinkが実行され、そのあとにWorkbook_SheetFollowHyperlinkが実行されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Dim sBookPath As String '// 対象ブックのパス Dim sExcelPath As String '// Excel.exeのパス '// Excel.exeへの読み取り専用で開くパスを設定 sExcelPath = """" & Application.Path & "\EXCEL.EXE" & """" & " /r " '// 対象ブックのパスを取得(一つ左のセルを参照) sBookPath = ActiveCell.Offset(0, -1).Value '// 読み取り専用で開く Call Shell(sExcelPath & """" & sBookPath & """") End Sub |
Workbook_SheetFollowHyperlink
ThisWorkBookモジュールに書く場合はWorkbook_SheetFollowHyperlinkメソッドになります。Workbook_SheetFollowHyperlinkとの違いはメソッド名とその引数が違うだけです。処理は全く同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) Dim sBookPath As String '// 対象ブックのパス Dim sExcelPath As String '// Excel.exeのパス '// Excel.exeへの読み取り専用で開くパスを設定 sExcelPath = """" & Application.Path & "\EXCEL.EXE" & """" & " /r " '// 対象ブックのパスを取得(一つ左のセルを参照) sBookPath = ActiveCell.Offset(0, -1).Value '// 読み取り専用で開く Call Shell(sExcelPath & """" & sBookPath & """") End Sub |
PERSONAL.XLSBは編集のためロックされています
読み取り専用でブックを開く際にExcelのプロセスが新規で起動されることがあります。そのときに「使用中のファイル」ダイアログが表示されます。
「PERSONAL.XLSBは編集のためロックされています。」とありますが、読み取り専用ボタンを押すと対象のブックが読み取り専用で開きます。
このダイアログが表示される理由は、PERSONAL.XLSBは先に開いたExcelが編集可能状態になっているためで、それ以降に起動されたExcelには編集権がなく読み取り専用でしか参照できなくなります。