[[20141105201714]] 『Application.ScreenUpdating = True について』(YNo) >>BOT

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

 

『Application.ScreenUpdating = True について』(YNo)

お教えください。

 インストラクターのネタ帳で拝見したのですが、アクティブセルのある行(・列)を目立たせるの記事
 h ttp://www.relief.jp/itnote/archives/001406.php

 の中で、セルに条件付き書式で 条件に =CELL("ROW")=ROW() で色を付け、

 ThisWorkbook に

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

 とすることで選択行に色が付き上手くいくのですが、、、、この時の Application.ScreenUpdating = True は
 画面の更新を強制的に行わせる、、、、
 と説明されているのですがこの時 Application.ScreenUpdating = False としても
 問題なく動作してしまうのですが、
 これはどのように理解したらいいのでしょうか、、、、

 False だったらうまくいかないと思ったのですが、、、、、、
 よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 直接の回答ではありませんが、参考過去ログです。

[[20141011233727]] 『選択行全体に色をつけたいのですが教えて下さい』(taronippon)
(カリーニン) 2014/11/05(水) 21:02


 よく見たらYNoさんですね。私のレスはスルーしてください。
(カリーニン) 2014/11/05(水) 21:05

適当なこと言わせてもらうと、end sub で Trueに戻るからとか
(マナ) 2014/11/05(水) 21:38

↑試してみたら、本当に適当でした。無視して下さい。
(マナ) 2014/11/05(水) 21:46

 こんなコードと
 '------
 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
      MsgBox Application.ScreenUpdating
      Application.ScreenUpdating = True
      MsgBox Application.ScreenUpdating
      MsgBox Application.ScreenUpdating
 End Sub
 '------

 こんなコード
 '------
 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
      MsgBox Application.ScreenUpdating
      Application.ScreenUpdating = False
      MsgBox Application.ScreenUpdating
      MsgBox Application.ScreenUpdating
 End Sub
 '------

 で試してみると、
 上側は 二つ目のメッセージボックスが表示される前にアクティブ行に色が付きます。
 下側は、三つ目のメッセージボックスが終わった後にアクティブ行に色が付きます。

 >end sub で Trueに戻るから
   (End Sub の直前 っぽいですが)
 でよさそうに思いますが。。。?
  
(HANA) 2014/11/05(水) 22:28

同じようなコードで確認して、予想通りと最初は思ったのですが
次に1行目にブレークポイントを設定して、ステップ実行すると
何故か、2行目実行直後に色がついたので違ったかなと考えました。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox Application.ScreenUpdating
    Application.ScreenUpdating = False
    MsgBox Application.ScreenUpdating
 End Sub

(マナ) 2014/11/05(水) 23:06


 ステップ実行中は
 Application.ScreenUpdating = False
 にしていても、画面が更新されたと思います。
  
(HANA) 2014/11/05(水) 23:21

そういうことですか。
マウスカーソルを当てるといつもTrueなのも、そういう意味ですか。
ありがとうございました。

(マナ) 2014/11/06(木) 00:05


カリーニン さま

 今回もありがとうございます。前回の件はお教えいただいたコードでうまくいっている のですが、偶然インストラクター(さん)の
ネタ帳で、今回のコードを見つけたので試してみました。

マナ さま HANA さま

 ありがとうございます。

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 Application.ScreenUpdating = FALSE
  MsgBox Application.ScreenUpdating
End sub  

 、、では False のメッセージが返るのですが、、、更新されます。

 ごめんなさい、、よく理解できないのですがカーソルをあてる【希望の行をクリックす る?)と True になるという理解で
いいのでしょうか?

 よろしくお願いします。

(YNo) 2014/11/06(木) 07:21


 MsgBox Application.ScreenUpdating
 を、先頭にも入れてみて下さい。

 すると、FALSEで終わったはずなのに 最初はTRUEで始まります。

 また、私が載せた上側のコードですが
 最初のメッセージボックスに「OK」を押しても変わりません。
 次のメッセージボックスが表示されたら、表示が変わります。
 次のメッセージボックスが表示されるまでの間に
      Application.ScreenUpdating = True
 が実行される為と考えられます。(まぁ、その様に作ったコードですが。)

 下側のコードですが、
 三つ目のメッセージボックスに「OK」を押すまで、表示は変わりません。
 三つ目のメッセージボックスに「OK」を押すと、表示が変わります。
 そして、最初のメッセージボックスは、TRUEで始まります。

 つまり、三つ目のメッセージボックスを表示するコードが終わった後
 コード製作者の意図ではありませんが                  ~~~~~~~~~~
      Application.ScreenUpdating = True
 になり、よって 表示が変わると考えられます。

 >False のメッセージが返るのですが、、、更新されます。
 FALSEのメッセージが表示されている状態では、更新されませんよね?
 メッセージボックスを「OK」して、コードが次の行に進んだ時
  厳密に、End Subの前なのか後なのかはわかりませんが
 表示が変わっていると思います。

 私の下側のコードだと
 二つ目のメッセージボックスに「OK」を押しても、表示は変わりません。
 三つ目のメッセージボックスに「OK」を押したとき、表示が変わりますので
      Application.ScreenUpdating = False
 が実行されて表示が変わったり
      MsgBox Application.ScreenUpdating
 に「OK」と押したから表示が変わったのではなく
 最後のメッセージボックス(コード)が終わったから表示が変わったと考えるのが
 自然じゃないかと思います。

 たとえば、こんなコード
    Sub TEST()
        Application.ScreenUpdating = False
        Range("A1").Value = Range("A1").Value + 1
    End Sub
 画面の更新は「False」で終わっていますが 実行するたびに
 A1セルの表示は変わりますよね?
 ずっと画面の更新をしないなら、A1セルの値はずっと最初の表示のまま変わらないハズです。
  
(HANA) 2014/11/06(木) 09:42


 基本的にApplication.ScreenUpdating = false は、subを抜けると
 元に戻るらしい。
 それをあまり信用できない私はコードでtrueで元に戻すようにしてます。

 おまけ、
    Sub TEST()
        Application.ScreenUpdating = False
        Range("A1").Value = Range("A1").Value + 1
        Application.Wait Now() + TimeValue("00:00:05")
    End Sub
 BJ

 大元の質問に立ちかえるけど、条件付き書式に設定したCELL関数が計算されればよいのですよね?
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Target.Calculate
    End Sub
 これでも随時動作したので、
 Application.ScreenUpdating = False
 にこだわる必要はないのかなーとか。
(稲葉) 2014/11/06(木) 11:31

[[20100709150607]]
 こんな記事もありました。

 条件付き書式を計算有効/無効を切替する方法でもできました。
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        ActiveSheet.EnableFormatConditionsCalculation = False
        ActiveSheet.EnableFormatConditionsCalculation = True
    End Sub
 なので、条件付き書式を計算させたくないなら、Falseにしておけばいいのかなと。

(稲葉) 2014/11/06(木) 13:06


BJ さま

> 基本的にApplication.ScreenUpdating = false は、subを抜けると

 >元に戻るらしい。

 了解です。信用?よりあまり理解できないのですが、利用時は True に戻すようにします。

 5秒遅れ? これは False でも実行できることの証明?説明?? 遅れて加算はわかりましたが、よく理解できていません。
 ありがとうございました。

稲葉 さま

> Target.Calculate 、、、、

 でも問題なくできました。
>Application.ScreenUpdating = False
> にこだわる必要はないのかなーとか。
了解です、こだわるというより理解できなかったものですから、、、、
ありがとうございました。

HANA さま

> MsgBox Application.ScreenUpdating

 >を、先頭にも入れてみて下さい。
 >すると、FALSEで終わったはずなのに 最初はTRUEで始まります。

 そのとおりですね、これはやってみたのですが理解できずどこかに True を書いてい るのかなと思っていました。
 別のマクロで  Application.ScreenUpdating = FALSE だけを書いて False にして から、したつもりで、やっても
 True になっていました。

 > >False のメッセージが返るのですが、、、更新されます。
 > FALSEのメッセージが表示されている状態では、更新されませんよね?
 はい、OKをクリックするまでは変わりません。

 >たとえば、こんなコード、、、、
 ちゃんと増えていきます
 何か不思議な気がするのですが、、、、

 私のやり方がおかしいのではなく、今回の場合は True でも Fa;lse でも動くことが わかりました。

 ありがとうございました。。。

(YNo) 2014/11/06(木) 13:34


稲葉 さま
ごめんなさい、13:06のレス見落とし、13:35に返信したのですが、消えて?しまいました。
 >条件付き書式を計算有効/無効を切替する方法でもできました。
 これからやってみます。
 ありがとうございました。

(YNo) 2014/11/06(木) 14:52


 >5秒遅れ? これは False でも実行できることの証明?説明??
 >遅れて加算はわかりましたが、よく理解できていません。

 Application.ScreenUpdating は、画面の更新を止めているだけだから、
 再計算は、書き込み終了で実行されるということなんだけれど、
 条件付き書式の部分を読んでいなかったので中途半端でした。
 すみません。
 こう書いた方がわかりやすかったですね。

    Sub TEST()
        Application.ScreenUpdating = False
        Range("A1").Value = Range("A1").Value + 1
        MsgBox "現在のA1の値は、" & vbLf & Range("A1").Value
        Application.Wait Now() + TimeValue("00:00:03")
    End Sub

BJ? さま

ありがとうございます。

 >再計算は、書き込み終了で実行されるということなんだけれど、、、
 了解です、ありがとうございました。

稲葉 さま

 > こんな記事もありました。
 ごめんなさい、よく理解できません、ゆっくり読ませていただきます。

 >条件付き書式を計算有効/無効を切替する方法でもできました。
 >    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 >       ActiveSheet.EnableFormatConditionsCalculation = False
 >       ActiveSheet.EnableFormatConditionsCalculation = True
 >   End Sub
 > なので、条件付き書式を計算させたくないなら、Falseにしておけばいいのかなと。

 これもよく理解できません、 False False だと計算しないのですがどのように使うのでしょうか?

よろしくお願いします。。

(YNo) 2014/11/06(木) 17:55


 なんだか、話がかみ合ってない様に感じるのですが。

 >>条件付き書式を計算させたくないなら、Falseにしておけばいいのかなと。
 >False False だと計算しないのですがどのように使うのでしょうか?

 条件付き書式を計算させたくない = アクティブセルのある行に色を付けなおしたくない
 のですか?
  
(HANA) 2014/11/07(金) 15:40

HANA さま

ありがとうございます。
もともと Application.ScreenUpdating = false  でも選択行に色が付くのが疑問でお尋ねしたのですが、、、

 言葉足らず、説明不足で、かみ合わなく?なってしまいました、お詫びします。

 選択行に色を付けたいのです。問題は解決したのですが、稲葉さまの、、、

 >条件付き書式を計算有効/無効を切替する方法でもできました。
 、、、、の使用法がわからず、(どのようなときに使用するのか、)最後にお尋ねした次第です。

ありがとうございました。

(YNo) 2014/11/07(金) 16:29


 いや、もともとの質問は分かってます。
 で、その話が済んだ事も分かってます。

 稲葉さんの書き込みに対するお返事が
 かみ合ってない様に感じたので。。。

 >使用法がわからず
 が、今回の
   アクティブセルのある行に条件付き書式でハイライトさせようと思う。
   その際、アクティブセルを移動させたら直ちに実行したい。
 と言う事であれば、稲葉さんが書いておられるコードを
 そのまま貼り付けてみてもらえたら良いと思います。

 単純に
  Application.ScreenUpdating だけじゃなく
  書き方によっては ActiveSheet.EnableFormatConditionsCalculation を使っても実現可能だね。
 と書いてあるだけです。

 >どのようなときに使用するのか
 が、「条件付き書式を実行させたくない時ってあるの?」と言う事であれば
 場合によっては有ると思いますが。。。
 FALSE(無効)のままで終わるのは、今回の「選択行に色を付けたいのです。」とは
 また別のお話になると思います。
  
(HANA) 2014/11/07(金) 17:18

HANA さま
ありがとうございます。

ごめんなさい、理解力不足で申し訳ありません。

 >どのようなときに使用するのか。。。。。
 了解です。

稲葉さまの

 >条件付き書式を計算有効/無効を切替する方法でもできました。
 >    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 >       ActiveSheet.EnableFormatConditionsCalculation = False
 >       ActiveSheet.EnableFormatConditionsCalculation = True
 >   End Sub

 これをこのまま書くとしか理解できなかったのでなんで False True なのかわかりませんでした。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 ’    Target.Calculate
 ’    Application.ScreenUpdating = True
 ’ の代わりに、、、
    ActiveSheet.EnableFormatConditionsCalculation = True
 ’と書いていいのでしょうか?、、、
 End Sub

 Target.Calculate
 Application.ScreenUpdating = True ですとセンタK行は色がつくのですが、

 ActiveSheet.EnableFormatConditionsCalculation = True ですと選択行を変えても色 はつかないのですが、、、、、

 勉強不足ですね、、、すみませんよろしくお願いします。

(YNo) 2014/11/07(金) 20:10


 色がつく=条件付き書式が再評価される書き方

 1.
  Application.ScreenUpdating = True
 2.
  Application.ScreenUpdating = False
 3.
  Target.Calculate
 4.
  ActiveSheet.EnableFormatConditionsCalculation = False
  ActiveSheet.EnableFormatConditionsCalculation = True

 ほかにもあるかもしれませんが、このスレで出てきたのは
 以上の4件です。

 1〜3は一行だけで良いですが、4は2行でひとまとまりです。

 1.画面更新をすると、再評価される。
 2.画面更新を停止しても、マクロが終わったら自動的に画面更新されるので、そのタイミングで再評価される。
 3.再計算すると、再評価される。
 4.一旦無効にし、その後有効にすると再評価される。

 2番が「false」だけで良いのは、マクロが終わったら勝手に「true」になるからです。
 4番が「false」だけでダメなのは、マクロが終わっても勝手に「true」にならないからです。

 >ActiveSheet.EnableFormatConditionsCalculation = True ですと選択行を変えても色 はつかないのですが、、、、、
 有効な状態で、有効を設定しても 再評価されないのでしょう。
 4番の様に、一旦無効にして 有効にすると、再評価される様です。
  
(HANA) 2014/11/07(金) 23:07

 HANAさんからすでに回答ついていますが、携帯でがんばってに頑張って入力したので投稿します!

 噛み合わないなぁ
 条件付き書式を無効にしてから、有効にすることで
 再計算させていますので、分解したら意味無いですよね!

 今回の疑問は、スクリーンアップデートプロパティーを
 Trueに設定する(以前の状態問わず)と再計算が実行される
 事がわかり、Falseに設定した状態でSubをぬけると
 自動的にTrueに設定されることされることもわかりましたよね

 んで、Falseのときでも再計算されてしまう理由はわかりま
 したが、明示的に再計算させない方法としてひとつの案を
 提示しただけです
 具体的な使い道としては、特にありません

(稲葉) 2014/11/07(金) 23:26


HANA さま 稲葉 さま

丁寧な説明ありがとございます。

 やっと理解できました。ありがとうございます。
 理解力不足で申し訳ありません。これに懲りずに今後ともよろしくご指導ください。
 OTですが、ボケ防止に頑張っています。ありがとうございました。

他の皆さんもありがとうございました。

お世話様になりました。

(YNo) 2014/11/08(土) 06:55


はじめまして、参考にさせていただきました。

色がつく=条件付き書式が再評価される書き方
1.
 Application.ScreenUpdating = True
2.
 Application.ScreenUpdating = False
3.
 Target.Calculate
4.
 ActiveSheet.EnableFormatConditionsCalculation = False
 ActiveSheet.EnableFormatConditionsCalculation = True

1.2.は画面がちらつくのが気になります。
3.は再計算が走るタイミングで、クリップボードが解除され
コピー&ペーストができなくなりました。

なので、僕の場合は4の方法を使わせていただきました。

(GingerAle) 2015/12/09(水) 10:57


 別に参考にするのはいいけど、わざわざ書く必要はないかと。1年以上前の質問だし。
(bi) 2015/12/09(水) 11:04

コメント返信:

[ 一覧(最新更新順) ]


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