ライリーは、毎週金曜日に作業する必要のあるワークシートを持っています。このワークシートはテンプレートに基づいており、C4:C8の範囲で、少なくとも5つのセルに入力する必要があります。彼がワークシートから始めるとき、これらのセルは空白です。ライリーは、これら5つのセルすべてに入力するまで、ワークシートが保存または閉じられないようにする方法があるかどうか疑問に思います。

これを行う方法はありますが、マクロを使用する必要があります。 Excelは、イベントハンドラーの概念をサポートしています。つまり、特定のイベントが発生したときに自動的に実行されるマクロを開発できます。特別なイベントハンドラーを作成できる2つのイベントは、BeforeClose(ブックが閉じる前)とBeforeSave(ブックが保存される前)です。

これがどのように機能するかの例として、チェックする範囲(C4:C8)を含むワークシートの名前が「MyData」であるとします。このコードをThisWorkbookモジュールに追加できます:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim rng As Range     Dim iCount As Integer     Dim sTemp As String

Set rng = Worksheets("MyData").Range("C4:C8")

iCount = Application.WorksheetFunction.CountBlank(rng)

If iCount <> 0 Then         sTemp = rng.Address & " has blank cells. " & vbCrLf         sTemp = sTemp & "The workbook will not be closed."

MsgBox sTemp         Cancel = True     End If End Sub

マクロは、CountBlankワークシート関数に依存して、セルの範囲に空白があるかどうかを判別することに注意してください。空白のチェックが検出された場合(iCountが0より大きい場合)、マクロはユーザーにメッセージを表示し、キャンセル変数がTrueに設定されます。これにより、ブックが閉じられなくなります。

次のように、BeforeSaveイベントに同様のマクロを使用できます。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim rng As Range     Dim iCount As Integer     Dim sTemp As String

Set rng = Worksheets("MyData").Range("C4:C8")

iCount = Application.WorksheetFunction.CountBlank(rng)

If iCount <> 0 Then         sTemp = rng.Address & " has blank cells. " & vbCrLf         sTemp = sTemp & "The workbook will not be saved."

MsgBox sTemp         Cancel = True     End If End Sub

ルーチンが(最後のステップとして)入力が必要なセルを選択したことを確認したい場合は、Cancel変数をTrueに設定する行の直後に、両方のマクロに次の行を追加できます。

rng.Select

また、ワークブックはテンプレートに基づいているため、正しく機能させるには、マクロ対応のテンプレートとして保存する必要があることにも注意してください。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(4364)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。