PowerShellからのExcel操作時にApplication.Calculationの設定によって速度の違いがあるか測定

PowerShell
記事内に広告が含まれています。

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-4105Excel が再計算を制御します。
xlCalculationManual-4135ユーザーが要求すると、計算が完了します。
xlCalculationSemiautomatic2Excel が再計算を制御しますが、テーブル内の変更は無視します。

実行結果(速度測定)

初期設定

数字、数式を格納する対象Excelファイルの計算方法の設定の初期値は「自動」です。

速度測定結果の一覧

速度測定は各々10回実施しました。キャプチャは割愛します。

(経過時間の記載の形式は「HH:mm:ss.fffffff」です)

実行回数自動計算ONの状態自動計算OFFの状態
1回目00:01:57.937978100:01:35.5133327
2回目00:02:17.810970400:01:36.9314456
3回目00:02:39.696252700:01:35.9776432
4回目00:02:15.936311100:01:42.2736822
5回目00:02:38.781281900:01:34.7567951
6回目00:02:23.583721400:01:57.8079433
7回目00:02:36.454648900:01:32.2901524
8回目00:02:39.342481900:01:34.1461086
9回目00:02:35.150241000:01:38.9322428
10回目00:02:27.915906100:01:40.2430028
速度測定一覧

平均値、最小値、最大値は下記のとおりです。

実行回数自動計算ONの状態自動計算OFFの状態差異
平均値約00:02:27約00:01:39約49秒スピードアップ
最小値00:01:57.937978100:01:32.2901524約26秒スピードアップ
最大値00:02:39.696252700:01:57.8079433約42秒スピードアップ
平均値、最小・最大値

結論

処理実行中はxlCalculationManualに設定したほうが、平均値、最大値、最小値とも早い結果となりました。

PowerShellでExcelを操作する場合も、Application.Calculationの設定を意識したほうがよさそうです。

参考情報

下記の環境で作成・実行しております。

No.環境バージョン
1OSWindows10
2PowerShell5.1
環境一覧

以上です。