プロが教えるわが家の防犯対策術!

こんにちは。
エクセルのVBAについて最近勉強を始めた初心者です。
下記について知恵をお借りしたく、質問させて頂きます。


4つのシートで構成されているブックがあります。(他ブックとの連動はありません)
シート1は集計表で、シート2~4はシート1の元データーが入っています。
本体はシート1のみ手動計算にしたいのですが、現状は以下の方法を取っています。

(1)ブックを開くと、ブック全体を手動計算にする
(2)必要なタイミングで、シート1の特定セル範囲(3パターンあり)を再計算させるマクロを実行
(3)ブックを閉じると、自動計算に戻す

こちらの方法でほぼ問題無いように思えたのですが、
ブックを閉じる時にエクセルの仕様で『'ファイル名.xls'への変更を保存しますか?』と聞かれますよね。
そこで"キャンセル"を選択すると、ブックは開いたまま自動計算モードに戻る=シート1が再計算されてしまうのです。
(このタイミングで(3)(Workbook_BeforeClose)のコードが走っているのだと思います)

先述の通り、本来手動計算にしたいのはシート1に限定されており、
シート2~4は自動計算で構いません。

やりたい事をまとめると、
■ブックを開く  :シート1=手動計算、シート2~4=自動計算
■ブックを閉じる:シート1=自動計算に戻す、ただしキャンセルした場合は手動計算モードを保持

現在のWorkbook_BeforeClose~の部分に何らかのコードを加えたら実現可能?
とも思いますが、そこが分からず行き詰っています…。

上記実現するために良い方法がありましたら、ご教示お願いいたします。



【This Wook Book】に記述しているコード-----------------------

Private Sub Workbook_Open()
'ブックを開くと手動計算にする
Application.Calculation = xlCalculationManual
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'ブックを閉じると自動計算に戻す
Application.Calculation = xlCalculationAutomatic
End Sub

-----------------------------------------------------

A 回答 (3件)

こんな感じでどうでしょう?



Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim ans As VbMsgBoxResult

  If Not ThisWorkbook.Saved Then
    ' 保存されていない場合、ダイアログを出力する。
    ans = MsgBox("'" & ThisWorkbook.Name & "'の変更を保存しますか?", _
       vbExclamation + vbYesNoCancel + vbDefaultButton3)
    Select Case ans
    Case vbYes ' はいを選択した場合
      Cancel = False
      ThisWorkbook.Save  ' ここでブックの保存を行う。
    Case vbNo  ' いいえを選択した場合
      Cancel = False
      ThisWorkbook.Saved = True ' 保存したことにする
    Case vbCancel  ' キャンセルを選択した場合
      Cancel = True   ' 閉じるのをキャンセルする。
    End Select
  Else
    ' 保存されていればそのままブックを閉じる
    Cancel = False
  End If

  ' ブックを閉じる事を選択した場合のみ自動計算モードにする。
  If Not Cancel Then Application.Calculation = xlCalculationAutomatic
End Sub

VBAでエクセルの出す「保存しますか?」の問いに答えた結果を取得することは
できませんが、その問いの出力される条件はわかってますので、それに似た
ダイアログを自前で出力し、答えた結果に従って分岐させているだけです。
なお、マクロはブラウザでの見やすさ優先のため、行頭には全角のスペースを
使用しています。

以上

この回答への補足

お返事が大変遅くなり申し訳ありません。
教えて頂いた方法を検証したところ、ほぼ希望通りの結果になりました。
ただ、”擬似ダイアログ”をキャンセル→ブックを上書き保存→”本物ダイアログ”をキャンセル、とするとやはり自動計算に戻ってしまいました。
これはもうエクセルの仕様なのかな思います。

教えて頂いた方法を元に、もう試行錯誤してみます。
大変勉強になりましたどうもありがとうございました。

補足日時:2011/10/31 19:42
    • good
    • 0

Private Sub Workbook_SheetActivate(ByVal Sh As Object)


If Sh.Name = "Sheet1" Then
MsgBox "手動計算セット 適時F9を押せ"
Application.Calculation = xlCalculationManual
Else
Application.Calculation = xlCalculationAutomatic
End If
End Sub
十分テストして無いが、どうだろう。

この回答への補足

回答ありがとうございます。

教えて頂いたコードでテストしてみましたが、
他のシートに移動した際に再計算されてしまいました。

質問文の通りシート2~4にはシート1の元データが入っています。
元データは随時書き換えられます。

シート1はアクティブ・非アクティブに関わらず常に手動計算モードにしておき、
再計算するのはマクロ実行したときのみ、という形が理想なのですが…。

補足日時:2011/10/27 15:39
    • good
    • 0

シートモジュールで対象シートを選択したときに「手動」にして、他のシートに移動したときに自動計算するのではダメでしょうか?



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


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

この回答への補足

>シートモジュールで対象シートを選択したときに「手動」にして、他のシートに移動したときに自動計算するのではダメでしょうか?

回答ありがとうございます。
対象のシートはマクロ実行でのみ再計算させたいので、
他のシートに移動したときに再計算されては困るのです…。
(ブックを開いた時から閉じる時まで手動計算にしたいです)

補足日時:2011/10/27 15:10
    • good
    • 0

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

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