

はじめに
この記事では、Excelファイルを大量に自動操作するとき、Excelのセキュリティ関連の警告メッセージが表示されて処理がストップしてしまわないように、マクロに記述しておくと便利なステートメントについて紹介します。
下記について紹介します。
- データリンク無視
- ファイル起動時のマクロ(OnOpenイベントトリガーのマクロ停止)
- 高速化
データリンクを無視してExcelファイルを開く
「このブックには更新できないリンクが1つ以上含まれています。」
「このブックには、ほかのデータソースへのリンクが含まれています。」
Excelを開いた時に、上記のようなエラーメッセージをみたことないでしょうか。外部のExcelファイルやAccessなんかとリンクしていExcelファイルを開いた時に見ることがあります。マクロで複数のExcelを開いた時にも表示され、ユーザのボタンクリックを待ち続けるため、マクロが中断してしまうことがあります。
マクロでこのようなファイルを開くときは、下記のようにデータリンクを明示的にオフにして開くと良いです。
'そっと開く。(データリンクの更新をせずにブックを開く。※)
Workbooks.Open Filename:=FullName, UpdateLinks:=0
UpdateLinksに渡すパラメータには、ほかにも下記を使うことができます。
| 引数 | 説明 |
|---|---|
| 0 | 外部参照、リモート参照ともに更新されません。 |
| 1 | 外部参照は更新され、リモート参照は更新されません。 |
| 2 | リモート参照は更新され、外部参照は更新されません。 |
| 3 | 外部参照、リモート参照ともに更新されます。まずはファイル単体で試してみる。 |
Excelファイルを開いた時に表示される警告を無視する。
データリンク以外にも警告系のポップアップメッセージが表示され、マクロが停止してしまうときは、全ての警告を無視(表示しない)する方法もあります。
'Excelの口を封じる。(警告オフ)
Application.DisplayAlerts = False
マクロ実行中、画面更新を停止する。(マクロの高速化)
マクロをバックグラウンドで実行すると、画面更新をしないため、処理が高速化します。
処理時間のかかるマクロには下記のステートメントを入れてみると良いです。使用するときは必ずマクロの最後にTrueに戻すように注意しましょう。これを忘れるとエラーでマクロが停止した時に、Excelがフリーズしたように見えることがあります。
'Excelの画面更新を封じる
Application.ScreenUpdating = False
’処理
Application.ScreenUpdating = True
Excel起動時に自動実行するマクロを実行させない。
起動時に実行されるマクロが仕込まれているファイルを開くときにマクロを実行させないように開くステートメントです。OnOpenイベントに紐づいたイベントトリガー式のマクロですね。
'Excelの動作を封じる(トリガー式の自動マクロを起動させない。)
Application.EnableEvents = False
ファイルを開くときはファイルの存在チェックをしましょう
'念のためファイルの存在確認を開く前に実施。
'ファイルが存在しない場合もエラーで止まるので。
If Dir("ファイルフルパス") <> "" Then
2022年7月以降、インターネット経由で受け取ったファイルのマクロは既定でブロックされます。メールの添付ファイル、クラウドストレージからダウンロードしたブックなどが対象です。
この状態のファイルには「セキュリティ リスク」という赤い帯が出て、従来の「コンテンツの有効化」ボタンが表示されません。解除するには、ファイルを右クリック →[プロパティ]→[全般]タブ下部の「許可する」(ブロックの解除)にチェックを入れます。
定型業務で配る予定があるなら、保存先フォルダーを「信頼できる場所」に登録しておくほうが確実です。この判定自体がスキップされます。
まとめ
実際に使うときは、下記のようにFalseにしたものはTrueに戻すようにしてくださいね。
Dim ws As Worksheet
Dim fullname As String
Fullname = "c:\\filepath\filename.xlsx" 'ファイル
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.ScreenUpdating = False
If Dir("FullName") <> "" Then
Set ws = Workbooks.Open(Filename:=FullName, UpdateLinks:=0)
'ここにファイルごとに実施する処理を書く
ws.Close SaveChanges:= False
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
