VBA技術解説
手動計算時の注意点と再計算方法

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-10-09

手動計算時の注意点と再計算方法


セルを変更する度に再計算が動いてしまうと処理時間が遅くなってしまいます。
そこでマクロVBAの中で、計算方法を手動にすることで対処することになります。
このとき処理結果が期待した結果にならないといった事が起こらないように、
手動計算時の注意点と再計算方法について解説します。


計算方法の切り替え:自動⇔手動

マクロ VBA Calculate

計算方法をVBAで切り替えるには、
ApplicationのCalculationプロパティを設定します。

Application.Calculation = 設定値

設定値


xlCalculationAutomatic 自動
xlCalculationManual 手動
xlCalculationSemiautomatic データテーブル以外の自動

Application.Calculation = xlCalculationManual
この記述をすることで、
これ以降、手動計算となり、自動では再計算は行われなくなります。
この設定は、マクロ終了後も引き続き有効となりますので、
必要に応じて、xlCalculationAutomaticに戻してください。

計算式を入れると必ず計算される

計算方法が手動の場合は、
数式が参照している先のセル値が変更になっても再計算されません。
もちろん、計算方法を自動にした時点で再計算されますが、
マクロVBA実行中でxlCalculationManualになっている状態では、セル値は正しい値にはなっていません。

手動計算になっていても、
セルに計算式を入れた場合は、計算式を入れたセルについては必ず計算が行われます。

マクロ VBA Calculate

C1:C5にA列/B列の計算式を入れます。

Sub sample1()
  Application.Calculation = xlCalculationManual
  Range("C1:C5").Value = "=A1/B1"
  Call valuePrint
End Sub

マクロ VBA Calculate

Range("C2:C5").Value = "=A2/B2"
Valueプロパティは、Formulaプロパティでも同じです。
Range("C2:C5").Formula = "=A2/B2"

手動計算時であっても、
VBA内で計算式を入れたセルについては、特に意識的に再計算を行わなくても問題はありません。
しかし、これから説明するような場合には、VBAで再計算を行わない限り再計算されません。

セルのコピーでは再計算されない

数式の入っているセルがあり、そのセルと同じ計算式を入れたい場合、普通はセルをコピーするでしょう。
以下のように、
C1セルに数式が入っているので、これと同じ数式をC2:C5に入れる場合です。

マクロ VBA Calculate

Sub sample2()
  Application.Calculation = xlCalculationManual
  Range("C1").Copy
  Range("C2:C5").PasteSpecial Paste:=xlPasteFormulas
  Application.CutCopyMode = False
End Sub

マクロ VBA Calculate

再計算が行われていません、コピー元のC1の値がそのまま表示されています。
では、コピー方法を変えてみましょう。



Sub sample3()
  Application.Calculation = xlCalculationManual
  Range("C1").Copy Destination:=Range("C2:C5")
End Sub

マクロ VBA サンプル画像

オートフィルでもやってみましょう。

Sub Macro4()
  Application.Calculation = xlCalculationManual
  Range("C1").AutoFill Destination:=Range("C1:C5")
End Sub

マクロ VBA Calculate

いずれの方法でも再計算されません。
セルをコピーした以降のVBAにおいて、これらの(計算式を入れた)セルの値を使うとしたら・・・
これでは当然正しい結果にならないことになります。

言うまでもありませんが、これはシートで手動操作した時と同じです。
シート操作で再計算されないものはVBAでも同じです。
このような場合に、ショートカットF9を使う事は頻繁にあるのではないでしょうか。
VBAでは、この再計算を行う手段がいくつも用意されています。

いろいろな再計算方法

計算方法を手動→自動→手動
Application.Calculation = xlCalculationAutomatic
Application.Calculation = xlCalculationManual
いったん自動に戻した時点で再計算が行われます。
自動にした以降で、他のセル値を変更する時の為に手動にしたい場合は、再度手動にしておけば良いでしょう。
全ブックを再計算
ApplicationのCalculateメソッド
Application.Calculate
開かれている全てのブックの全てのセルが再計算されます。
ただし、再計算が必要ない(とエクセルが認識している)セルは再計算しません。
通常は、これを実行すれば全てのセルが正しい計算結果となります。
ApplicationのCalculateFullメソッド
Application.CalculateFull
開かれているすべてのブックの全ての計算式が再計算されます。
再計算の必要のないセルも再計算します。
通常は、Calculateを使用してください。
ApplicationのCalculateFullRebuildメソッド
Application.CalculateFullRebuild
開いている全てのシートで、すべて計算し、依存を再構築します。
これは、すべての数式を再入力する事と同じです。
通常は、使用することはありません。

再計算したいシートだけ再計算
WorksheetオブジェクトのCalculateメソッド
ActiveSheet.Calculate
Worksheets("Sheet1").Calculate
指定のワークシートの全てのセルが再計算されます。
再計算が必要ない(とエクセルが認識している)セルは再計算しません。
再計算したいセルだけ再計算
RangeオブジェクトのCalculateメソッド
Range("C2:C5").Calculate
Rangeオブジェクトとして指定されたセルだけが再計算されます。
再計算が必要ない(とエクセルが認識している)セルは再計算しません。

Sub sample5()
  Application.Calculation = xlCalculationManual
  Range("C1").Copy Destination:=Range("C2:C5")
  Range("C2:C5").Calculate
End Sub

マクロ VBA Calculate

RangeオブジェクトのDirtyメソッドについて
少し別件になりますが、RangeオブジェクトのDirtyメソッドについて記載しておきます。
Dirtyメソッドは、次の再計算が発生したときに再計算するよう指定するものであり、その場では再計算は行われません。
VBAリファレンスの翻訳が曖昧なこともあり、勘違いされる事もありそうです。
エクセルは再計算が必要なセルを自動で認識しているので、通常はこのメソッドを使う必要性はありません。

他のセルと同じ数式を入れたい時に最も簡単な方法

今回のC1セルの数式と同じ数式をC2:C5に入れる場合、
再計算をわざわざ実行することなく、その場で再計算されるようにVBAを記述できます。
以下の方法ならとても簡単に実現できます。

Sub sample6()
  Application.Calculation = xlCalculationManual
  Range("C2:C5").FormulaR1C1 = Range("C1").FormulaR1C1
End Sub

セルに計算式を入れる方法についての詳細は以下を参照してください。
第38回.セルに計算式を設定(Formula)|VBA入門
セルに計算式(関数)を設定する場合のマクロVBAになります。マクロでは、セルに計算式を設定することは、そんなに多くないと思いますが、決して使わないわけではありません。しかし、この計算式の設定には何種類ものプロパティがあり、結構やっかいなのです。

Formulaプロパティで取得される数式は、
"=A1/B1"
このようにセル参照がセル番地になっているため、他のセルのFormulaに入れても意図した数式にはなりません。
しかし、
FormulaR1C1プロパティで取得される数式は、
"=RC[-2]/RC[-1]"
このようにR1C1形式として、数式の入っているセルからの相対位置指定になっています。
したがって、他のセルに入れれば、数式の参照するセルも相対参照としてずれてくれます。

少なくとも今回の例であれば、これが最も簡単な方法になるでしょう。



同じテーマ「VBA技術解説」の記事

複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは


新着記事NEW ・・・新着記事一覧を見る

SQL関数と演算子|SQL入門(12月1日)
データの取得:集約集計、並べ替え(DISTINKT,GROUP BY,ORDER BY)|SQL入門(11月30日)
データの取得:条件指定(SELECT,WHERE)|SQL入門(11月29日)
データの挿入:バルクインサート|SQL入門(11月28日)
データの挿入(INSERT)と全削除|SQL入門(11月26日)
テーブル名変更と列追加(ALTER TABLE)とテーブル自動作成|SQL入門(11月25日)
テーブルの作成/削除(CREATE TABLE,DROP TABLE)|SQL入門(11月24日)
データベースに接続/切断|SQL入門(11月23日)
SQLiteのインストール|SQL入門(11月22日)
SQL入門:VBAでデータベースを使う|エクセルの神髄(11月22日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • 手動計算時の注意点と再計算方法

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
    掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ