PowerShell で Word から PDF へ変換しているのですが、そのスクリプトが環境によっては動かないことがありました。
環境
- Windows 10 64 bit
- Microsoft Word 2013 32 bit
今回、Office を 2010 から 2013 にアップグレードしており、結果的にはそれが原因だった可能性が高いです。
先に結論
Office の修復を実行したら解決しました。
これで直らなかったら次は再インストールを試そうとしてました。
エラーの内容と原因の特定まで
エラーの内容ですが、具体的には、Microsoft.Office.Interop.Word.Application
で Documents.Open
を参照したときに、null 値の式ではメソッドを呼び出せません。
というエラーが表示されました。
デバッガで止めて確認してみると、そもそも Word のインスタンスを作成する以下のコードで $null
が返ってきているようでした。
$word = New-Object -ComObject Word.Application;
尚、PowerShell で上記のコマンドを直接実行すると成功しました。
あくまで ps1 ファイルに保存してスクリプトを実行した場合にのみ失敗していました。
とりあえずググってみると、似たような事例がいくつかヒットしますが、その対策として挙げられていたのは、C:¥Windows¥SysWOW64¥config¥systemprofile
に Desktop
という空のフォルダを作成するというものでした。
しかし、今回の場合、これでは直りませんでした。
レジストリの確認
もう少し調べてみると、以下のページに行き着きました。
どうやら、どの Office を使用するかはレジストリで確認できるようです。
というわけで、レジストリエディターを起動し、以下のキーを検索してみました。
HKEY_CLASSES_ROOT\WOW6432Node\Interface\{00020970-0000-0000-C000-000000000046}\TypeLib
すると、正常にスクリプトが動作する環境では以下のように値が表示されるのですが、エラーが発生する環境ではキーが見つかりませんでした。
従って、レジストリの値がおかしいのではと思い、Office の再インストールをやってみようと思いました。
そして、Office の再インストール前に、Office の修復を試したところ、それで直りました。
いや、これめっちゃはまりましたわ。
参考 URL
- https://www.alkanesolutions.co.uk/2019/04/18/you-cannot-call-a-method-on-a-null-valued-expression/
- https://support.upslide.net/hc/en-us/articles/214269046-UpSlide-Issues-when-upgrading-Office
- https://elleneast.com/?p=866
- https://stackoverflow.com/questions/10837437/interop-word-documents-open-is-null
- https://x6lgplfk4z24e4vc3x3qgmhzwa--superuser-com.translate.goog/questions/1361627/calling-documents-open-for-word-application-error-converting-msofalse-to-type-ob
- https://python5.com/q/zescatei
- https://www.ibm.com/support/knowledgecenter/ja/SS6RHZ_2.1.1/com.ibm.rational.pe.troubleshooting.doc/topics/t_macro_execution.html