次のコードは、Powershell V1 (Excel 2007) で例外をスローします。
$E = New-Object -COM "Excel.Application"
$E.Visible = $True
$wb = $E.Workbooks.Add() #<<<Exception here
このエラーは、形式が古い可能性があるか、タイプ ライブラリが有効でないことを示しています (スペイン語からの翻訳)。Word 用の同様のスクリプトは問題なく動作します。
次のコードは、Powershell V1 (Excel 2007) で例外をスローします。
$E = New-Object -COM "Excel.Application"
$E.Visible = $True
$wb = $E.Workbooks.Add() #<<<Exception here
このエラーは、形式が古い可能性があるか、タイプ ライブラリが有効でないことを示しています (スペイン語からの翻訳)。Word 用の同様のスクリプトは問題なく動作します。
現在の文化が米国以外の場合、Office相互運用機能アセンブリにはこの問題があるようです。明らかな回避策は、文化を設定することです。
PowerShell V1は、コマンドの呼び出しごとに常に新しいスレッドを作成するため、インタラクティブコンソールですべてを単一のコマンドとして実行することが重要です。
PS C:\Users\jachymko> $e = new-object -com excel.application
PS C:\Users\jachymko> $e.workbooks.add()
Exception calling "Add" with "0" argument(s): "Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
At line:1 char:17
+ $e.workbooks.add <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
PS C:\Users\jachymko> & {
>> [threading.thread]::CurrentThread.CurrentCulture = 'en-US'
>> $e = new-object -com excel.application
>> $e.workbooks.add()
>> $e.visible=1
>> }
>>
MS ヘルプとサポートの記事 320369で提案されているソリューションの 1 つからPowershell に適応。
$ci = new-object system.globalization.cultureinfo "en-US"
$e = New-Object -COM "Excel.Application"
$e.Visible = $True
$e.UserControl= $True
$books = $e.Workbooks
$books.PSBase.GetType().InvokeMember( `
"Add", `
[system.reflection.bindingflags]::InvokeMethod, `
$null, $books, $null, $ci)
同じ記事から:
地域の設定が Office の現在の言語バージョンと一致しないコンピューターでこれらの回避策のいずれかを使用する場合は、Excel の動作と、特定のロケール用に書式設定された可能性のあるデータを Excel が解釈する方法に精通している必要があります。