質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

1回答

1330閲覧

VBA changeイベント Exit Sub

tttkkk

総合スコア38

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

0クリップ

投稿2021/05/13 12:21

changeイベントにExit Subをしようしたのですが、
Exit Subが実行されるとそれ以降changeイベントが動作しなくなってしまいました。

Exit Subを使用したいのは、changeイベントにおいて、行選択をしてdeleteキーを押してしまうと、オーバーフローが起こりExcelが閉じてしまうためです。
行を選択した状態で何かchangeイベントに該当するようなことがあったとき、Exit Subでchangeイベントを抜けるようにコードを書きました。

以下にサンプルコードを記載いたします。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 3Application.EnableEvents = False 4 5'行選択で操作が行われていた場合、changeイベントを抜ける。 6Dim selectAddress As String 7'選択範囲を相対参照で取得し、コロンを置き換える。 8selectAddress = Selection.Address(rowabsolute:=False, columnabsolute:=False) 9'行が選択されているなら数字とコロンだけ(例3:3)だからコロンを消せば数字だけになる。 10selectAddress = Replace(selectAddress, ":", "") 11 12'行を選択 = 数字だけならchangeイベントが終わり。 13If (IsNumeric(selectAddress)) Then 14 Exit Sub 15Else 16 Target.Value = "a" 17End If 18 19Application.EnableEvents = True 20 21End Sub

一度でもExit Subの処理が行われてしまうと、次からはセルを編集しても

VBA

1Else 2 Target.Value = "a"

の処理が起こらなくなります。

私自身でも試してみて、
Exit Subを記載せずにif文がtrueの時は何も記載しなければ、問題無く次回以降もchangeイベントが起動いたします。

もちろんExit Subを記載しなければ、マクロが動くという点では解決している話なのですが、
どうしてchangeイベントでExit Subの処理が起こると、次回以降changeイベントが機能しなくなるのか、教えていただけますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Exit Subの前にもApplication.EnableEvents = True を入れたらよいと思います。

投稿2021/05/13 12:34

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tttkkk

2021/05/13 13:07

ありがとうございます。 jinoji様の仰る通りにしましたら、Exit Subの処理が起こった後もchangeイベントが問題無く動作しました! Exit Subの前にApplication.EnableEvents = Trueを入れないと、Application.EnableEvents = Falseのままchangeイベントが終了してしまうことになり、次回以降のchangeイベントが動作しないのですね。 こんな単純なことだったのに気付かずすみませんでした。 教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問