デスクワークを超絶快適にするおすすめギアたち

VBAからExcelを開くときのテクニック(データリンクとイベント無視)

【当サイトはプロモーションを含んでいます】

目次

はじめに

この記事では、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

まとめ

実際に使うときは、下記のように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
お役に立てたらシェアお願いします!
  • URLをコピーしました!
  • URLをコピーしました!
目次