特定のシートだけ再計算させない方法は?

このQ&Aのポイント
  • 特定のシートだけ再計算させない方法を知りたいです。現在、sheet2をsheet3の数式で参照しており、データ量が多いため再計算に時間がかかります。
  • オプション設定ではすべてのシートが対象になってしまうため、sheet2の計算だけを行いたいです。
  • 再計算させたいシートモジュールには、Worksheet_Activate()内でActiveSheet.EnableCalculation = Falseと記述しています。
回答を見る
  • ベストアンサー

特定のシートだけ再計算させない

お世話になります。 sheet3だけを再計算させないようにするにはどのようにコードを書けばよいでしょうか? sheet2をsheet3の数式で参照しています。 5万件程データがあるので、sheet2に変更があると再計算で時間がかかってしまいます。 オプションで設定してみたところ、すべてのシートが対象になってしまいます。sheet2は計算式があるので、計算させたいのです。 再計算させたいシートモジュールに下記のようにしています。 Private Sub Worksheet_Activate() ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False End Sub どなたかご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

EnableCalculationを設定する時に、計算したくないシートをきちんと指定して設定しないとうまくいきません。 例えば、sheet3だけを再計算しないのなら(他はデフォルトで計算しているのでそのまま) Sub test()  Sheets("Sheet3")..EnableCalculation = False End Sub を実行しておけばOKです。 一度実行しておけばよいので、Worksheet_Activateで毎回設定する必要はありません。 もし、自動で設定するならWorkBook_Openイベントなどでも良いですが、そうするといつも計算が反映されなくなるので、計算を反映したい時には、Trueに設定し直す必要があることをお忘れなく。 ボタンにマクロを登録しておいて、再計算と非計算を切替えるのが良いのではないでしょうか?

mimoule1998
質問者

お礼

fujillinさん、ご回答ありがとうございます。 いろいろな人が使用するので、WorkBook_Openイベントに 設定し、Worksheet_Activateで設定して問題なく動作 出来ました。 ありがとうございました。

関連するQ&A

  • シートの再計算を自動で

    シートの再計算を自動で 先日こちらでお世話になりまして Private Sub Worksheet_Calculate() If WorksheetFunction.CountIf(Range("A1:A10"), 3) > 0 _ Or WorksheetFunction.CountIf(Range("A1:A10"), 5) > 0 Then ActiveSheet.Tab.Color = 255 Else ActiveSheet.Tab.ColorIndex = -4142 End If End Sub というコードでA1からA10の範囲の数字が3か5になるとシート見出しが赤くなるという方法を教えていただきました。http://okwave.jp/qa/q5745367.html おかげさまでそのシートでは3か5になった時、自動でシート見出しが赤くなったのですが、他のシートに同じコードを記述した時に、自動で同じ変化が起こらず、ツール→オプション→計算方法→シートの再計算をしたところシート見出しが赤くなりました。このシートの再計算いちいち行わず、自動で行う事は可能でしょうか?どなたかご教授いただけますと幸いです。

  • エクセル デバッグできるのとできないのがある

    シートイベントについて教えてください。 シートモジュールに --------------------------------------------------------- Option Explicit Private Sub Worksheet_Activate() MsgBox "" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "" End Sub Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "" End Sub --------------------------------------------------------- と記載した時に、 F8で動かせるのは、Worksheet_Activateだけなのですがなぜでしょうか? ほかのイベントは、F8で実行させても、OSの音が鳴るだけで、マクロの実行はされません。 ご回答よろしくお願いします。

  • Excel VBAでのシートの削除について

    Excel VBAで、シート上に配置されたボタンをクリックすることで、メッセージを出さずにそのシートの削除をしたいと思っています。 サンプルとして、シート上(例えばSheet1)にボタンを1個配置し、 ------------------------------------------------------- Private Sub CommandButton1_Click() Application.DisplayAlerts = False Delete Application.DisplayAlerts = True End Sub ------------------------------------------------------- のようにすると、オートメーションエラーが起きます。 そこで、 Application.DisplayAlerts = True をコメントアウトしてやれば実行はできるのですが、その後別のシートで処理を行う場合には、再度メッセージを表示してほしいと思っています。 ためしに、Sheet1削除後にアクティブになるSheet2に次のようなコードを記述しました。Sheet1同様、シート上にボタンを1個配置しています。 ------------------------------------------------------- Private Sub CommandButton1_Click() MsgBox Application.DisplayAlerts End Sub Private Sub Worksheet_Activate() MsgBox "次に出るメッセージはアクティブ直後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts Application.DisplayAlerts = True MsgBox "次に出るメッセージは変更後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts End Sub ------------------------------------------------------- こうすれば、Sheet1削除後、アクティブになった直後はDisplayAlertsがFalse。その後設定変更してTrueになるかとおもったのですが、結果はFalseでした。しかしその後、ボタンをクリックするとTrueが返ってきました。 いろいろ調べましたが、なぜこのような結果になるのかわかりません。よろしくお願いいたします。

  • 現在のシートの全てのピボットテーブルを更新するには

    vba現在のシートの全てのピボットテーブルを更新するには? シートがアクティブになった時にそのシートのピボテをすべて更新したいのですが、 複数あり、 Private Sub Worksheet_Activate() ActiveSheet.PivotTables("ピボットテーブル1").PivotCache.Refresh ActiveSheet.PivotTables("ピボットテーブル2").PivotCache.Refresh ・ ・ ・ End Sub とやっていくのは面倒なので、「現在のシートの全てのピボットテーブルを更新」と言うことをやりたいのですが そのようなコードはありますか?

  • エクセルのシートの移動禁止方法について

    'UserForm1 Public 着目シート名  Public シート変更禁止 As Boolean Private Sub CommandButton1_Click() 着目シート名 = "Sheet1" シート変更禁止 = True End Sub Private Sub CommandButton2_Click() 着目シート名 = "Sheet2" シート変更禁止 = True End Sub 'ThisWorkbook Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) If シート移動禁止 = True Then Worksheets(着目シート名).Activate End If End Sub '標準モジュール Sub test() UserForm1.Show End Sub 'UserForm1には、CommandButton1,CommandButton2のみ貼り付けています。 'フォームは、ShwoModal=Falseにしています それぞれのモジュールに上記のコードを書いて、フォーム上のボタンを押すと、 シートの変更が出来ないようにしようと考えています。 シートは、任意に変更しようと考えていますので、シート名の指定に変数を使いたいのですが、スコープの問題からか? 着目シート名がEmpteyになってしまい、自由に変更が可能となってしまいます。 何が、悪いのでしょうか? どなたか詳しい方教えて頂けないでしょうか?宜しくお願いいたします。 (Workbook_SheetDeactivateによる方法は、ここで教えて頂いた方法をアレンジしようとしている部分です。) QNo.2503758の続きの質問です。

  • シート名でなくindex番号でシートの移動をしたい

    windows7 Excel2007でマクロ作成の初心者です。以下の点で困ってます。ご指導お願いします。 シートの次ページへ、およびページの前に戻るというコードをつくりましたが、文字列でなく、indexを使ってつくりたのでですが、思うようになりません。 現在のコードは Private Sub 次ページへ_Click() If ActiveSheet.Name <> "23.日本太郎" Then ActiveSheet.Next.Activate End If End Sub ---------------------------------- Private Sub 前に戻る_Click() On Error Resume Next If ActiveSheet.Name <> "1.日本花子" Then ActiveSheet.Previous.Activate End If End Sub これを Dim i As Integer For i = 1 To Worksheets.Count - 6 などを使って作りたいです、なぜかというとシートの増減で名前が変わったとき、いちいち名前を変更しなければならないからです。

  • Excel VBAのFor...Next ステートメントについて

    大学での研究に使うシミュレーション・プログラムのひな形を作成して おりまして、不明な点が出てしまったので質問させて頂きます。  シートを4つ使うシミュレーションで、シート1のA1に変数(0.5から2まで、0.05ずつ)を挿入し、 シート2のA1で計算、シート3のA1で集計・計算、 シート4のA1にそれぞれの変数を挿入した結果を縦方向に記入したいと 考えております。  VBAはまだ習い始めたばかりなので、かなり下手くそですが、なんとか コードを書いてみました。 Sub macro1() '画面更新停止 Application.ScreenUpdating = False '自動計算停止 ActiveSheet.EnableCalculation = False Dim sheet1 As Worksheet Set sheet1 = Worksheets(1) 'シート1をアクティブにする Sheet1.Activate '変数を宣言する For i = 0.5 To 2 Step 0.05 For j = 1 To 30 'シート1のパラメータの値(A1)を0.5から2まで 0.05 刻みで変化させる Sheet3.Cells(1, 1).Value = i '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート2をアクティブにする Sheet2.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート3をアクティブにする sheet1.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート3(A1)の値をシート4のA列のj列目にコピー&ペースト sheet1.Range("A1").Value = Sheet4.Range("A" & j).Value Next Next End Sub このコードを実行してもシート4の変数の結果が全て同じになって しまいました。 どの部分が不適切でしょうか。 是非ともアドバイスをお願い致します。

  • ExcelのFor...Nextステートメントについて

    For...Nextステートメントについて質問させて頂きます。 シート1のA1に変数(0.5から2まで、0.05ずつ増加)を挿入し、 シート2のA1で「シート1のA1のそれぞれの変数×2」を計算、 シート3のA1からシート2のA1の結果をそれぞれ縦方向に表記して しよう考えております。 Sub macro1() '画面更新停止 Application.ScreenUpdating = False '自動計算停止 ActiveSheet.EnableCalculation = False Dim sheet1 As Worksheet Set sheet1 = Worksheets(1) 'シート1をアクティブにする sheet1.Activate '変数を宣言する For i = 0.5 To 2 Step 0.05 For j = 1 To 30 'シート1のパラメータの値(A1)を0.5から2まで 0.05 刻みで変化させる sheet1.Cells(1, 1).Value = i '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート2をアクティブにする Sheet2.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート3をアクティブにする Sheet3.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート2(A1)の値をシート3の j 列目にコピー&ペースト Sheet3.Range("A" & j).Value = Sheet2.Range("A1").Value Next Next End Sub 上記のコードですと、シート3にA1、A2...にそれぞれ表記される値は全て 同じになりますが、私のしようとしている事は、 シート3のA1にシート1が0.5の時の計算結果、 シート3のA1にシート1が0.55の時の計算結果....というように したいのです。 どのようにすれば良いでしょうか。 VBAにお詳しい方、アドバイス宜しくお願い致します。

  • CSVデータをEXCELシートに展開したい

    CSVデータをEXCELシートに展開しようとしています。 シート1にボタンを用意して、クリックするとシート2に展開されるというようなことをしたいのです。 以下のコード(マクロを組んで作られるコードです)だと、シート2に取り込まれないです。 どのようにすればシート2に展開されるでしょうか? Private Sub CommandButton2_Click() Dim SH As Worksheet ' Set SH = Worksheets("Sheet2") With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:\temp\test1.", _ Destination:=Range("A1")) .Name = "test1 .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = xlWindows .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) .Refresh BackgroundQuery:=False End With よろしくお願いします。

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

専門家に質問してみよう