• ベストアンサー

worksheet_changeの無効化

worksheet_changeを使って、特定のセルの値が変更されたときに、処理をしています。 例えば、セルA1が変更されたときに3万回のセルに値を入力する繰り返し操作をするマクロを書いていると 1回目のセルに入力される操作をしたときにworksheet_changeがおそらく反応しています。 3万回のセルに値を入力する繰り返し操作中だけ、worksheet_changeが起きないようにはできないでしょうか?

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

考え方その1:自分発の操作には反応を抑制する private sub Worksheet_Change(byval Target as excel.range) dim i msgbox "EVENT RUN" application.enableevents = false for i = 1 to 30000 target.cells(1) = val(target.cells(1)) + 1 next i application.enableevents = true msgbox "EVENT END" end sub 考え方その2:指定のセルからの時だけ処置を行う private sub Worksheet_Change(byval Target as excel.range) dim i msgbox "EVENT ENTER" if target.address <> "$A$1" then exit sub msgbox "EVENT RUN" for i = 1 to 3 range("B1") = i next i end sub

その他の回答 (1)

  • denbee
  • ベストアンサー率28% (192/671)
回答No.1

worksheet_changeの無効化をするくらいであれば、 worksheet_changeイベントで、どのセルに対する操作なのか判断して、 「特定のセル」以外の操作は無視するロジックを組んだ方が楽だと思いますが。 こちらを参照。 http://www.moug.net/tech/exvba/0050131.html Intersectメソッドを使ってセルの判断を行っています。

関連するQ&A

  • linkとWorksheet_Change

    LINK してあるセルを ターゲットにして Worksheet_Change をとっても 反応しない。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$B$2" Then Exit Sub   Msg = MsgBox("bが変更されました。", vbOKCancel)   tensou この$B$2は 他の部分からデータを得ています。時間でこのセルの値が自動で変化するのですが Worksheet_Change 起きないのか、捉えられないのか、分かりかねますが その下$B$3に =$B$2 もしくは =Value($B$2) で 飛ばして Target.Address <> "$B$3"にしても 同じ。 このLINKした セルの Worksheet_Change イベントを ひらう方法を お教え願えませんでしょうか IF 分を =で置き換えても同じでした。

  • worksheet_changeの一時無効化

    VBAエクセル初心者です。 セルの値を手入力変更すると赤字で表示されるようWorksheet_Changeメソッドを利用しています。 これをあるマクロ(Subプロシージャ)の実行中だけ無効にすることはできますか? 外部データを参照し列や行を削除や挿入して更新するマクロなのですが列を選択するとこのChangeメソッドにひっかかってしまい、エラーがでてしまいます。 何かよい方法はあるでしょうか・・・?

  • Worksheet_Changeについて

    A列1~10のセルそれぞれに「A」と入ると右側2つのセルに色がつき 「B」と入ると右側5つのセルに色がつくようにしたいのですが・・Worksheet_Changeの使い方が良く判りません。 過去の質問や他のHPも調べて見ましたが・・ まだ超初心者なのでよく理解できてないのです。 出来れば分かりやすく教えていただけませんか?宜しくお願い致します。

  • WorkSheet _Change を使って

    たびたびお世話になります。 worksheet_changeを使うマクロを作成しています。 sheet1で入力されたデータがsheet2にあるデータベースの文字と一致した場合、sheet1の該当セル(入力した部分)の色を変えます。 もしそのセルの内容が変更、削除された場合は塗りつぶしなしに戻します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sTitle As String sTitle = Target.Value If sTitle = "aaa" Then Target.Interior.ColorIndex = 7 Else Target.Interior.ColorIndex = xlNone End If End Sub このコードで、「aaaという文字を入れたら色を変える/削除・変更されたらは塗りつぶしなし」という動作はできました。 しかしその後、aaaに当たる項目が増え、項目自体を変更する可能性も増えたので、上記のように別シートにデータベースを作ることにしたのです。 このコードを基にしてプログラムを組んだのですが、うまく参照が出来てないようでコンパイルエラーになってしまいます。 アイディアでも良いのでアドバイスをお願いします。

  • エクセルのPrivate Sub Worksheet_Change

    エクセルのPrivate Sub Worksheet_Change すいません。どうやっても動作しません。 シート1のB5のセルに英数字を入力しエンターを押して確定すると シート2のC列から同レコードを検出し、その検出された行のB~E列の値を シート1のH4、H5、H6、J7に値をかえします。 またB5の値はH8にも表示されます。 データがあった場合には、シート1のH4、H5、H6、J7に値が表示されています。 シート2にデータが無い場合はシート1のH4、H5、H6、J7には「#N/A」と表示されます。 ここまでは関数と計算式なのでマクロではありません。 ここでフォームで作成した「印刷ボタン」をクリックします。 すると「印刷ボタン」に登録したマクロが起動します。 シート1のセルG4~J11までが印刷されます。 マクロの内容は シート1のH4に「#N/A」が表示されている場合はメッセージボックスで 「データがありません」と出ます。印刷は実行されません。 H4が「#N/A」以外の場合は印刷が実行されますがその前に シート3のセルA1の数値をプラス1してシート3のB2に、セルA1の値の先頭にAを付けて 表示します。(セルA1が0002ならB1はA0002) それがシート1のH12に表示されます。(H12への表示は計算式で対応) 印刷ボタンを押すごとにシート3のセルA1は1づつ繰り上がります。 シート1のH12の値が変わってから印刷がされます。 と同時に シート1のセルB5がDELETEされセルB5がアクティブになります。 結果シート1のH4、H5、H6、J7、H8は「#N/A」が表示されます。 H12はクリアされません。 印刷終了後にもセルの値が変化する事になります。 もう一つフォームで作成した「初期化」というボタンがあります。 これをクリックするとマクロが起動して シート1のセルB5がDELETEされセルB5がアクティブになります。 よってシート1のセルH4、H5、H6、J7、H8も「#N/A」に値が変わります。 ここまでは完璧に動作しています。 でこの「印刷ボタン」を押してマクロが起動ではなく セルB5に入力しエンターを押したらマクロを起動させたいです。 Private Sub Worksheet_Change(ByVal Target As Range) を利用しましたが動作しません。 シート1のB5のセルに入力しエンターを押すと シート1の一部のセルの値が変化。 印刷ボタンを押すと、シート3の一部のセルの値が変化し その後再びシート1のセルの一部が変化し印刷が開始され その後シート1のセルB5がDELETEされアクティブに。 それに伴いシート1の一部のセルの値が変化する。 マクロが起動すると、シート1とシート3のセルの値が数回変化します。 このような場合はPrivate Sub Worksheet_Change(ByVal Target As Range)で セルB5の入力後エンターで確定しての上記のマクロ起動は無理なのでしょうか?

  • worksheet_changeがループする

    worksheet_change イベントでの質問です。シートに文字が入力された時に、他のセルに値をコピーしたいのですが、一つ目の値を代入した時点で、再びchangeイベントが発生して、この関数の頭に戻ってしまいます。実行中は、changeイベントを発生しないようにできないのでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i, j As Integer j

  • WorkSheet _Change について

    いつもお世話になっています。 今、セルにある特定の文字列が入力されたら、セルの色を変えるという処理を作成しています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sTitle As String sTitle = Target.Value If sTitle = "aaa" Then Target.Interior.ColorIndex = 16 End If End Sub コードはこんな感じです。(動作確認済み) たしかに特定の文字列を察知してシートの色を変えることはできるんですが、今作成しているものは随時セルの中身が更新されるのです。 そこで、別の文字列が入力されたら(もしくは文字列が削除されたら)もとの白色に戻る、という処理はできますでしょうか。

  • Q>ExcelVBAで特定のサブルーチンを無効にするには?

    Excel2000であるシートに Worksheet_Change のサブルーチン(A)を入れて更新されると起動するようにしています。(A)は特定の列(B)にデータが入ったときに行なう処理を記載しています。 この状態でそのシートの列(C)のセルを順番に更新するようなマクロ(D)を作ったのですが、1つのセルの更新ごとに(A)が起動してしまうので処理が遅くなってしまいます。 1.(D)の処理中は(A)を起動させたくないので、(D)の初めに(A)を無効にする処理を入れたいのですが、そんなコマンドはあるのでしょうか? 2.または、(A)の処理を Worksheet_Changeで実現するのではなく、特定の列(B)のセルが更新されたときのみに行なうようにする方法はないでしょうか? ご存知の方がいましたら、よろしくお願いします。m(_ _)m

  • Worksheet_Changeが 起こらない?

    早速ですが fundata シートの Worksheet_Change endrh = Cells(20000, 1).End(xlUp).Row Application.EnableEvents = False 'If Target.Address = "$F$" & endrh Then ですが 手入力で F 最後を 弄ると イベントをひらうのですが 他のシート("orgdata").の Worksheet_Calculate() Worksheets("orgdata").Activate Range("a4:h4").Select Selection.Copy Worksheets("fundata").Activate Range("A2").Select Range("A20000").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlValues でデータを アペンドで 追加するのですが、その追加には 上記が反応しないのです。 また、情報として orgdata の Range("a4:h4"). は リンクで得られたデータをもとに 加工して 値が得られ、時間で変化しています。 リンクで得られたデータは 癖があるのは承知しているのですが、その口でしょうか? よろしくどうぞ

  • イベントプロシージャ『 Worksheet_Change 』の対象セル

    イベントプロシージャ『 Worksheet_Change 』の対象セルを『 コピー貼付 』の際 どんな方法で貼り付けてもマクロがフリーズすることがなくなる方法をご存知の方が いらっしゃいましたら、是非その方法を教えて下さい。 『 Worksheet_Change 』対象セルの『 コピー貼付 』の際、ツールの『 編集 』から 『 貼り付け 』の手順で『 Worksheet_Change 』対象セル宛に情報を貼り付けてみた 場合は特に問題なく情報が貼り付いてくれます。 『 Ctrl+V 』で貼り付けた場合も問題なく情報が貼り付いてくれます。 しかし、コピー後に貼り付け先のセルを右クリックして『 形式を選択して貼り付け 』の手順での 貼り付けをしようとすると、必ず決まってマクロがフリーズしてしまいます。 そのため、その度にウィンドウ右上の閉じるボタン『 X 』をクリックして『 保存しますか? 』を 『 キャンセル 』してマクロのフリーズを解除している状況です。 コピー元のセルと貼り付け先のセルは共にセル結合されている状態ですが、この『 セル結合 』は マクロのフリーズとは無関係のことと思われます。 何か良い解決策をご存知の方、どうか宜しくお願いします。

専門家に質問してみよう