質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

1回答

1992閲覧

【PowerPoint】特定の文字列を含むPowerPointのファイルを対象とし、特定のフォルダに移動したい

misoprogram

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2019/03/06 13:38

前提・実現したいこと

特定の文字列を含むPowerPointのファイルを対象とし、
特定のフォルダに移動したい。含まない場合は移動しない。

下記点でもご確認させて頂きたく存じます。
・そもそもPowershellが妥当か
(勉強の一環でPowershellを使っていますが、PowerPoint VBAの方がよいですか。あるいはもっと別の方法がありますなど)
・Powershellで文字列検索をしたとして、戻り値が拾えるか
(移動する/しないの判断に使えるか)

該当のソースコード

PowerShell

1# ini読み込み 2function ReadIniFile($FileName) 3{ 4 $lines = get-content $FileName 5 foreach ($line in $lines){ 6 # コメントと空行を除外 7 if($line -match "^$"){ continue } 8 if($line -match "^#"){ continue } 9 10 # 検索文字列と移動先ディレクトリ名を取得 11 $param = $line.split(",",2) 12 $TargetWord = $param[0] 13 $TargetDir = $param[1] 14 } 15} 16 17$INI_FILE = ".\pptMove.ini" 18ReadIniFile($INI_FILE) 19 20$ppt = New-Object -ComObject PowerPoint.Application 21$ppt.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue 22 23# カレントディレクトリ配下のPowerpoint を開く 24$lines = Get-ChildItem -Recurse | select-object fullname | findstr pptx 25foreach ($line in $lines){ 26 $pptxFile = $ppt.Presentations.Open("$line") 27 ### ここにしたい処理が入る。 ### 28 $pptxFile.Close() 29}

試したこと

上記で開くまではできましたが、PowerPoint内の処理方法がわかりませんでした。

補足情報(FW/ツールのバージョンなど)

PowerShell 5.1
Microsoft Office 365 MSO(16.0.11231.20614) 32bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

COM 操作で行うのであれば、処理速度を考えると PowerPoint VBA の方が良いと思われます。

以前、120 スライドほどの pptx について、文字サイズのチェックを行ったことがありますが、VBAで 2、3秒の処理が、PowerShell では 1 分近くかかったことがありました
(単純な文字列検索に比べて PowerShell に不利な条件、PowerShell 2.0 での話)。

ただ、PowerShell の方が扱いが楽な面も多いため、処理速度が問題になるようなら PowerPoint VBA という考えでも良いかもしれません。

また、対象のファイル内で使われている図形の種類によっても難易度が変わってきます(入れ子になっている図形は個別に対応が必要なため)。

以下、図形内の文字列を取得する処理のサンプルです。

vba

1Sub PrintPresentationText() 2 Dim pres As PowerPoint.Presentation 3 Set pres = ActivePresentation 4 5 '各スライドについて処理 6 Dim sld As PowerPoint.Slide 7 For Each sld In pres.Slides 8 9 'スライド側の図形 10 Dim shp As PowerPoint.Shape 11 For Each shp In sld.Shapes 12 PrintShapeText shp 13 Next shp 14 15 'ノート側の図形 16 For Each shp In sld.NotesPage.Shapes 17 PrintShapeText shp 18 Next shp 19 Next sld 20 21End Sub 22 23Private Sub PrintShapeText(shp As PowerPoint.Shape) 24 Dim s As PowerPoint.Shape 25 If shp.HasTable Then 26 'テーブルの中身を確認する処理 27 'shp.Table.Rows.~ 28 ElseIf shp.Type = msoGroup Then 29 'グループ化されている形状の中を探す 30 For Each s In shp.GroupItems 31 PrintShapeText s 32 Next s 33 ElseIf False Then 34 'テーブルやグループ以外にも SmartArt などは特別対応が必要 35 '全部対応は大変なので実用上必要な範囲に絞った方が無難 36 37 ElseIf shp.HasTextFrame Then 'テキスト領域を持っていれば 38 If shp.TextFrame2.HasText Then 39 Debug.Print shp.TextFrame2.TextRange.Text 40 End If 41 End If 42End Sub

powershell

1[string[]]$presTexts = 2 $pptxFile.Slides <# => PowerPoint.Slide #>| 3 ForEach-Object -Process { # => PowerPoint.Shape 4 $_.Shapes # スライド側の図形 5 $_.NotesPage.Shapes # ノート側の図形 6 } | 7 ForEach-Object -Begin {[int]$msoGroup = 6} -Process { # => PowerPoint.Shape 8 # 入れ子になっている図形を展開 9 if ($_.HasTable) { 10 # テーブルの中身を確認する処理 11 $_.Table.Rows | ForEach-Object -MemberName Cells | ForEach-Object -MemberName Shape 12 } elseif ($_.Type -eq $msoGroup) { 13 $_.GroupItems 14 } else { 15 $_ 16 } 17 } | 18 Where-Object -FilterScript { # => PowerPoint.Shape 19 # テキストを持っている図形のみにフィルター 20 $_.HasTextFrame -and $_.TextFrame2.HasText 21 } | 22 ForEach-Object -Process { # => System.String 23 # 図形内の文字列取得 24 $_.TextFrame2.TextRange.Text 25 } 26 27$presTexts

投稿2019/03/06 14:23

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問