リンク更新ダイアログが突然表示される理由(Workbooks.OpenでApplication.DisplayAlartが効かない?)
VBAを使ってブックを開いて処理する場合、通常は次のようにWorkbooks.Openメソッドを利用します。
1 |
Workbooks.Open("C:\test\abc.xlsx") |
しかし、このときに以下のリンク更新ダイアログが表示されることがあります。
「このブックには、安全ではない可能性のある外部ソースへのリンクが1つ以上含まれています。リンクを信頼できる場合、リンクを更新して最新データを取り込みます。信頼できない場合は、データをそのまま手元で処理してもかまいません。」
これは、開こうとしているブックが外部ブックのセルを参照しているために出るメッセージです。
DisplayAlertsでは消せない理由
リンク更新ダイアログを非表示にしようとして、次のように書く方も多いと思います。
1 2 3 |
Application.DisplayAlerts = False Workbooks.Open "C:\test\abc.xlsx" Application.DisplayAlerts = True |
しかし、この方法ではダイアログが表示されてしまいます。
理由は、DisplayAlertsは通常の保存確認や上書き確認などのダイアログを消すことはできますが、セキュリティ関連の警告(リンク更新など)は抑制できず、ダイアログの表示が優先されるためです。
リンク更新ダイアログを非表示にする方法
リンク更新ダイアログを出さないようにするには、Workbooks.Openメソッドの引数でUpdateLinksに0を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub UpdateLinksZero() Dim wb As Workbook '// ワークブック Dim sPath '// ブックファイルパス '// 開くブックを指定 sPath = "C:\test\abc.xlsx" '// Filename:開くブック '// UpdateLinks:0=リンク更新しない '// ReadOnly:True=読み取り専用で開く '// IgnoreReadOnlyRecommended:True=読み取り専用推奨ダイアログを非表示 Set wb = Workbooks.Open(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True) '// ブックを閉じる Call wb.Close End Sub |
ポイント
- UpdateLinks:=0を指定するとリンク更新は「更新しない」扱いになります。手動でリンク更新ダイアログで「更新しない」ボタンを押したときと同じ挙動になります。
- 上のコードではUpdateLinks以外にReadOnly、IgnoreReadOnlyRecommendedも引数で設定していますが、リンク更新ダイアログを非表示にしたい場合は、ブックをとにかく参照したい場合が多いため、これらの引数は大体セットで設定します。
Workbooks.Openの詳細については「VBAでExcelブックを開く方法(Workbooks.Open)」をご参照ください。
全リンクを更新して開く(UpdateLinks:=3)
リンクを最新状態に更新したい場合は、UpdateLinks:=3を指定します。
1 2 3 4 5 6 7 8 9 10 11 |
Sub OpenWorkbookWithLinkUpdate() Dim wb As Workbook Dim filePath As String filePath = "C:\test\abc.xlsx" '// UpdateLinks:=3 → すべてのリンクを更新して開く Set wb = Workbooks.Open(Filename:=filePath, UpdateLinks:=3) wb.Close SaveChanges:=False End Sub |
こちらはリンク更新ダイアログで「更新する」を選択した場合と同じ挙動になります。
そもそもリンク更新ダイアログが出るような状態が問題なので根本的に解消する
リンク更新ダイアログが出る原因は、他ブックのセルを参照していることがほとんどですが、意図せずこの状況になっていることが多々あります。
この状況になるとVBAのWorkbooks.Openメソッドだけでなく、普通にブックを開くときにも以下のセキュリティの警告が表示されます。
ハイパーリンクで他のブックのセルを参照するのは便利な機能ではありますが、ほとんどの場合は別シートにリンクを貼ったシートを、別のブックにコピーすることが原因です。
多くは次のようなケースで発生します。再現方法は以下の通りです。
例:外部参照が発生するケース
- Book1.xlsxにSheet1とSheet2がある。
- Sheet2のセルA1で=Sheet1!A1と参照している。
- Sheet2を別ブックにコピーすると、参照が外部参照に変わり、=’C:\test\[Book1.xlsx]Sheet1′!A1 となる。
これが、別ブックを参照していることになってしまう原因です。
外部リンクの探し方
セル内で見つからない場合は、オートシェイプに設定されたリンクが原因のこともあります。オブジェクトを選択してリンクを確認しましょう。
これらを修正すれば、リンク更新ダイアログやセキュリティ警告は表示されなくなります。
これを解消するには、Ctrl+Fキーで検索ダイアログで「.xls」を検索すると、外部ブックへのハイパーリンクが見つかります。ごくまれにですが、オートシェイプをボタンのようにハイパーリンクを貼っていることもありますので、セルの検索で見つからない場合はオートシェイプを選択してリンクを確認してみてください。
外部リンクの探し方の順序
- Ctrl+Fで検索ダイアログを開く。
- 「.xls」で検索する。(ブックのxlsx、マクロのxlsmも検索対象にするため、旧拡張子のxlsにしています)
- 見つかったセルの数式を修正する。
あとは見つかった外部ブックのリンクを書き換えると、リンク更新ダイアログやセキュリティ警告は出なくなります。