特定のマクロの前後でWorkSheet_Changeを終了し再開させる方法がありましたらお願い致します。
Windows7 SP1 Office2010
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
Select Case c.address(0, 0)
Case "C1"
If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub '検査範囲
Application.EnableEvents = False '再帰実行の停止
If Range("C1").Value <> Sheets("祝祭日").Range("A1").Value Then
MsgBox ("祝日の設定を反映するため年度を同じにしてください。")
End If
Application.EnableEvents = True
Case Else
Select Case c.address(0, 0)
Case "G1"
If Range("G1") = 4 Then '4月データの表示
Dim ret As Integer
ret = MsgBox(Format(ActiveSheet.Range("G5").Value, "ge年mm月") & "の勤務割表の編集&入力保存データを元に表示します。" & vbCrLf & "よろしいですか?", _
vbOKCancel + vbQuestion, "勤務割表表示切替確認")
Select Case ret
Case vbOK
UserForm8.Show vbModeless
UserForm8.Repaint
当月データのクリア
メインデータの復元4月
編集データの復元4月
Sheets("メイン・1").Select
Unload UserForm8
Sheets("メイン・1").Range("G1").Select
ActiveCell.FormulaR1C1 = "4"
※ ここで終了ないし一時停止
図形の貼付け
※ここで再開させたいのですが?
Case vbOKCancel
Exit Sub
End Select
ElseIf Range("G1") = 5 Then '5月データの表示
ret = MsgBox(Format(ActiveSheet.Range("G5").Value, "ge年mm月") & "の勤務割表の編集&入力保存データを元に表示します。" & vbCrLf & "よろしいですか?", _
vbOKCancel + vbQuestion, "勤務割表表示切替確認")
Select Case ret
Case vbOK
UserForm8.Show vbModeless
UserForm8.Repaint
当月データのクリア
メインデータの復元5月
編集データの復元5月
Sheets("メイン・1").Select
Unload UserForm8
図形の貼付け
Case vbOKCancel
Exit Sub
End Select
End If
End Select
End Select
Next
End Sub
パブリック変数に動作可否を持っておいたら?
例えば、
public Flag_WSChange as string
Private Sub workbook_open ・・・
Flag_WSChange = ""
end sub
Private sub 止めたいサブルーチン
Flag_WSChange = "STOP"
・・・
Flag_WSChange = ""
end sub
Private Sub WorkSheet_Change(ByVal Target As Range
if Flag_WSChange = "STOP" then
exit sub
end if
・・・
end sub
って感じ。
EXCELブック上の特定シート上にある特定セルの値でもいいですし。
★止めたいサブルーチンでエラーが起きて続行しなかったときは、STOPになったままなので要注意。
(ON ERROR 処理でSTOPをはずすなり、手作業で変えるなりする必要があります)
質問者
お礼
ご回答有難うございます。確かにそういう方法もありますが、スマートなコード文(一部分)ではありませんが下記の方法で事なきを得ました。重ねがさねお礼申しあげます。
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
Select Case c.address(0, 0)
Case "C1"
If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub '検査範囲
Application.EnableEvents = False '再帰実行の停止
If Range("C1").Value <> Sheets("祝祭日").Range("A1").Value Then
MsgBox ("祝日の設定を反映するため年度を同じにしてください。")
End If
Application.EnableEvents = True
Case Else
Select Case c.address(0, 0)
Case "G1"
If Range("G1") = 4 Then '4月データの表示
Dim ret As Integer
ret = MsgBox(Format(ActiveSheet.Range("G2").Value, "ge年mm月") & "の勤務割表の編集&入力保存データを元に表示します。" & vbCrLf & "よろしいですか?", _
vbOKCancel + vbQuestion, "勤務割表表示切替確認")
Select Case ret
Case vbOK
UserForm8.Show vbModeless
UserForm8.Repaint
当月データのクリア
Sheets("編集").Select
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Sheets("編集").Range("G1").Select
ActiveCell.FormulaR1C1 = "4"
編集データの復元4月
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Cursor = xlDefault
Application.EnableEvents = True
メインデータの復元4月
Sheets("メイン・1").Select
Unload UserForm8
CommandButton4_Click
Case vbOKCancel
Exit Sub
End Select
お礼
ご回答有難うございます。確かにそういう方法もありますが、スマートなコード文(一部分)ではありませんが下記の方法で事なきを得ました。重ねがさねお礼申しあげます。 Private Sub WorkSheet_Change(ByVal Target As Range) Dim c As Range For Each c In Target Select Case c.address(0, 0) Case "C1" If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub '検査範囲 Application.EnableEvents = False '再帰実行の停止 If Range("C1").Value <> Sheets("祝祭日").Range("A1").Value Then MsgBox ("祝日の設定を反映するため年度を同じにしてください。") End If Application.EnableEvents = True Case Else Select Case c.address(0, 0) Case "G1" If Range("G1") = 4 Then '4月データの表示 Dim ret As Integer ret = MsgBox(Format(ActiveSheet.Range("G2").Value, "ge年mm月") & "の勤務割表の編集&入力保存データを元に表示します。" & vbCrLf & "よろしいですか?", _ vbOKCancel + vbQuestion, "勤務割表表示切替確認") Select Case ret Case vbOK UserForm8.Show vbModeless UserForm8.Repaint 当月データのクリア Sheets("編集").Select Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Sheets("編集").Range("G1").Select ActiveCell.FormulaR1C1 = "4" 編集データの復元4月 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.Cursor = xlDefault Application.EnableEvents = True メインデータの復元4月 Sheets("メイン・1").Select Unload UserForm8 CommandButton4_Click Case vbOKCancel Exit Sub End Select