他の人が使用するマクロを開発しているときは、ユーザーがマクロを終了する前に終了し、マクロの動作を制御したままにするためのメソッドを追加することをお勧めします。 Ctrl + Breakはマクロを停止しますが、ユーザーがVBAエディターでコードを表示できるため、正常に終了しません。

この問題に取り組むにはいくつかの方法があります。 1つ目は、「終了しますか」というプロンプトをマクロに組み込み、マクロにプロンプ​​トを定期的に表示させることです。たとえば、次のコードについて考えてみます。

Do ...



'    your code goes here

Counter = Counter + 1     If Counter Mod 25 = 0 Then         If MsgBox("Stop Macro?", vbYesNo) = vbYes Then End     End If Loop

マクロの構築は、Do …​ループ構造を使用して、何度も繰り返したい一連の手順があるという前提に基づいています。ループを通過するたびに、Counterの値が増分されます。ループを25回繰り返すごとに、「マクロを停止しますか?」プロンプトが表示され、ユーザーは終了する機会があります。

このアプローチは実装が簡単で、目的によっては非常にうまく機能する場合があります。ただし、このアプローチの最大の欠点は、即時性が許可されないことです。ユーザーは、少なくとも25回の反復が発生するまでマクロを終了するのを待つ必要があります。

別のアプローチは、VBAコードを「非表示」にして、それにパスワードを適用することです。

これを行うには、VBAエディター内から次の手順を実行します。

。 [ツール]メニューから[VBAプロジェクトのプロパティ]オプションを選択します。エディタに[プロジェクトのプロパティ]ダイアログが表示されます。

。 [保護]タブが表示されていることを確認します。 (図1を参照)

。 [表示するプロジェクトをロックする]チェックボックスをオンにします。

。 [パスワード]ボックスに、マクロを保護するために使用するパスワードを入力します。

。 [パスワードの確認]ボックスに、同じパスワードをもう一度入力します。

。 [OK]をクリックします。

VBAエディターを閉じて、ブックを保存します。 VBAプロジェクトが保護されている場合でも、ユーザーはCtrl + Breakをクリックしてマクロを停止できますが、実際のプログラムコードにアクセスすることはできません。どちらもコードを保護する[続行]または[終了]ボタンからのみ選択できます。追加の利点として、このアプローチでは、メニュー、ツールバー、またはリボンの選択肢を使用して、ユーザーがコードを表示することも制限されます。

ただし、おそらく最善のアプローチは、ユーザーがEscまたはCtrl + Breakを押すたびに本質的に担当するエラーハンドラーを作成することです。実行されるハンドラーは、ユーザーに本当に終了するかどうかを尋ね、終了する場合は正常にシャットダウンできます。これがどのように行われるかを示すサンプルコードを次に示します。

Sub Looptest()

Application.EnableCancelKey = xlErrorHandler     On Error GoTo ErrHandler

Dim x As Long     Dim y As Long     Dim lContinue As Long

y = 100000000     For x = 1 To y Step 1     Next

Application.EnableCancelKey = xlInterrupt     Exit Sub

ErrHandler:

If Err.Number = 18 Then         lContinue = MsgBox(prompt:=Format(x / y, "0.0%") & _           " complete" & vbCrLf & _           "Do you want to Continue (YES)?" & vbCrLf & _           "Do you want to QUIT? [Click NO]", _           Buttons:=vbYesNo)

If lContinue = vbYes Then             Resume         Else             Application.EnableCancelKey = xlInterrupt             MsgBox ("Program ended at your request")

Exit Sub         End If     End If

Application.EnableCancelKey = xlInterrupt End Sub

この例ではEnableCancelKeyメソッドを使用しており、キャンセルキー(EscまたはCtrl + Break)が押された場合にジャンプするラベルの名前を割り当てていることに注意してください。この場合、ErrHandlerにジャンプし、ユーザーは何をすべきかを尋ねられます。ユーザーが終了することを選択した場合、マクロは正常にシャットダウンされます。

ErrHandlerラベルの後に最初に行われることは、ErrオブジェクトのNumberプロパティが18に等しいかどうかを確認することです。等しい場合は、キャンセルキーが押されたことがわかります。そうでない場合は、他のタイプのエラーが発生したため、マクロに適した方法で処理する必要があります。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

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

このヒント(3021)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。