プロが教える店舗&オフィスのセキュリティ対策術

エクセルの入力で、どの行を操作しているのかわかるように、他の方のVBAを参考にして
条件付き書式で
=CELL("ROW")=ROW()

VBAにて
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.ScreenUpdating = True
End Sub

こちらを併用して表示しています。


マクロ処理で、画面のチラツキをなくすため、
Application.ScreenUpdating = False
としているのですが、先ほどのWorkbook_SheetSelectionChangeの構文が効いていて
画面の動きが出てしまいます。

マクロ実行中だけ、一時的にWorkbook_SheetSelectionChangeの効力を止める、
もしくは代替の方法はありますでしょうか?

A 回答 (3件)

こんばんは



何だか「風通しを良くするために穴をあけたら、雨や虫が入ってくるんだけれど、どうすれば・・?」みたいな感じですね。

>マクロ実行中だけ、一時的にWorkbook_SheetSelectionChangeの効力を止める
ご質問文の通りにするのなら、EnableEventsプロパティをFalseにしておけばイベントの発生を停止できます。
https://learn.microsoft.com/ja-jp/office/vba/api …
(元の状態(=True)に戻さないと、そのままになりますのでご注意)
でも、これって「穴を塞ぐのに、もう一枚壁を作る」みたいなことになっているような気もしますが。


>もしくは代替の方法はありますでしょうか?
実際になさりたいことがよくわからないので、以下は一般論的になってしまいますけれど・・

ご提示の条件付き書式で色付けなどをするとなると、対象セルに全て条件付き書式を設定しておく必要があるのと、ご提示のイベント処理はブック全体を対象にしていますけれど、全シートで同様のことを行うということなのでしょうか?
通常の状態であれば、ScreenUpdating = True の状態になっているはずですので(マクロから意図的に停止した場合は別ですが)、ご提示の内容のためだけにわざわざマクロを使うのであれば、マクロで対象セルに色付けをしてしまえば済む話のようにも思います。
(条件付き書式を設定する必要がなくなります)
元のセルにいろいろな色が設定してあったりすると、元に戻すためにそれを記録しておく必要が生じるので、多少は面倒になりますが・・

>マクロ処理で、画面のチラツキをなくすため~
「チラツキ」を無くすことが主目的なら、マクロ中の Select や Activate などの構文を無くすような記述法にすること、及び、まとめて結果を記入するなどの方法にすることで、ほとんど無くすことが可能ですし、処理速度も向上するはずです。
(新規のブック、シートなどを作成する場合を除く)
一方で、マクロ実行中にシートへの記入等が発生すると、各種イベントは発生しますので、上記のようにイベントを停止しておかないと処理効率が悪くなります。
(処理の組み合わせが悪ければ、抜け出せなくなります)
(不要なイベント処理を設けなければ、その様な必要も生じませんけれど)
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
SelectやActivateは使っていませんが、行数が100行近くあり、ForNextなどでセルをコピーしている関係上、画面がちらつく等の影響がありました。

丁寧に説明していただきありがとうございます。
同様の回答もありましたが、こちらをベストアンサーと
させていただきます。

お礼日時:2023/07/14 21:28

自分のところでは、画面のチラつきはありませんね。



ところで…… ’ThisWorkbook’ にマクロを記述していますか?

・・・

 =AND(CELL("ROW")=ROW(), CELL("COL")=COLUMN())
で、セルの上下左右の罫線を赤。
 =CELL("ROW")=ROW()
で、セルの上下の罫線を赤。
 =CELL("COL")=COLUNM()
で、セルの左右の罫線を赤。

これを決まった範囲のセルに対して設定。
間違ってもシート全体なんてことはしません。

マクロは
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
  Application.ScreenUpdating = True
End Sub

でやってます。

 ByVal Target As Range
  ↓
 ByVal Target As Excel.Range
の違いはありますが……


・・・余談・・・

いっそマクロを無効にして、[F9]キーで強制的に再計算させるという方法もあります。
(´・ω・`) 面倒だけど、入力しているセルを見失わない限り再計算させる必要もないので、
運用方法としてはありですよ。
そもそもこの[F9]キーを押すのが面倒だからマクロで代用しているってだけですから。

「計算方法」を ”手動” にしておけば、さらに良し。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
言葉足らずで申し訳ありません。
Private Sub Workbook_SheetSelectionChangeはThisWorkbookです。
セルの色塗りの関係もあるため、条件付き書式が妥当と考えています。
条件付き書式も、必要なセルに対して設定しています。

お礼日時:2023/07/14 21:25

VBA Application.EnableEvents 


で 調べてみてください
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
実行マクロに組み込んで、うまくいきました。

お礼日時:2023/07/14 21:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています