[[20101214112520]] 『再計算の制御』(かよこ) ページの最後に飛ぶ

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

 

『再計算の制御』(かよこ)

特定のブックのみ再計算を手動にして、その他のブックは
再計算を自動にしたいのですが、うまくいきません。

過去の質問から、特定のブックのThis Workbookに下記を記載したのですが、
その他のブックを開いたときに特定のブックの再計算が実行されてしまいます。

 Private Sub Workbook_Activate()
    Application.Calculation = xlCalculationManual
 End Sub

 Private Sub Workbook_Deactivate()
    Application.Calculation = xlCalculationAutomatic
 End Sub

特定のブックは多数の人が閲覧するので、他のブックに影響が出ないように
制御したいのですが、よい方法があったら教えていただきたいです。(Excelのバージョン:2003)


 Application.Calculation
 は、そのまんまApplicationに対する制御ですから
 他のブックを開いた時にはThisworkbookはDeactivateになりますから
 自動計算になってしまいますね。

 他のブックも再計算できなくてよければActivate,Deactivateでの制御を
 Workbook_OpenとBeforeCloseで制御すれば出来ますが・・・
 他のブックは自動計算にしたいのですよね?

 だとしたら、WorksheetのEnableCalculationで再計算させないようにする
 くらいしか思いつきません。
 ただし、手動でも再計算できませんので再計算させるのにも
 マクロを実行する必要があります。

 ThisWorkbookモジュールに

  Private Sub Workbook_Open()
  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Worksheets
    ws.EnableCalculation = False
  Next ws
  Application.OnKey "{F9}", "ThisWorkbook.再計算実行"
  End Sub

  Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Worksheets
    ws.EnableCalculation = True
  Next ws
  Application.OnKey "{F9}", ""
  End Sub

  Sub 再計算実行()
  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Worksheets
    ws.EnableCalculation = True
  Next ws
  For Each ws In ThisWorkbook.Worksheets
    ws.EnableCalculation = False
  Next ws
  End Sub

 としておけば、そのブックだけ再計算は実行されません。
 再計算はF9キーを押すと実行できるようにしてあります。

 (momo)

 momoさん

 ありがとうございます。かなり理想に近い形になりました。

 大変恐縮なのですが、もう1点だけご教授いただきたいです。
 上記の特定のブックのシート数が多いので、Activeシートだけを
 Shift + F9 で実行したいのですが、動作せず困っております。

 Application.OnKeyについて調べたとところShiftの引数キーは+
 なので、上記マクロの"{F9}"の前に+を追記し、再計算実行()
 の指定をThisWorkbookのActiveSheetだけにしたいのですが、
 思ったように動作してくれません。

 追加質問で申し訳ありません。よろしくお願いします。

 (かよこ)

 変更箇所も方法も合っているはずですがどうしてでしょうね?
 変更したあと、保存して開きなおしてますか?
 Workbook_Openイベントなので、開きなおさないと動作しません。

 以下で動作確認しております。

  Private Sub Workbook_Open()
  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Worksheets
    ws.EnableCalculation = False
  Next ws
  Application.OnKey "+{F9}", "ThisWorkbook.再計算実行"
  End Sub

  Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Worksheets
    ws.EnableCalculation = True
  Next ws
  Application.OnKey "+{F9}", ""
  End Sub

  Sub 再計算実行()
  With ThisWorkbook.ActiveSheet
    .EnableCalculation = True
    .EnableCalculation = False
  End With
  End Sub

 (momo)

 momoさんにお尋ねします。
 同じ ThisWorkbookモジュール に、

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   Call ThisWorkbook.再計算実行
 End Sub

 と、しておくことで (適用セル範囲の指定などは別のこととして)
 通常の「計算方法自動」のように動きそうですが、レスポンスはどうでしょう?
 通常と比べて遅くなりますかね? 
 
(純丸)(o^-')b ※思い付き

 レスポンス的には変わらないと思いますけど。
 実験した訳ではありませんが・・・
 基本的にはセルに入っている数式次第ではないかと。

 ただ、手動のままでシートを切り替えるという事は出来なくなりますよね。
 その辺の仕様(シートを切り替えたら再計算)が用途に合っていればそれでも良いと思います。

 (momo)

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

 >基本的にはセルに入っている数式次第ではないかと

 おっしゃる通りですね。

 読み返してみたら、質問者さんの希望は「再計算を手動にして」だから、
 私の思い付きはよけいなことでした。
 失礼しました。
 
(純丸)(o^-')b

 >私の思い付きはよけいなことでした。
 いえいえ・・・
 たぶん似たような事で純丸さんが御提案されたような事を望む方もいらっしゃるでしょうから
 後々参考にして頂くのには大切な事だと思います。

 私はこういうやりとりが大好きです
 (momo)

 momoさん、純丸さん

 返信が遅くなり申し訳ございません。

 >変更箇所も方法も合っているはずですがどうしてでしょうね?
 >変更したあと、保存して開きなおしてますか?
 >Workbook_Openイベントなので、開きなおさないと動作しません。

 開きなおさないで確認していたようです。昨日ハマっていました(汗)
 また、動作確認済みのコードも記載していただき、大変助かりました。

 今回、オートフィルタの条件を変更した場合に再計算を手動で実行して
 もらうことを想定していた次第なので、これで解決しました。
 (純丸さんのコメントも勉強になりました。)

 御礼申し上げます。
 (かよこ)o(*^▽^*)o

コメント返信:

[ 一覧(最新更新順) ]


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