.xls を .xlsb や .xlsm で保存

昨日は、拡張子が「.xls」のファイルが大量にあったため、これを「.xlsx」に自動更新するマクロに挑戦した。
infoment.hatenablog.com

すると、日頃親交のある狸さんから、拡張子「.xlsb」についてご紹介を受けた。
(いつも有難うございます)。

そこで本日は、昨日のコードにチェック機能を幾つか設け、さらに「.xlsb」への更新を追加することに挑戦する。
f:id:Infoment:20190920223243p:plain

「.xlsb」は、バイナリ形式とのこと。特に文字列だけのファイルに於いては、その容量および起動速度が優れている(らしい)。

そこで実際、手元にあったファイルで比較してみた。とあるシステムから出力したデータで、13835行×32列ある。結果は、以下のとおり。

拡張子 容量 単位
.xls 11476 kB
.xlsx 2044 kB
.xlsb 672 kB

確かに容量を見れば、圧倒的に有利だ。しかしWebで検索すると、使用については賛否様々な意見があるようで。

そこで取り敢えず、保存形式の選択肢として選べるようにしたうえで、時と場合により、判断はユーザーにお任せすることにした。

以上を踏まえると、今回の作戦は以下のとおり。

  1. xlsbにするか否かのフラグを引数に追加する。
  2. ファイルの存在確認を追加する。
  3. ファイルが処理対象か否かの確認を追加する。
  4. 保存予定名のファイルが既に無いかの確認を追加する。
  5. 以上を踏まえたうえで、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

例によって、また大仕掛けになってきた。今回は、どこまで膨れ上がることやら。

明日に続きます。

参考まで。