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 & "::" & "読み取り用パスワード" & "::" & "書き込み用パスワード"
コメントをお書きください