[[20230406162549]] 『.Deleteと確認メッセージについて』(けのーび) ページの最後に飛ぶ

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

 

『.Deleteと確認メッセージについて』(けのーび)

ユーザーフォームを用いて顧客情報管理やらなんやらやっています。

テーブルのデータを削除する際に、ListObject.DataBodyRange.Deleteを使っていました。
先月ごろからこれを使用すると「シート行全体を削除しますか?」
という確認メッセージが表示されるようになりました。
VBAを触って半年足らずですが今まで表示されたことがありませんでした。

Application.DisplayAlerts = Falseによってメッセージを非表示にはできますが、
印刷や印刷プレビュー後にフォームに戻るとTrueに戻ってしまいます。
プロシージャ最後尾にApplication.DisplayAlerts = Falseをつけたり、F8で様子見してみましたが
やはりプロシージャを抜けてフォームに戻った途端Trueになってしまいます。

ListObject.DataBodyRange.EntireRow.Deleteとすることで表示を回避できるようで、
現在は運用に支障はありませんが、後学のためにご意見をいただければ幸いです。

・なぜ今まで表示されていなかったメッセージが表示されるようになったのか。
・印刷やプレビュー後にDisplayAlertsが規定値に戻ってしまうのはなぜか。
 また、その回避・対処方法。

< 使用 Excel:Excel2021、使用 OS:Windows11 >


 >ListObject.DataBodyRange.Delete
 Excel2016では
 ListObjectがListObject型の変数だとして、
 確認しましたが、出ませんでした。

 個人的には、
 マイクロソフト次第なので、ポップアップが出ないようにする。
 >印刷やプレビュー後にDisplayAlertsが規定値に戻ってしまうのはなぜか。
 ↑最低限しか制限しないので、そんなに長い間制限してるの?といった感想です。
 で、ListObject.DataBodyRange.DeleteをApplication.DisplayAlertsで挟んで
 サブプロシージャ作ります。

(tkit) 2023/04/06(木) 17:10:54


後者についてだけ回答します。
DisplayAlertsはご指摘のとおり、プロシージャを抜けるとTrueに戻ります。
Application.ScreenUpdatingと同じふるまいです。
一方、Application.EnableEventsは、それらと異なり、プロシージャから抜けても永続します。
ものによって振る舞いが違います。まあ、一言で言えば、「仕様」です。
スコープ(変更の有効期間)とでもいいますか、
それはそうしたのほうが好適とMS社が考えた、ということでしょう。

なお、DisplayAlertsも含め、
・他の箇所で必要な警告を抑止してしまうこともあるので、
 必要な時にだけ、できるだけ狭い範囲で操作し(できるだけ影響範囲は狭く)、
・処理し終わったら元に戻す
とするのが一般的だと思います。

(xyz) 2023/04/07(金) 07:10:14


tkitさん、ありがとうございます。

 共通するものはまとめる、基本的なところに考えが至らず恥ずかしい限りです。
 

xyzさん、ありがとうございます。

 DisplayAlertsが規定値に戻るのは仕様のようなものなのですね。
 ScreenUpdating含め、雑に広く使用しないよう気を付けたいと思います。

(けのーび) 2023/04/09(日) 20:00:11


コメント返信:

[ 一覧(最新更新順) ]


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