
こんにちは。
エクセルの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
-----------------------------------------------------
No.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でエクセルの出す「保存しますか?」の問いに答えた結果を取得することは
できませんが、その問いの出力される条件はわかってますので、それに似た
ダイアログを自前で出力し、答えた結果に従って分岐させているだけです。
なお、マクロはブラウザでの見やすさ優先のため、行頭には全角のスペースを
使用しています。
以上
この回答への補足
お返事が大変遅くなり申し訳ありません。
教えて頂いた方法を検証したところ、ほぼ希望通りの結果になりました。
ただ、”擬似ダイアログ”をキャンセル→ブックを上書き保存→”本物ダイアログ”をキャンセル、とするとやはり自動計算に戻ってしまいました。
これはもうエクセルの仕様なのかな思います。
教えて頂いた方法を元に、もう試行錯誤してみます。
大変勉強になりましたどうもありがとうございました。
No.2
- 回答日時:
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はアクティブ・非アクティブに関わらず常に手動計算モードにしておき、
再計算するのはマクロ実行したときのみ、という形が理想なのですが…。
No.1
- 回答日時:
シートモジュールで対象シートを選択したときに「手動」にして、他のシートに移動したときに自動計算するのではダメでしょうか?
Private Sub Worksheet_Activate()
Application.Calculation = xlCalculationManual
End Sub
Private Sub Worksheet_Deactivate()
Application.Calculation = xlCalculationAutomatic
End Sub
この回答への補足
>シートモジュールで対象シートを選択したときに「手動」にして、他のシートに移動したときに自動計算するのではダメでしょうか?
回答ありがとうございます。
対象のシートはマクロ実行でのみ再計算させたいので、
他のシートに移動したときに再計算されては困るのです…。
(ブックを開いた時から閉じる時まで手動計算にしたいです)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- Excel(エクセル) Application.Volatile利用(excel2003) 1 2023/02/06 10:11
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/06/01 14:45
- Visual Basic(VBA) エクセルのマクロについて教えてください。 5 2023/06/02 08:44
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
-
特定のシートのみ再計算させない方法は?
Excel(エクセル)
-
特定のシートだけ再計算させない
Excel(エクセル)
-
【エクセル】あるセルのみ自動再計算させない方法
Excel(エクセル)
-
-
4
エクセルファイルをオープンしたときの再計算について
Excel(エクセル)
-
5
エクセル関数 RAND関数で数字を固定させるには!?
その他(Microsoft Office)
-
6
エクセルでの自動計算と手動計算
Excel(エクセル)
-
7
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
8
数式を残したまま、別のセルに答えを表示する
Excel(エクセル)
-
9
複数の文字列のいずれかが含まれていたらTRUEを返す関数について
Excel(エクセル)
-
10
IF関数で空欄(")の時、Nullにしたい
その他(Microsoft Office)
-
11
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
12
「自動」と言うのはどのタイミングで更新される?
Excel(エクセル)
-
13
Excelのテーブル上のセルの保護はどうすればいい?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】アクティブセルの時...
-
VBAでブックを非表示で開いて処...
-
エクセルの関数 ENTERを押...
-
エクセルを共有するとPCによっ...
-
Excelでブックの共有を掛けると...
-
Excelファイルをダブルクリック...
-
Excelの新しい空白のブックを開...
-
Excel(2010)のフィルターが保...
-
Excelで複数ブックの同一セルに...
-
別ブックから入力規則でリスト...
-
Excel起動時に特定のワークシー...
-
エクセルファイルをオープンし...
-
エクセルで参照しているデータ...
-
Excelの警告について
-
同じフォルダへのハイパーリン...
-
VBAでブック保護非保護を判定す...
-
WorkBooksをオープンさせずにシ...
-
エクセルで別ブックをバックグ...
-
エクセルで50行ごとに区切った...
-
参照したいブックのパス名に"["
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでブックを非表示で開いて処...
-
エクセルを共有するとPCによっ...
-
エクセルの関数 ENTERを押...
-
Excelの警告について
-
Excelファイルをダブルクリック...
-
エクセルで参照しているデータ...
-
WorkBooksをオープンさせずにシ...
-
Excelでブックの共有を掛けると...
-
Excel(2010)のフィルターが保...
-
Excelで複数ブックの同一セルに...
-
エクセルファイルを開かずにpdf...
-
エクセルにおける,「ブック」...
-
同じフォルダへのハイパーリン...
-
エクセルで別ブックをバックグ...
-
フォルダ内の複数ファイルから...
-
VBA バックグラウンドで別ブッ...
-
エクセルでウィンドウの枠固定...
-
ブックのピボットを別ブックに...
-
フォルダ内の複数ファイルから...
-
エクセルで50行ごとに区切った...
おすすめ情報