教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA ブック操作】ブックを保存する時に発生するイベントプロシージャを作成するにはどうすればいいの?教えて!

f:id:m_kbou:20200506132401p:plain

VBAでは操作をきっかけとして自動的に実行されるプロシージャの事を「イベントプロシージャ」と言います。自動実行のきっかけとなる操作の事を「イベント」と呼び、「イベント」はブックやワークシート、ユーザーフォーム等のオブジェクトに対して発生します。このイベントを利用して「ブックを保存する時に発生するイベントプロシージャの作り方」について紹介します。

 

 

構文 

イベントプロシージャの記述方法は以下の通りです。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  [実行する処理内容]
End Sub

[説明]:

ブックを保存する時に発生するイベントプロシージャにはBeforeSaveプロシージャを使用します。[実行する処理内容]にはブックを保存する際に実行させる内容を記述します。SaveAsUIとCancelは引数となります。SaveAsUIに「True」をセットすると名前を付けて保存する指定となり、「False」をセットすると上書き保存する指定となります。初期値では「False」がセットされています。また、Cancelに「True」をセットするとイベントを中止し、「False」をセットするとイベントを実行します。初期値では「False」がセットされています。内容を纏めると、「ブックを保存する時に[実行する処理組内容]を実行して下さい。」との意味になります。

[記述例]:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  MsgBox "保存します。"
End Sub

 

作り方

(1)VBE(VBA記述画面)を開きます。

※画面の開き方はこちらの手順を参考にして下さい。

f:id:m_kbou:20200506132421p:plain

(2)ブックオブジェクトをダブルクリックします。

f:id:m_kbou:20200506132441p:plain

(3)オブジェクトボックスの▼ボタンをクリックします。

f:id:m_kbou:20200506132455p:plain

(4)プルダウン一覧の中から「WorkBook」を選択します。

f:id:m_kbou:20200506132510p:plain

(5)この時点で「Workbook_Open」イベントプロシージャが表示されます。(これは自動的に作成される仕組みとなっている様です。)

f:id:m_kbou:20200506132526p:plain

(6)プロシージャボックスの▼ボタンをクリックします。

f:id:m_kbou:20200506132545p:plain

(7)プルダウン一覧の中から「BeforeSave」を選択します。

f:id:m_kbou:20200506132617p:plain

(8)「Workbook_BeforeSave」イベントプロシージャが表示されます。

f:id:m_kbou:20200506132634p:plain

(9)(8)で作成したイベントプロシージャに実行させる内容を記述します。以下で記述例を4つ紹介します。

(例①)ブック保存時にメッセージを表示する方法

ブックを保存する時にメッセージを表示する方法について紹介します。

[プログラミング例①]:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  MsgBox "保存します。"
End Sub

内容は、「ブックを保存する時に”保存します。”をMsgBoxで表示して下さい。」との意味になります。

f:id:m_kbou:20210617120043p:plain

[実行例①]:

今回の例としては、Book1.xlsmブックが開かれており、Book1.xlsmブックには上記で説明したプログラミング例①が記述されています。

(実行前)

Book1.xlsmブックの<保存>ボタンをクリックします。

f:id:m_kbou:20210617121801p:plain

(実行後) 

Book1.xlsmブックが保存される前に「保存します。」が表示されます。(※Book1.xlsmブックを保存する事で、プロシージャが実行されてメッセージが表示されました。)

f:id:m_kbou:20210617121816p:plain

[サンプル①]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

(例②)ブック保存時に特定セルが空白の場合は保存を中止する方法

ブックを保存する時に特定セルが空白の場合は保存を中止する方法について紹介します。

[プログラミング例②]:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If (Trim(Range("A1")) = "") Then
    MsgBox "保存できません。"
    Cancel = True
  End If
End Sub

内容は、「ブックを保存する時にA1セルが空白の場合は”保存できません。”をMsgBoxで表示し、イベントを中止して下さい。」との意味になります。

f:id:m_kbou:20210617124921p:plain

[実行例②]:

今回の例としては、Book1.xlsmブックが開かれており、Book1.xlsmブックには上記で説明したプログラミング例②が記述されています。

・A1セルに文字が入力されている場合

(実行前)

Book1.xlsmブックのA1セルに「テスト」の文字が入力されています。<保存>ボタンをクリックします。

f:id:m_kbou:20210617125214p:plain

(実行後) 

問題なく保存されたためメッセージは表示されません。

f:id:m_kbou:20210617125201p:plain

・A1セルに文字が入力されていない場合

(実行前)

Book1.xlsmブックのA1セルは空白の状態です。<保存>ボタンをクリックします。

f:id:m_kbou:20210617125042p:plain

(実行後) 

「保存されません。」が表示されます。(※A1セルが空白のため、メッセージが表示されてイベントが中止されました。)

f:id:m_kbou:20210617125421p:plain

[サンプル②]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com 

(例③)ブックの上書き保存を不可にする方法

ブックの上書き保存を不可にする方法について紹介します。

[プログラミング例③]:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If (SaveAsUI = False) Then
    MsgBox "上書き保存はできません。"
    Cancel = True
  End If
End Sub

内容は、「ブックを上書き保存しようとした場合は”上書き保存できません。”をMsgBoxで表示し、イベントを中止て下さい。」との意味になります。

f:id:m_kbou:20210617132428p:plain

[実行例③]:

今回の例としては、Book1.xlsmブックが開かれており、Book1.xlsmブックには上記で説明したプログラミング例③が記述されています。

(実行前)

Book1.xlsmブックの<保存>ボタンをクリックします。

f:id:m_kbou:20210617132453p:plain

(実行後) 

「上書き保存はできません。」が表示されます。(※<保存>ボタンをクリックした事で上書き保存しようとしましたが、メッセージが表示されてイベントが中止されました。)

f:id:m_kbou:20210617132507p:plain

[サンプル③]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

(例④)ブックの名前を付けて保存を不可にする方法

ブックの名前を付けて保存を不可にする方法について紹介します。

[プログラミング例④]:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If (SaveAsUI = True) Then
    MsgBox "名前を付けて保存はできません。"
    Cancel = True
  End If
End Sub

内容は、「ブックを名前を付けて保存しようとした場合は”名前を付けて保存できません。”をMsgBoxで表示し、イベントを中止て下さい。」との意味になります。

f:id:m_kbou:20210617134205p:plain

[実行例④]:

今回の例としては、Book1.xlsmブックが開かれており、Book1.xlsmブックには上記で説明したプログラミング例④が記述されています。

(実行前)

Book1.xlsmブックの「ファイル」をクリックします。

f:id:m_kbou:20210617134221p:plain

「名前を付けて保存」をクリックします。

f:id:m_kbou:20210617134231p:plain

「参照」をクリックします。

f:id:m_kbou:20210617134241p:plain

(実行後) 

「名前を付けて保存はできません。」が表示されます。(※名前を付けて保存しようとしましたが、メッセージが表示されてイベントが中止されました。)

f:id:m_kbou:20210617134257p:plain

[サンプル④]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

ブックを保存する時に発生するイベントプロシージャの作成方法についての説明は以上です。

 

おわりに

今回はブックを保存する時に発生するイベントプロシージャの作成方法について説明しました。オブジェクトボックスでオブジェクトを選択すると、そのオブジェクト既定の「Workbook_Open」イントプロシージャが自動的に作成(上記(5)の内容)されます。不要な場合は削除して下さい。