Excel/Word/PowerPoint VBA の比較

Windows 7, Office 2013 を想定。

CreateObjectの挙動

早速だけどVBAとは直接関係がない。

Excel/Word/PowerPointを外部から利用する場合の話(オートメーション)。

PowerPointだけ挙動が異なる。

 

CreateObject("Excel.Application")

→新たにExcelを起動し、その(Application インスタンスへの)ポインタを返す。

 

CreateObject("Word.Application")

→新たにWordを起動し、その(Application インスタンスへの)ポインタを返す。

 

CreateObject("PowerPoint.Application")

既にPowerPointが起動されている場合、(新たにPowerPointを起動することなしに)既存インスタンスへのポインタを返す。

 起動されていなければ、新たにPowerPointを起動し、その(Application インスタンスへの)ポインタを返す。

 

 

 

どうしてこうなるのか?

 

→PowerPointは多重起動できない仕様とのこと。

PowerPoint の Application オブジェクトを理解する - MSDN - Microsoft

Outlook 以外の Office アプリケーションとは異なり、同時に使用可能な PowerPoint のインスタンスは 1 つのみです。PowerPoint のインスタンスが実行中に New キーワード、CreateObject 関数、または GetObject 関数を使用して PowerPoint オブジェクト変数のインスタンスを作成する場合、そのオブジェクト変数は現在実行されている PowerPoint のインスタンスをポイントします。

 

 

 

これで困ること

 

CreateObjectして最後にQuitするようなコードを書くと、最初から開いていたPowerPointまで勝手に終了されてしまう。

Dim pptApp As Object
Set pptApp = CreateObject("PowerPoint.Application")  ' ←ここで、既存のPowerPointインスタンスが取得される
 
' ... pptAppを使った何らかの処理
 
pptApp.Quit  ' ←既存のPowerPointインスタンスを終了する

 

 

対策

 

事前にGetObjectを使って、PowerPointが起動しているかどうかを確かめる。

起動していなかった場合のみ、Quitで終了させるようにする。

(既に起動していた場合、既存のPowerPointインスタンス上で処理が行われるという点は変わっていないので注意)

Dim pptAppIsNewInstance As Boolean
Dim pptApp As Object
On Error Resume Next
Set pptApp = GetObject(, "PowerPoint.Application")  ' ←ここで、PowerPointが起動していなかった場合エラーが発生する
pptAppIsNewInstance = Err.Number
On Error GoTo 0
If pptAppIsNewInstance Then
    Set pptApp = CreateObject("PowerPoint.Application")
End If
 
' ... pptAppを使った何らかの処理
 
If pptAppIsNewInstance Then
    pptApp.Quit
End If

ちなみに↓ここで「別のユーザーとして実行することでPowerPointを多重起動できる」という回答がある。

2つめのPowerPoint ファイルを別ウィンドウで開きたい - 教えて!goo

頑張れば既に起動しているのとは別のPowerPoint上で処理を実行できるかもしれない。

パスワード付きのファイルを開く

 

(ここでいうファイルとは、Excelブック、Wordドキュメント、PowerPointプレゼンテーションのこと)

 

単にファイルを開くだけならそれぞれ

Workbooks.Open(FileName)

Documents.Open(FileName)

Presentations.Open(FileName)

でいける。これだと、パスワードで保護されたファイルを開くときダイアログが表示される。

ダイアログなしで開きたい場合はパスワードを指定する必要がある。

(コードにパスワードを埋め込むことになるので、あまり使用機会はないかもしれない)

 

 

 

Excel

 

Workbooks.Open メソッドの Password パラメータと WriteResPassword パラメータを指定する。

 

Excelブックには読み取り用パスワードと書き込み用パスワードを別々に設定できるので、読み取り用パスワードを Password に、書き込み用パスワードを WriteResPassword に指定することになる。

Workbooks.Open FileName, _
    Password:="読み取り用パスワード", _
    WriteResPassword:="書き込み用パスワード"

 

 

 

Word

 

Documents.Open メソッドの PasswordDocument パラメータ、WritePasswordDocument パラメータ、PasswordTemplate パラメータ、WritePasswordTemplate パラメータを指定する。

 

WordドキュメントもExcel同様、読み取り用パスワードと書き込み用パスワードを別々に設定できる。それに加えて、Wordではドキュメントにテンプレートが紐付けられ、テンプレートにも読み取り用パスワードと書き込み用パスワードが設定される可能性がある。

Documents.Open FileName, _
    PasswordDocument:="ドキュメントの読み取り用パスワード", _
    WritePasswordDocument:="ドキュメントの書き込み用パスワード", _
    PasswordTemplate:="テンプレートの読み取り用パスワード", _
    WritePasswordTemplate:="テンプレートの書き込み用パスワード"

 

 

PowerPoint

 

PowerPointも同様に Presentations.Open メソッドのパラメータを指定すればいいのかと思いきや該当するものがない。

ファイルパスの後に :: (コロン2つ)で区切って、読み取り用パスワード→書き込み用パスワード の順に指定してやればいいとのこと。

Presentations.Open FileName & "::" & "読み取り用パスワード" & "::" & "書き込み用パスワード"