[[20180619225752]] 『application.screenupdatingを書く場所』(ガスト) ページの最後に飛ぶ

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

 

『application.screenupdatingを書く場所』(ガスト)

お世話になっております

1モジュールに5〜6個プロシージャがありまして、
各プロシージャに
application.screenupdating…
application.xlcalculationmanual…
と諸々停めるもの複数とプロシージャ終了間際には同じ数だけ再開する諸々

モジュール内 同じ記載で数十行使ってしまい不格好な状態です
いかんせんスマートな記載法も、思い至りません
皆さまこれらをどのように記載されているのでしょうか
お知恵をお貸しいただけたら幸いです

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


 >application.screenupdating

 基本的に使わない。
 私的には、あると余計に遅くなる感じがするし、フリーズしているのかもわからなくなるから。
 画像関係や別のブックを開いてそれを魅せたくないときぐらい。

 >application.xlcalculationmanual

 データが多いシートでオートフィルタする時ぐらい。
(BJ) 2018/06/20(水) 01:47

そもそも、何をやるものなのか分かって記述してるんでしょうか?

Application.ScreenUpdatingの方は、完成したら好みでつければいいとおいますが、そもそものコードを精査して無駄にブックやシートを切り替えたり、1セルずつ出力してないかってところもちゃんとチェックしたほうがいいような気がします。

Application.xlCalculationManualのほうは、がちがちに数式組んだブックをマクロでいじることを私はしないんでいつも、ブックの設定に依存させてますね。(マクロ上では特に設定しない)

それでもどうしてもいじりたいっていうのであれば

    Sub 高速化()
        With Application
            .ScreenUpdating = False
            .EnableEvents = False
            .Calculation = xlCalculationManual
        End With
    End Sub

        Sub 高速化解除()
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = xlCalculationAutomatic
        End With
    End Sub

としておいて、Callしたらいいんじゃないですか?
(もこな2) 2018/06/20(水) 02:02


個人の感想です。

 >application.screenupdating
ぼくもほぼ使わないですね。
どうせ時間が掛かるなら、画面がチラチラ動いている方が、
仕事やってるな感があって、ストレスが少ない気がします。

画面を止めてると、固まってるのか動いてるのかよくわからんので、
ひたすら待ってると余計ストレスになるきがします。
(まぁ、進捗状況を表示するってのもありなんですが。)

それから、ネット上を漁ってみても、昔は格段に速くなったようですが、
最近のバージョンでは、気休め程度ではないかという記事をいくつか見かけた気がします。

まぁ、やってくれてるなーって解るのが好みなだけです^^;
(画面がチラチラするのが許せない人も多いみたいですが^^;)

 >application.xlcalculationmanual
は、最初に設定しておくのも一案ですが、
オプションの設定って、ブックを開く順番で
変わる可能性があるので、
マクロで処理するブックにはそんな処理速度に影響が出るほど、
大量の式を置いておかなければ、いいだけの話な気がしないでもないです。
当然作業の途中では一時的に数式を入力してエクセル君に計算を任せる場面がありますが、
操作するときは値にしておけば再計算が発生しませんよね?
そういうことも考慮しておいてもいいと思います。

当然、もこな2さんが提案されているように、
何度も同じ記述が必要な場合は、それ用のサブルーチンを用意して再利用
するのが望ましいと思います。

参考になれば。
(まっつわん) 2018/06/20(水) 08:30


各プロシジャの中に書くのではなく、それらを順次呼び出す親プロシジャでも用意して、そこで抑止してから各プロシジャをコール、全部終わった後に戻すという方法でも良いと思いますよ。
(???) 2018/06/20(水) 10:04

 「ScreenUpdatingほぼ使いません」派の人の書き込みが多かったので
 ちょっと反対意見(っぽいもの)も入れてやろうと、出しゃばらせて頂きます^^;

 例えば私の手元にある処理で

  1.雛形ブックをコピーしてリネーム
  ↓
  2.そのブックを開く
  ↓
  3.内容を書き込む
  ↓
  4.保存して閉じる

 を200回ちょっと繰り返す工程があるんですが、

 ScreenUpdatingをオフった状態で所要時間20分
 オフらなければ25分ちょいといったところです。

 大した時間短縮にはならない様にも見えますが、2割短縮はデカいですよ。
 この後に続けて幾つかの処理をしなければならない様なお仕事ですから
 僅か5分の短縮でもありがたいものです。

 但し、ScreenUpdatingをオフった代償として
 進行状況を表示させる為の工夫が別途必要になりましたけどwww ^^;

 まっつわんも仰ってますけど、
 オペレータにストレスを感じさせないように
 っていう観点で採否や適用範囲を判断する事も重要なんだなと思ったりしちゃいます。

 質問に対しては一切何も答えてないわ...  お、お邪魔しました〜^^;

(白茶) 2018/06/20(水) 14:26


私は昔、もこもこ2さんの言うような方式で対応していた頃がありました。

しかし単純に纏めただけでは、プロシャージャからプロシャージャを呼び出したときに処理途中でTrueになってしまうという問題がありますので、下記のようなモジュールを作成して対応していました。
(今となってはイベントハンドラと処理するプロシャージャを分離して書いているので滅多に使いませんが・・)

尚、駆け出しの頃に作成したままなので、もし使うなら改良をおすすめします。

Option Explicit
Option Private Module

Const MaxStack = 10
Public ASU(1 To MaxStack) As Boolean
Public AEE(1 To MaxStack) As Boolean
Public ACC(1 To MaxStack) As XlCalculation
Public StackCount As Long

'再描画/イベント/再計算の状態をスタックに積んでからOFF
Sub ProcLockPush()

    StackCount = StackCount + 1
    If StackCount > MaxStack Then StackCount = 1
    ASU(StackCount) = Application.ScreenUpdating
    AEE(StackCount) = Application.EnableEvents
    ACC(StackCount) = Application.Calculation
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
End Sub

'再描画/イベント/再計算をスタックから復元(ONまたはOFF)
Sub ProcLockPop()

    If StackCount > 0 Then
        Application.ScreenUpdating = ASU(StackCount)
        Application.EnableEvents = AEE(StackCount)
        Application.Calculation = ACC(StackCount)
        StackCount = StackCount - 1
    End If
End Sub

'スタックを開放して無条件に全てON
Sub ProcLockAllReset()

    StackCount = 0
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

せっかくなのでApplication.Calculation = xlCalculationManualの危険性を書いておきます。
実はこのフラグ、エクセル全体のフラグなのにブックに保存されるんですよね。
そうすると、最初に開いたブック(エクセルを起動させたブック)の設定が、その後開いた全てのブックに影響します。
そのうち、あちこちのブックに手動計算が感染していって、いつか痛い目を見ます。

したがってScreenUpdatingはともかく、Calculationを変更するのは必要な部分だけにすることを強くおすすめします。
(なと) 2018/06/20(水) 15:21


コメント返信:

[ 一覧(最新更新順) ]


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