BeforeCloseイベントのバイパス(Microsoft Excel)
Royがワークブックを開くときにShiftキーを押したままにすると、Excelは、Workbook_Openイベントを含め、通常実行される「自動」マクロの実行をバイパスします。彼は、ブックを閉じるときに、ExcelがWorkbook_BeforeCloseイベントをバイパスするのと同じくらい簡単な方法があるかどうか疑問に思います。
同様に簡単な方法はありません。それができないという意味ではありませんが、「同じように簡単」とは、一般的に「何かが組み込まれている、押すためのキーまたは作るための設定」を意味します。 BeforeCloseイベントをバイパスするためのこのようなキーと設定は、Excelに組み込まれていません。
できることは、BeforeCloseイベントのプログラム方法を調整して、特定の条件が満たされた場合に、イベントハンドラー内のコードがバイパスされるようにすることです。簡単な方法は、特定のワークシートセルが選択されている場合、次のようにコードをバイパスすることです。
Private Sub Workbook_BeforeClose(Cancel As Boolean) If ActiveCell.Address = "$Z$27" Then Exit Sub ' ' Your normal code here... ' End Sub
この場合、アクティブセル(BeforeCloseイベントがトリガーされたときに選択されたセル)がセルZ27になると、イベントハンドラーの通常のコードはスキップされます。他のセルが選択されている場合、そのセルはスキップされません。 (セルZ27は難解でわかりにくいため、意図的に選択しました。もちろん、必要な他のセルを反映するようにコードを変更できます。)
Shiftキーが押されているかどうかを確認することに行き詰まっている場合は、WindowsAPIを利用してそれを行うことができます。これには、モジュールの宣言領域にコードを追加することが含まれます。これは通常のモジュールにすることができます。 ThisWorkbookコードウィンドウにある必要はありません。プロシージャを宣言する前に、それが宣言領域にあることを確認する必要があります。
#If VBA7 Then Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If
#If VBA7条件付きディレクティブを使用すると、Excel 2010以降を使用している場合、宣言の正しい構文が使用されるため、プログラムの32ビットバージョンまたは64ビットバージョンでエラーが発生することはありません。
これで、BeforeCloseイベントハンドラー内で次のことができます。
Private Sub Workbook_BeforeClose(Cancel As Boolean) Const VSHIFT = &H10 Const SHIFTED = &H80 If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub ' ' Your normal code here... ' End Sub
BeforeCloseイベントがトリガーされたときにShiftキーを押したままにすると、BeforeCloseコードはスキップされます。 Shiftキーをいつ押したままにするか、または十分長く押し続けたかどうかを判断するのは少し難しい場合があることに注意してください。このため、セルを選択してブックを閉じるだけで忘れることができるため、「ActiveCellを確認する」アプローチを好む傾向があります。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(2628)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。