[[20210225182300]] 『保存時のApplication.EnableEventsのリセット』(さわ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『保存時のApplication.EnableEventsのリセット』(さわ)

 以下についてお伺いします。 
 シートに対し、Worksheet_SelectionChangeイベントを使用してセルの入力規則を設定しています。
 イベントが動いている間はコピペなどが出来ず不便なので、切り替えボタンを用意して
 EnableEventsのTrue、Falseを切り替えられるようにしました。

 sub M_shtCodeChange()
	with worksheets("対象シート")
		if(.cells(1,4).value = "シートコード実行中")then
			Application.EnableEvents.false
			.cells(1,4).value = "シートコード停止中"
		else
			Application.EnableEvents.true
			.cells(1,4).value = "シートコード実行中"
		endif
	end with
 end sub

 業務PCで作成している為、上記は簡略化して手打ちしています。
 個人PCでは実行出来ないため、エラー等ありましたらすみません。

 とりあえず、上記で希望のことは出来ていますが、
保存時にEnableEventsをtrueにして、セルの記述も「〜実行中」にしたくコードを書きましたが
 false時は実行されず調べたところ、EnableEventsがfalseの時は「Workbook_beforeSave」も抑制されるようです。

 EnableEventsが一部のイベントのみに作用するようなオプションがあれば良かったのですが、それもなさそうなので見直しが必要になりました。
 ユーザーに「使い終わったら実行中に戻してから保存してね」という運用は避けたく、なにか別案など考えられないでしょうか。

 上記は手段ですので、目的である「Worksheet_SelectionChangeイベント中にコピペが出来なくなる」という不便が取り除ければ、全く違うアプローチでも何でも良いです。
 なにかヒントがありましたらご教示願います。
 よろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


Worksheet_SelectionChangeの中身もあればアドバイスしやすいかと
(Sinking Time) 2021/02/25(木) 19:21

 SelectionChangeの中身はだいぶ複雑で、対象のシートに入力規則を設定するものですが、
 選んだ項目によって、別シート「プロジェクトデータベース」から次の項目の候補を絞って設定するものです。
 例えば、対象シートで「営業者」を選んだら、隣の「案件名」のセルにプロジェクトデータベースシートから、
 その営業者が担当している案件を検索してリスト化し、入力規則のリストにしています。
 これを複数項目に対して行っています。
(さわ) 2021/02/26(金) 00:08

このブックだけで考えれば、開いた時に「実行中」
(pgt) 2021/02/26(金) 07:49

 >イベントが動いている間はコピペなどが出来ず不便
 Worksheet_SelectionChange のコードを見直す余地はあると思いますが、
 一番簡単に手を入れるとすると、
 Application.EnableEvents でコントロールしないで、
 フラグを立てて、Worksheet_SelectionChange の最初に実行するかしないか決める
 という方法がいいかなぁとおもいます。

    Public EnableSelectionChange As Boolean ' フラグ

    Private Sub CommandButton1_Click() ' フラグの切り替え 

      If (Me.Cells(1, 4).Value = "シートコード実行中") Then
          Me.EnableSelectionChange = False
          Me.Cells(1, 4).Value = "シートコード停止中"
      Else
          Me.EnableSelectionChange = True
          Me.Cells(1, 4).Value = "シートコード実行中"
      End If

    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        If Not EnableSelectionChange Then Exit Sub ' フラグがFalseなら実行しない

        Debug.Print "SelectionChange"

    End Sub
(´・ω・`) 2021/02/26(金) 09:06

結局、SelectionChangeの中身の説明はされないようですが、「対象シートで「営業者」を選んだら、隣の「案件名」のセルに〜」ということは、Changeイベントで実装すべき内容だったんじゃないですかね…

また、親項目の内容に連動して入力規則のリストが切り替わるだけならマクロ無しで可能ですから、そういった方法に変えるのも検討してみてはどうでしょうか。

(もこな2) 2021/02/26(金) 09:07


皆さんコメントありがとうございました。
今回の件ですと、開いた時に実行中に書き換える、
フラグをたてて実行するしないをわける、
どちらでも対応出来そうです。今から早速書き換えてみます。

また、たしかにChangeイベントの方が良さそうですのでそのあたりも見直してみます。

書き換えて不都合など出ました際は引き続きご相談したいのですが、一旦こちらで解決といたします。
重ねてお礼申し上げます。
(さわ) 2021/02/26(金) 10:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.