【VBScript】パワーポイントファイル一覧のExcel作るには

  • [記事公開]2022.12.11
  • VBS

昨日ExcelVBAでパワーポイントファイルを開いて一覧を作るコードを紹介しました。今日は、同じ動作をVBScriptでやるなら、どうするかを紹介します。

きっかけ

昨日作ったコードはYahoo!知恵袋の質問がきっかけでした。その質問文には「VBSかExcelマクロで」という要望がありましたので、VBScript版を作りました。

VBAとVBSの違いもついでに紹介しようと思います。

やりたいこと

やりたいことは、下図のようなフォルダにあるパワーポイントのファイルのリスト一覧をつくることです。

リストには、パワーポイントファイルの中のスライド1ページ目にあるテキストボックスの中の文章も搭載します。

コード

VBScriptで作ったコードです。

Option Explicit
Main
Public Sub Main()
    'パワポファイルをリストアップ
    Dim pp, stPath, stPp, vBuf, sh, vOut(), lCnt
    stPath = "C:\test"

    Dim oExcel, Bk
    '①Excel用のインスタンスを生成
    Set oExcel = CreateObject("Excel.Application")
    '②ブックを新規で作成
    Set Bk = oExcel.Workbooks.Add
    '③シートを把握
    Set sh = Bk.Worksheets(1)
    Set pp = CreateObject("PowerPoint.Application")
    
    Dim FSO, oFolder, oFile
    '④VBScriptではDir関数は使えないので、地道にFileSystemObjectを使う
    Set FSO = CreateObject("Scripting.FileSystemObject")
    '⑤フォルダのオブジェクトを把握する
    set oFolder = FSO.GetFolder(stPath)

    lCnt = 0
    '⑥フォルダの中のファイル一つ一つを確認していく
    For Each oFile In oFolder.Files
        stPp = oFile.Name
        '⑦ファイルの拡張子がpptxだったら
        If FSO.GetExtensionName(oFile.Path) ="pptx" Then 
            vBuf = Split(stPp, "-") 'ハイフン「-」で分割する---⑧
            ReDim Preserve vOut(2, lCnt) '---⑨
            vOut(0, lCnt) = "'" & vBuf(1)   '⑩ゼロで始まる数字を文字列と認識してもらうために’つける
            vOut(1, lCnt) = Replace(vBuf(2), ".pptx", "")
            vOut(2, lCnt) = GetText(pp, stPath & "\" & stPp)
        
            lCnt = lCnt + 1
        End If
    Next
    
    sh.Cells(2, 2).Resize(lCnt, 3).Value = oExcel.WorksheetFunction.Transpose(vOut)   '---⑪Transposeで行と列を入れ替える
    sh.Cells(1, 2).Resize(1, 3).Value = Array("ナンバー", "標題", "内容") '---⑫
    pp.Quit
    Set pp = Nothing
    Set sh = Nothing
    Set Bk = Nothing
    '⑬Excelは非表示なので、表示するように設定を変えておく
    oExcel.Visible = True
    Set oExcel = Nothing
    WScript.Quit

End Sub
'↓⑭VBAと変えたのは型をなくしたところだけです
Private Function GetText(ByRef pp, ByVal stFullPath)
    Dim Obj
    Dim oShape
    
    Set Obj = pp.Presentations.Open(stFullPath)
    For Each oShape In Obj.Slides(1).Shapes
        If oShape.HasTextFrame Then
            GetText = Replace(oShape.TextFrame.TextRange.Text, "[結果]", "")
            Exit For
        End If
    Next
    
    Obj.Close
    Set Obj = Nothing
End Function

解説

ロジック自体は変えていません。

今回は、VBAと異なる部分を説明していきます。

①~③、⑬の解説

VBScriptではExcelもCreateObjectしておかないと利用できません。

そのため、①でまずExcelのインスタンスを生成し、②でExcelのブックを作り、③でブックの中のワークシートを把握しています。

ちなみに、生成したばかりのExcelは非表示となっています。そのため、最後にVisible属性をTrueにして、非表示になっていたExcelを表示しています(⑬)。

④~⑦の解説

VBScriptではVBAにあるDir()が使えません。そこで、FileSystemObjectを利用してファイル一覧を取得するように変更しました。

まず④でFileSystemObjectを生成し、⑤でフォルダオブジェクトを取得しています。⑥のループは、フォルダの中に存在するファイルを一つ一つ確認していくループです。

ファイルの中にはパワーポイントではないファイルも含まれている可能性があるため、⑦で拡張子を確認して、pptx(パワーポイントの拡張子)だったら、処理をするようにしています。

⑧~⑩の解説

⑧と⑩はVBAと同じです。⑨だけ違います。

VBAのときは要素の指定を( 1 To 3, 0 To lCnt)というように指定することができたのですが、VBScriptではそれだとエラーになりましたので、( 2, lCnt)というように修正しました。

⑪、⑫の解説

VBAでWorksheetFunction.Transposeとしていたところは、正式にはApplication.WorksheetFunction.Transposeと書きます。VBScriptではApplicationに相当する部分がないので、あらかじめ生成しておいたExcelインスタンスのoExcelを代わりに置いています(⑪)。

⑫についてはVBAといっしょです。変更はありません。

⑭の解説

サブ関数GetTextでVBAから変えたところは、型指定をとったところだけです。

VBAではAs句で型を指定することができますが、VBScriptでは型の指定はできません。

そこで、引数から内部変数まで全部のAs句をとりました。

使い道

あまりそんなところはないと思いたいのですが、セキュアな環境ではExcelのマクロを使ってはいけないというところもあるらしいので、そういう部門で働く人は、VBSを使わざるを得ないと思います。

VBSはテキストに書いて、名前を付けて保存するときに「すべてのファイル」にして、拡張子を.vbsとすれば、もうそれで実行ファイルとなりますので、マクロを使うなという部署でも簡単に作ることができます。

何かの参考になれば幸いです。