.xls を .xlsb や .xlsm で保存
昨日は、拡張子が「.xls」のファイルが大量にあったため、これを「.xlsx」に自動更新するマクロに挑戦した。
infoment.hatenablog.com
すると、日頃親交のある狸さんから、拡張子「.xlsb」についてご紹介を受けた。
(いつも有難うございます)。
そこで本日は、昨日のコードにチェック機能を幾つか設け、さらに「.xlsb」への更新を追加することに挑戦する。
「.xlsb」は、バイナリ形式とのこと。特に文字列だけのファイルに於いては、その容量および起動速度が優れている(らしい)。
そこで実際、手元にあったファイルで比較してみた。とあるシステムから出力したデータで、13835行×32列ある。結果は、以下のとおり。
拡張子 | 容量 | 単位 |
---|---|---|
.xls | 11476 | kB |
.xlsx | 2044 | kB |
.xlsb | 672 | kB |
確かに容量を見れば、圧倒的に有利だ。しかしWebで検索すると、使用については賛否様々な意見があるようで。
そこで取り敢えず、保存形式の選択肢として選べるようにしたうえで、時と場合により、判断はユーザーにお任せすることにした。
以上を踏まえると、今回の作戦は以下のとおり。
- xlsbにするか否かのフラグを引数に追加する。
- ファイルの存在確認を追加する。
- ファイルが処理対象か否かの確認を追加する。
- 保存予定名のファイルが既に無いかの確認を追加する。
- 以上を踏まえたうえで、xlsb形式での保存を追加する。
結果は、次のとおり。
Function ToNewExtension(source_path As String, _ Optional xlsb_flag As Boolean = False) As String Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FileExists(source_path) = False Then ToNewExtension = "指定ファイルは存在しません。" Exit Function ElseIf FSO.GetExtensionName(source_path) <> "xls" Then ToNewExtension = "指定ファイルは処理対象外です。" Exit Function Else Dim str As Variant For Each str In Array("x", "m", "b") If FSO.FileExists(source_path & str) Then ToNewExtension = "更新後のファイルが既に存在します。" Exit Function End If Next End If Dim Wb As Workbook Set Wb = Workbooks.Open(source_path, False, True) If xlsb_flag Then Wb.SaveAs , xlExcel12 ElseIf Wb.HasVBProject Then Wb.SaveAs , xlOpenXMLWorkbookMacroEnabled Else Wb.SaveAs , xlOpenXMLWorkbook End If ToNewExtension = Wb.FullName Wb.Close End Function
例によって、また大仕掛けになってきた。今回は、どこまで膨れ上がることやら。
明日に続きます。
参考まで。