Workbooks.OpenでApplication.DisplayAlartが効かない?
VBAを使ってブックを開いて処理する場合、Workbooks.Openメソッドを利用します。
1 |
Workbooks.Open("C:\test\abc.xlsx") |
ただ、このときに以下のリンク更新ダイアログが表示されることがあります。
「このブックには、安全ではない可能性のある外部ソースへのリンクが1つ以上含まれています。リンクを信頼できる場合、リンクを更新して最新データを取り込みます。信頼できない場合は、データをそのまま手元で処理してもかまいません。」
相変わらず意味が分かりにくいメッセージです。ボタンを押すこと自体が恐怖です。これをユーザーに見せて理解できると本当にMicrosoftは思ってるのか謎です。
分かりやすく書くと、「他のブックのセルにハイパーリンク貼ってるけど、値変わってるかもしれんよ。確認して値を最新にする?」って話です。
で、このようなメッセージダイアログを出さないようにする仕組みとして「Applicationo.DisplayAlart = False」がありますが、このメッセージの場合はこの方法が効きません。
というのも、「Applicationo.DisplayAlart = False」は全てのダイアログを消すことはできず、セキュリティ上問題がある場合にはダイアログの表示が優先されてしまいます。
リンク更新ダイアログを出さない方法
では、どうやってリンク更新ダイアログの表示を回避するかというと、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 |
0を指定するとリンク更新は「更新しない」扱いになります。リンク更新ダイアログで「更新しない」ボタンを押したときと同じ挙動になります。
上のコードではUpdateLinks以外にReadOnly、IgnoreReadOnlyRecommendedも引数で設定していますが、リンク更新ダイアログを非表示にしたい場合は、ブックをとにかく参照したい場合が多いため、これらの引数は大体セットで設定します。
Workbooks.Openの詳細については「VBAでExcelブックを開く方法(Workbooks.Open)」をご参照ください。
そもそもリンク更新ダイアログが出るような状態が問題
リンク更新ダイアログが出る原因は、他ブックのセルを参照していることがほとんどですが、意図せずこの状況になっていることが多々あります。
この状況になるとVBAのWorkbooks.Openメソッドだけでなく、普通にブックを開くときにも以下のセキュリティの警告が表示されます。
ハイパーリンクで他のブックのセルを参照するのは便利な機能ではありますが、ほとんどの場合は別シートにリンクを貼ったシートを、別のブックにコピーすることが原因です。
再現方法は、Book1.xlsxにSheet1とSheet2があり、Sheet2のA1セルで「=Sheet1!A1」として、そのSheet2を別ブックにコピーすると、元の「=Sheet1!A1」が「=’C:\test\[Book1.xlsx]Sheet1′!A1」のように外部ブックを指すようになります。
これが、別ブックを参照していることになってしまう原因です。
これを解消するには、Ctrl+Fキーで検索ダイアログで「.xls」を検索すると、外部ブックへのハイパーリンクが見つかります。ごくまれにですが、オートシェイプをボタンのようにハイパーリンクを貼っていることもありますので、セルの検索で見つからない場合はオートシェイプを探してみてください。
あとは見つかった外部ブックのリンクを書き換えると、リンク更新ダイアログやセキュリティ警告は出なくなります。