ExcelマクロのApplication.EnableEvents

このQ&Aのポイント
  • ExcelマクロのApplication.EnableEventsについて
  • 他シートのWorksheet_Changeイベントを停止する方法
  • 処理Aによる他シートのWorksheet_Changeイベントの停止方法
回答を見る
  • ベストアンサー

ExcelマクロのApplication.EnableEvents

Sub AAA()   Application.EnableEvents = False   If a = 0 then     処理A   End If   Application.EnableEvents = True End Sub このようなコードを組んでいます。 処理Aは、他シートへの書込みを行っており、 他シートのWorksheet_Changeイベントが動いて欲しくないので、 上記の位置にApplication.EnableEventsのFalseとTrueを入れたのですが、 (FalseとTrueを入れた位置は「If文の前後」ではなく、「コードの最初と最後」です) 処理Aによって他シートのWorksheet_Changeイベントも動きました。 ここで、  Application.EnableEvents = False  処理A  Application.EnableEvents = True のように記述したら、処理Aによる他シートのWorksheet_Changeイベントは止められました。 動かしたくない処理がある場合は、 その処理を行っている部分をピンポイントでFalseとTrueで挟まないといけないのでしょうか。 (最初と最後に宣言するのではダメなのでしょうか) それとも今回のような動作をした要因は別にあるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 出ている情報だけでは、分からないですが、 Application.EnableEvents = False で、イベントは止まります。 >その処理を行っている部分をピンポイントでFalseとTrueで挟まないといけないのでしょうか。 そんなことはないので、On Error で、エラー処理でもしてあるのでは? イベント・ドリブン型マクロのコードをみてみないとはっきりといえません。Worksheet_Changeイベントだけではなかったりするかもしれません。 ただ、実際のコードとしては、イベントの外から、EnableEvents = False というのは、非常に特殊な例です。時々、自信家の方で違うという文句を付ける人もいるかもしれませんが、それは、まず、Worksheet_Changeイベントぐらいでは、そのコード内で除外条件をつけるというのが一般的です。全部をみないで、確定的なことは言えませんが。

rem_1982
質問者

お礼

回答ありがとうございます。 止まるはずだということがわかってよかったです。 ソースを全て把握できていないので、たぶんEnableEvents = Falseを無視?するような部分があるのでしょう。 探してみます。

関連するQ&A

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • エクセルのマクロコードに付いて教えて下さい。

    下記のマクロコードがありますが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With End Sub セル位置の指定を変更する場合は、どの様に 書けば良いのですか? このコードですと、セルA1の入力指定でなっていますが A1~A5までとか。A1、B1,C1とかにする場合はどの様に 書けば良いか教えて下さい。 マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • エクセルのマクロについて

    以前、こちらのマクロで Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("a1")) Is Nothing Then Exit Sub Application.EnableEvents = False Range("a3:ba28").Replace What:="=*!", Replacement:=Target.Value, LookAt:=xlPart Application.EnableEvents = True End Sub 指定した範囲を(A1)セルに入力した値に置換するマクロを教えていただいたんですが、現在,、これを使ってsheet1の指定範囲内にある(=あ!$AR$75)などが入力してある部分のシート名を置換してデータ内容の変更を行っています。 しかし、この方法だと、シート名の文字数を指定しなくてはならなくて、自分以外の人が操作すると、エラーを出してしまうことがあり困っています。そこでchangeイベントをやめて、シート名の確認をしてからマクロの実行を行うには、どういったマクロにすればいいですか?? 説明が分かりづらくすみません・・・・・・。 もし他にシートの文字数などにこだわらなくてもよい方法があれば教えてください。 よろしくお願いします。

  • 2つのマクロの組合せがうまくいきません

    Excel2002を使用しています。 ・シートに変更があった場合、可否を問うメッセージを出す。 ・但し、「A1」及び「D、E列」の変更は除外する。 ・「D、E列」をダブルクリックしたら、アクティブセルに「済」の文字が入る。 という事をしたくて、Sheet1に以下のようなコードを書きましたが、うまくいきません。 「A1」の変更は除外されるのですが、DE列への変更はメッセージが出てしまいます。 又、そのメッセージが出た際「いいえ」を選択するとエラーになります(Application.Undo)。 Private Sub Worksheet_Change(ByVal Target As Range) Dim 変更回答 As Integer If Target.Address = "$A$1" Then Exit Sub If Target.Columns = ("4:5") Then Exit Sub 変更回答 = MsgBox("セル:" & Target.Address(False, False) & "が変更されました。" & vbCrLf & _ "   「はい」 … 変更許可" & vbCrLf & "   「いいえ」… 内容破棄", vbYesNo) Application.EnableEvents = False If 変更回答 = vbYes Then Application.EnableEvents = True Exit Sub Else Application.Undo End If Application.EnableEvents = True End Sub    ****** Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 4 Then ActiveCell = "済" Cancel = True End If If Target.Column = 5 Then ActiveCell = "済" Cancel = True End If End Sub 以上、ご教授、宜しくお願い致します。

  • excel2007 VBで

    下記のマクロ作成して実際にセルにA、あるいは何かデータを入力しても下記イベント?が発生している気配がありません。 Application.EnableEvents = Falseの行がなにか問題なのでしょうか。実プログラムは If Target.Value = "A" Or Target.Value = "A" Thenの他にB、C、計算も含んでいるのですがApplication.EnableEvents = TrueはEnd Subの前行に入れてあります。 他に設定することがあるのでしょうか。どなたか教えてください。 Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Count > 1 Then Exit Sub '複数セルの入力は無視 Application.EnableEvents = False '割込み停止 ’[B3] = 123 ’Stop If Target.Value = "A" Or Target.Value = "A" Then Target.Value = "A" End If Application.EnableEvents = True '割込み再開 End Sub excel2007 VB6.5です。

  • このマクロあっていますでしょうか?よろしくお願いいたします。

    ★sheetA Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$14" And Target.Address <> "$C$19" _ And Target.Address <> "$F$19" Then Exit Sub If Target.Address <> "$R$14" And Target.Address <> "$S$14" _ And Target.Address <> "$T$19" Then Exit Sub Application.EnableEvents = False With Sheets("B") .Range("F14").Value = Range("C14").Value .Range("F17").Value = Range("C19").Value .Range("F20").Value = Range("F14").Value .Range("F23").Value = Range("F19").Value End With With Sheets("C") .Range("F13").Value = Range("R14").Value .Range("F14").Value = Range("S14").Value .Range("F18").Value = Range("T19").Value End With Application.EnableEvents = True End Sub ★sheetB Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$14" And Target.Address <> "$F$17" _ And Target.Address <> "$F$23" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("C14").Value = Range("F14").Value .Range("C19").Value = Range("F17").Value .Range("F19").Value = Range("F23").Value End With Application.EnableEvents = True End Sub ★sheetC Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$13" And Target.Address <> "$F$14" _ And Target.Address <> "$F$18" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("R14").Value = Range("F13").Value .Range("S14").Value = Range("F14").Value .Range("T19").Value = Range("F18").Value End With Application.EnableEvents = True End Sub

  • イベントマクロで「コンパイルエラー 因数は省略できません」

    マクロ初心者です イベントマクロを作りました Sheet2の結合されたB44:E44のセルに入力すると自動的にマクロが働いて Sheet1のW1の値のみがSheet2の結合されたB44:E44のセルに貼り付けられるマクロなのですが 実行すると「コンパイルエラー 因数は省略できません」と表示されます マクロ自体は正しく動いているのですがどういうことなんでしょう Sheet2 Worksheet Change Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub Application.EnableEvents = False Sheets(1).Select Range("W1").Copy Sheets(2).Select Range("B44:E44").Select ActiveSheet.Paste Application.CutCopyMode = False Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range)…この行が黄色になります If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub…intersectのところが青くなります こんな説明でわかってもらえるでしょうか?

  • エクセル 加算 

    1つのセルに数字を入力すると加算されているマクロを探していたら 以下の回答がありました Dim memo Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value <> "**" And IsNumeric(Target.Value) = False Then Exit Sub Application.EnableEvents = False If Target.Value = "**" Then memo = 0 Else memo = memo + Target.Value End If Target.Value = memo Application.EnableEvents = True End Sub このマクロですがA1に入力した場合に適用しますが、このマクロをたとえばA1からC1の範囲で使用した1場合にどのようなマクロをすればよいかわかりません それか、このマクロではそのようなことができるのかもわかりませんので教えて頂けないでしょうか

  • エクセルVBAでユーザーフォームのテキストボックス

    ユーザーフォーム上にテキストボックスを8個設置しました。 そこに数値が入力された場合は自動的にカンマ区切りが表示されるように以下のコードを書きました。 これで希望の動きはしてくれるのですが、このやりかたは正しいでしょうか? また、テキストボックスは8個あるので、それぞれに下記のように8通りコードをかかなければいけないのでしょうか?ご教示ください。 Private Sub TextBox1_Change()   If IsNumeric(TextBox1.Value) Then Application.EnableEvents=False     TextBox1.Text = Format(TextBox1.Value, "#,##0") Application.EnableEvents=True   End If End Sub 途中(2~7)略 Private Sub TextBox8_Change()   If IsNumeric(TextBox8.Value) Then Application.EnableEvents=False     TextBox8.Text = Format(TextBox8.Value, "#,##0") Application.EnableEvents=True   End If End Sub

  • エクセルのマクロコードについて

    エクセルのマクロコードに付いて教えて下さい。 下記のマクロコードがありますが、 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range) '   Static Memo(1 To 3) As Long   Dim Cell As Range '   If Intersect([A1:C1], Target) Is Nothing Then     Exit Sub   End If '   For Each Cell In Target '     If Cell = "" Then       Memo(Cell.Column) = 0     End If   Next Cell   Set Cell = Target(1) '   If Not IsNumeric(Cell) Or Cell = "" Then     Exit Sub   End If '   Application.EnableEvents = False   Memo(Cell.Column) = Memo(Cell.Column) + Target   Target = Memo(Cell.Column)   Application.EnableEvents = True End Sub セル位置の指定を変更する場合は、どの様に書けば良いのですか? このコードですと、セルA1からc1の入力指定でなっていますが A1からAA1までとかにする場合やA1の結果を、A1ではなくA2に表示B1の結果をB2に表示する場合はどのように書くのでしょうか? マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

専門家に質問してみよう