Archive for the 'PowerPoint 2011' Category

2013/07/12 オープン中のMacのPowerPointの書類をWindows XPのPowerPointでオープン

Mac上のOffice 2011のPowerPointでオープン中のPowerPoint書類を、Parallels 8.0上で動くWindows XP上のOffice 2003でオープンさせるAppleScriptです。

各個人の環境によって、ゲストOSのインストール名称が異なる可能性が高いので、若干の手直しは必要です。

ここでは、Windows XPを「Microsoft Windows XP(1)」の名前でインストール、起動してあります。

para13.png

ホームディレクトリの直下に、「Applications (Parallels)」フォルダがあり、

para7.png

その中にインストールしたゲストOSの名称にもとづいた各OS上のネイティブアプリにイベントを転送する専用のプロキシーアプリケーションが自動でインストールされます。

para3.png

この中にあるPowerPoint(へのイベントを伝達するだけのプロキシーアプリケーション)に、Mac OS XネイティブのOffice 2011のPowerPointでオープン中の書類のファイルパスを伝えれば、Windows上で同じ書類をオープンして、表示のされ方の違いなどを確認できます。

para1.png

para2.png

Microsoft Office以外でも、AdobeのCreative Suites/Creative Crowdなど各種マルチプラットフォーム展開しているアプリにおいて、実際の見え方の違いをその場で確認できると便利ではないでしょうか?

スクリプト名:オープン中のMacのPowerPointの書類をWindows XPのPowerPointでオープン
property aBundle : “” –バンドルID計算キャッシュ

set a to getPPTpath() of me –PPT書類のパスを取得
if a = false then return

–Windows XPのPowerPointアプリのプロキシーアプリを探す
set homePath to path to home folder from user domain
set homePathStr to homePath as string
set homeParallelsApps to homePathStr & “Applications (Parallels):”
set winXPappPath to homeParallelsApps & “Microsoft Windows XP (1) Applications:” –このあたり、ユーザーごとにフォルダ名が違うかも

if aBundle = “” then
  tell application “Finder”
    tell folder winXPappPath
      set fList to (every file whose name contains “Microsoft PowerPoint”) as alias list –ここで、不気味なほど時間がかかる
    end tell
  end tell
  
  
if fList = {} then
    display dialog “Windows XPのPowerPointが見つかりません”
    
return
  end if
  
set aPPTapp to contents of first item of fList
  
  
set infoF to info for aPPTapp
  
set aBundle to bundle identifier of infoF
end if

tell application “Finder”
  open file a using application file id aBundle
end tell

–オープン中の最前面のPowerPoint書類のフルパスの文字列を取得
on getPPTpath()
  tell application “Microsoft PowerPoint”
    set pCount to count every presentation
    
if pCount = 0 then return false
    
tell presentation 1
      –Documentのフルパスを取得する
      
set aPath to full name
      
return aPath
    end tell
  end tell
end getPPTpath

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/04/13 PowerPointで、オブジェクトの外側の線の色を、水色から青に変更

Office 2011のPowerPointで、各スライド上に存在するオブジェクト(shape)のうち、水色の枠線を適用しているものを抽出して、青の枠線に変更するAppleScriptです。

PowerPoint書類上で、本来は青(↓)

col2.png

の枠線を引く必要があったものに、誤って水色(↓)

col1.png

の枠線を引いた箇所がいくつかあるのを見つけました。

そんな微妙な間違いを目視で確認して修正するのは事実上不可能なので、AppleScriptを書いて自動で修正しました。

ppt_before.png
▲AppleScript実行前

pptafter.png
▲AppleScript実行後(うわ、違いがびみょ〜)

技術的なみどころは、オブジェクト階層の奥まった場所にある属性値をa reference toで直接参照して書き換えしているところです。

スクリプト名:PowerPointで、オブジェクトの外側の線の色を、水色から青に変更
–水色の線を青に変更
tell application “Microsoft PowerPoint”
  tell active presentation
    set sCount to count every slide
    
    
repeat with i from 1 to sCount
      tell slide i
        set ssCount to count every shape
        
        
repeat with ii from 1 to ssCount
          
          
tell shape ii
            set aProp to properties
            
set aLineF to line format of aProp
            
set fcData to fore color of aLineF
          end tell
          
          
if fcData = {51, 102, 255} then
            set aRef to (a reference to fore color of line format of shape ii)
            
set fore color of aRef to {0, 0, 255} –線の塗り色を青 {0,0,255} に変更
          end if
          
        end repeat
        
      end tell
    end repeat
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/04/08 手作りのノンブルが作ってあるPowerPoint書類に対して、座標位置(一番左側に寄せてある)を手がかりにフレームを取得してリナンバリング

真心のこもった「手作りのノンブル」が作ってあるPowerPoint書類に対して、座標位置からノンブルのテキストフレームを判別し、リナンバーを行うAppleScriptです。

久しぶりにPowerPointで作らなくてはならない書類(=Keynote書類では受け取ってもらえない用途)に追加修正を行っていたところ、各ページの下に付いていたページ番号が……

ppt1.png

普通、マスタースライドにページ番号(ノンブル)を配置しておけば、ページが増えようが減ろうが、ノンブル管理についてユーザーが関知する必要はないのですが……途中のバージョンから(なぜか)それが無視されて、各ページの下部に「手作りのノンブル」が配置されていることが判明。

しかも、そのPowerPointの書類はけっこうなページ数があったため、すべての「手作りノンブル」を削除してPowerPoint本来のノンブルを復活させるのもはばかられるところ。

そこで、「そんなたいした処理にはならないだろー」と踏んで、AppleScriptからリナンバーを行うことにしました。

……結論からいえば、けっこう入り組んだPowerPointのオブジェクト階層迷路を引き回されて、「たいした」作業にはなってしまったのですが、目的を果たすことはできました。

PowerPointはDTPソフトではないので、各オブジェクトにScript Labelを割り当てられるとかいうことはなくて、それぞれのオブジェクトの判別については相当な困難が伴うはずですが…………そこは、オブジェクトの座標を見て、X座標が0(プログラム上では念のため5以下)になっているものを「真心のこもった手作りノンブル用テキストフレーム」とみなして、処理しています。

PowerPointのScriptingは久しぶりだったので、「クラス名を取得して、あとで条件判断用に使おうとしたら、プログラム中にクラス名を直接記述できなかった」などの怪奇現象に直面して焦ってしまいました。

この手の(出来の悪い)アプリケーションのScriptingにおける挙動については、割と技術的なバッドノウハウ的な蓄積があり、クラス名を取得したら即座にas stringで文字列にして、文字列で判定を行うことで問題を回避しました。

あとで気付きましたが、このプログラムをちょこっと直せば、各ページに付いている「真心のこもった手作りのノンブル」を自動削除して、PowerPoint本来のマスタースライド上のノンブルを活かせそうです。

スクリプト名:手作りのノンブルが作ってあるPowerPoint書類に対して、座標位置(一番左側に寄せてある)を手がかりにフレームを取得してリナンバリング
–手作りのノンブルが作ってあるPowerPoint書類に対して、座標位置(一番左側に寄せてある)を手がかりにフレームを取得してリナンバリング

tell application “Microsoft PowerPoint”
  
  
tell active presentation –Document
    –スライドの枚数を数える
    
set sCount to count every slide
    
    
–スライド先頭から順次ループ
    
repeat with i from 1 to sCount
      
      
tell slide i –Page
        
        
set tList to {}
        
set s1List to every shape
        
repeat with ii in s1List
          set leftPos to left position of ii
          
if leftPos < 5 then
            set aClass to (class of ii) as string –テキストにして取得しないとclass名はまともに扱えない
            
if aClass = “shape textbox” then
              set the end of tList to ii
            end if
          end if
        end repeat
        
        
if tList is not equal to {} then
          set ttCount to count every item of tList
          
log ttCount
          
set aTF to text frame of contents of first item of tList
          
          
tell aTF
            set hsF to has text
            
            
–Text Frameにテキストが入っている場合のみ処理
            
if hsF = true then
              set aProp to properties
              
set aTRange to text range of aProp
              
              
set aCon to content of aTRange
              
if aCon begins with “−” and aCon ends with “−” then
                set aText to “− “ & (i as string) & ” −”
                
set content of aTRange to aText
              end if
            end if
            
          end tell
        end if
        
      end tell
    end repeat
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/01/03 PowerPoint 2011の書類内の各ページ(slide)内の各オブジェクト(shape)のアニメーション設定を取得

お正月でテレビを見ながら、お酒が入りつつちょっと調べものを。PowerPointをAppleScriptからこづき回しつつ、各オブジェクトに設定されているアニメーション設定情報を取得してみました。

まずは、メーカーが出しているScriptingの資料がないか、Googleで「AppleScript PowerPoint」などのキーワードで検索してみると、トップから2番目にその情報がヒットします。マイクロソフトが出しているPowerPoint 2004のAppleScript資料(PDF)。このPDF資料内を「animation」で検索すれば、該当箇所が出てきます。

ppt0.png

PowerPointはあまりScriptから動かしたりしないので、オブジェクト階層などもすっかり忘れている状態(Keynoteしか使っていないので)。初見に近い状態です。

最初に調べるのは、「書類」に該当するオブジェクト名が何であるか。一般的には、「document」ですが、プレゼン系のアプリケーション(Keynoteとか)ではdocumentではないオブジェクト名が定義されていることが多く……PDF資料を調べてみると、「presentation」だと分りました。

次に、presentation(書類)内の各ページにアクセスするオブジェクトが「slide」、各ページ(slide)内のオブジェクトにアクセスするのが「shape」だと分りました。

ppt1.png

オブジェクト階層を指定しつつ、ふつーにアクセスすれば、ふつーに情報にアクセスできました。何も問題はなさそうです。

書いている最中で行き当たった問題といえば、AdobeやMicrosoftなど大規模なAppleScript用語辞書を抱えたアプリの場合だと、(とくに、マイクロソフトのアプリ全般でその傾向があるのですが)オブジェクト階層の記述を1行の中にまとめると動くのに、tell文で複数行に分けて書くとアクセスできないとかエラーが出るという現象には直面しました。覚えておいて損はないと思います。

ppt2.png

2012/04/30 Microsoft Office v2011 14.2.1アップデートで辞書に変更なし

先日公開された「Microsoft Office 2011 14.2.1 更新プログラム」でアップデートされた、Excel、Outlook、PowerPoint、WordのAppleScript用語辞書にとくに変更がないことを確認しました。

2012/04/21 Office v.2011 Service Pack 2による変更点

2012/4/13にOffice v.2011 サービスパック2(バージョン14.2.0)がオンライン配布開始となりました。

例によって、アップデート後にAppleScript用語辞書をAS Dictionaryで書き出して,前バージョンの用語辞書の内容と比較を行ってみました。

 Excel 14.1.2→14.2 変更なし
 Outlook 14.1.2→14.2 変更あり(大規模な変更)
 PowerPoint 14.1.4→14.2 変更あり(「player」関連のオブジェクト、命令が追加に)
 Word 14.1.4→14.2 変更なし

……Outlookについては、日常的に使用していないので用語辞書変更の影響度合いはなんとも言えないのですが、SP2で加えるレベルではないほどの追加(あくまで個人的な意見)が行われています。