マクロの中止とコントロールの保持(Microsoft Excel)
他の人が使用するマクロを開発しているときは、ユーザーがマクロを終了する前に終了し、マクロの動作を制御したままにするためのメソッドを追加することをお勧めします。 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_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
link:/ excelribbon-ExcelTipsMacros [ここをクリックして、新しいブラウザタブでその特別なページを開きます]
。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(139)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice 365のExcelに適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。
link:/ excel-Aborting_a_Macro_and_Retaining_Control [マクロの中止とコントロールの保持]
。