ExcelマクロでApplication.Calculationの自動計算をOFFにするコードを記述することがあります。
これは無駄な再計算でマクロの実行速度を落とさないためです。
PowerShellでこのプロパティを設定した場合も、実行速度に影響があるか検証してみました。
検証手順
Excelシートに対して、数値と計算式を格納する処理を大量に繰り返すPowerShellのScript(*.ps1)を用意します。
そして下記の2パターンでそれぞれ10回テストして、実行時間の平均値を求めます。
No. | 検証パターン | Application.Calculation | 補足 |
---|---|---|---|
1 | 自動計算ONで実行 | xlCalculationAutomatic (※規定値を想定) | 処理開始時から処理終了まで自動計算ON |
2 | 自動計算OFFで実行 | xlCalculationManual | 処理開始時から処理終了まで自動計算OFF |
なお、Application.CalculationはExcelの以下の部分の設定と同等です。

ソースコード
使用したソースコードは下記のとおりです。
$excel.Calculationの部分(25行目、43行目あたり)の設定を操作して検証します。
# 開始時刻
$startTime = (Get-Date)
Write-Host "StartTime : " $startTime.ToString("HH:mm:ss.fffffff")
$excel = New-Object -ComObject Excel.Application
$book = $null
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.ScreenUpdating = $false
$fileName = "Book1.xlsx"
$filePath = (Convert-Path .) + "/" + $fileName
$book = $excel.Workbooks.Open($filePath)
$sheet = $book.Sheets("Sheet1")
$Calculation = "microsoft.office.interop.excel.XlCalculation" -as [type]
# 自動計算 OFF
#$excel.Calculation = $Calculation::xlCalculationAutomatic
$excel.Calculation = $Calculation::xlCalculationManual
# 負荷をかける処理
for ( $i=1; $i -le 10000; $i++){
# C列:計算式の入力(A列+B列) ※再計算の確認のため、先に数式を用意しておく
$formula = "=A" + $i + "+B" + $i
$sheet.Cells.Item($i,3).Formula = $formula
# A列
$sheet.Cells.Item($i,1).Value = $i
# B列
$sheet.Cells.Item($i,2).Value = $i + 1
}
# 自動計算 ON
$excel.Calculation = $Calculation::xlCalculationAutomatic
$excel.ScreenUpdating = $true
[void]$book.Save()
[void]$book.Close($false)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
[void]$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
# 終了時刻
$endTime = (Get-Date)
Write-Host "EndTime : " $endTime.ToString("HH:mm:ss.fffffff")
# 時間差
Write-Host "TimeSpan : " ($endTime - $startTime).ToString("")
Pause
処理時間の確認方法
プログラムの開始終了で日時を出力させ、差分の処理時間を記録します。

- StartTime:開始時刻
- EndTime:終了時刻
- TimeSpan:差分(実行時間)
ShellScriptを1回実行後のExcelの状態
上記のPowerShellを1回実行した際にできるExcelシートの状態です。
A~C列について、10000行の値が出力されています。
※C列については分かりやすさの為、「数式を表示」オプションで数式を表示しています。

【参考】XlCalculation 列挙値
XlCalculationについては3つの値が設定可能です。
詳しくはMicrosoftのドキュメントを参照してください。
設定値 | 値 | 説明 |
---|---|---|
xlCalculationAutomatic | -4105 | Excel が再計算を制御します。 |
xlCalculationManual | -4135 | ユーザーが要求すると、計算が完了します。 |
xlCalculationSemiautomatic | 2 | Excel が再計算を制御しますが、テーブル内の変更は無視します。 |
実行結果(速度測定)
初期設定
数字、数式を格納する対象Excelファイルの計算方法の設定の初期値は「自動」です。

速度測定結果の一覧
速度測定は各々10回実施しました。キャプチャは割愛します。
(経過時間の記載の形式は「HH:mm:ss.fffffff」です)
実行回数 | 自動計算ONの状態 | 自動計算OFFの状態 |
---|---|---|
1回目 | 00:01:57.9379781 | 00:01:35.5133327 |
2回目 | 00:02:17.8109704 | 00:01:36.9314456 |
3回目 | 00:02:39.6962527 | 00:01:35.9776432 |
4回目 | 00:02:15.9363111 | 00:01:42.2736822 |
5回目 | 00:02:38.7812819 | 00:01:34.7567951 |
6回目 | 00:02:23.5837214 | 00:01:57.8079433 |
7回目 | 00:02:36.4546489 | 00:01:32.2901524 |
8回目 | 00:02:39.3424819 | 00:01:34.1461086 |
9回目 | 00:02:35.1502410 | 00:01:38.9322428 |
10回目 | 00:02:27.9159061 | 00:01:40.2430028 |
平均値、最小値、最大値は下記のとおりです。
実行回数 | 自動計算ONの状態 | 自動計算OFFの状態 | 差異 |
---|---|---|---|
平均値 | 約00:02:27 | 約00:01:39 | 約49秒スピードアップ |
最小値 | 00:01:57.9379781 | 00:01:32.2901524 | 約26秒スピードアップ |
最大値 | 00:02:39.6962527 | 00:01:57.8079433 | 約42秒スピードアップ |
結論
処理実行中はxlCalculationManualに設定したほうが、平均値、最大値、最小値とも早い結果となりました。
PowerShellでExcelを操作する場合も、Application.Calculationの設定を意識したほうがよさそうです。
参考情報
下記の環境で作成・実行しております。
No. | 環境 | バージョン |
---|---|---|
1 | OS | Windows10 |
2 | PowerShell | 5.1 |
以上です。