スクリプトから XLL を Load
やりたいこと
- ビルドディレクトリから
- 配置ディレクトリに XLLを コピー(上書き)
- Excel を新規セッションで計算なしオプションで開き
- XLL を Load する
コード(JScript)
js
var srcDir = "C:\\path\\to\\build";
var dstDir = "C:\\path\\to\\deploy";
var srcXll = srcDir + "\\SampleAddIn1.xll";
var dstXll = dstDir + "\\SampleAddIn1.xll";
var xlCalculationManual = -4135; // xlCalculationManual
var xlCalculationAutomatic = -4105; // xlCalculationAutomatic
var fso = new ActiveXObject("Scripting.FileSystemObject");
var excel = null;
var book = null;
try {
fso.CopyFile(srcXll, dstXll, true); // true = overwrite
excel = new ActiveXObject("Excel.Application");
excel.Visible = true;
book = excel.Workbooks.Add();
excel.Calculation = xlCalculationManual; // ブックの計算: 手動
excel.CalculateBeforeSave = false; // 保存前に再計算: オフ
var ok = excel.RegisterXLL(dstXll);
WScript.Echo("RegisterXLL: " + ok);
} catch (e) {
WScript.Echo("ERROR: " + e.message);
try {
if (book !== null) {
book.Close(false);
}
} catch (e2) {
}
try {
if (excel !== null) {
excel.Quit();
}
} catch (e3) {
}
throw e;
} finally {
book = null;
excel = null;
fso = null;
}
コード(PowerShell)
ポイントだけ。 ただ、これだと Excel 閉じても XLL が解放されなかったので、JScript で試してみる
ps1
# ファイルのコピー
Copy-Item -Path "C:\src\a.txt" -Destination "C:\dst\a.txt" -Force
# Excel を 自動計算なしで開く
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$book = $excel.Workbooks.Open($Path)
$excel.Calculation = -4135 # xlCalculationManual
$excel.CalculateBeforeSave = $false
# XLL ロード
$excel.RegisterXLL($XllPath)
# 解放
try {
if ($null -ne $book) {
$book.Close($false)
}
if ($null -ne $excel) {
$excel.Quit()
}
} finally {
if ($null -ne $book) {
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($book)
}
if ($null -ne $excel) {
[void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel)
}
$book = $null
$excel = $null
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
[GC]::Collect()
}
呼び出しかたが良くなかっただけかも。PowerShell ウィンドウからスクリプトを直接呼ぶのでなく、
別プロセスで起動すれば良い? (これも試してみる)
bat
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\run.ps1
おまけ
ps -ef 的なもの
ps1
Get-Process EXCEL | Select-Object Id, MainWindowTitle
以下広告