Skip to main content

スクリプトから XLL を Load

やりたいこと

  1. ビルドディレクトリから
  2. 配置ディレクトリに XLLを コピー(上書き)
  3. Excel を新規セッションで計算なしオプションで開き
  4. 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

以下広告