【VBScript】パワーポイントファイル一覧のExcel作るには
昨日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とすれば、もうそれで実行ファイルとなりますので、マクロを使うなという部署でも簡単に作ることができます。
何かの参考になれば幸いです。
-
前の記事
【ExcelVBA】Excelからパワポを制御するには 2022.12.10
-
次の記事
セミナーをはしご 2022.12.12