xlsファイルをxlsx(xlsm)で開き保存するプログラム

記事
IT・テクノロジー
今回はxlsファイルを、最初からxlsx(xlsm)ファイルで開いたかのように見せて保存してくれるプログラムを作っていきたいと思います。

今回は開いたファイルに対して処理を行います。
フォルダ内のxlsファイルを一括してxlsx(xlsm)に変換するプログラムは、検索するとたくさん出てくると思いますので今回は割愛させていただきます。


xlsファイルとxlsx(xlsm)ファイルの違い

まずはxlsファイルとxlsx(xlsm)ファイルの違いです。

xlsxおよびxlsmは、Excel 2007から現在まで標準で用いられている拡張子です
xlsx:マクロを保存できない
xlsm:マクロを保存できる
の違いがあります。


一方xlsは、Excel 2003まで標準で用いられていた拡張子です。
Excel 2003のサポートは、2014年4月をもって既に終了していますが、xlsファイル自体はその後のファイル形式と互換性があり、現在のエクセルでも問題なく動作します。
マクロも保存できます。


だったらxlsで良いと思うかもしれませんが、xlsxはxlsと比べると
・xlsxの方がファイルサイズが小さい傾向がある。
・xlsxの方が使える行数と列数が多い。
というメリットがあります。

お使いのExcelのバージョンが2003以前であればxlsを使うしかありませんが、そうでなければ基本的にはxlsxで保存した方が良いです。



xlsファイルをxlsx(xlsm)で開くコード

image1.png

Option Explicit
Dim WithEvents ExcelApp As Application
Private Sub Workbook_Open()
    Set ExcelApp = Application
End Sub
Private Sub ExcelApp_WorkbookOpen(ByVal Wb As Workbook)
    Dim FSO As Object
    Dim BeforeFullPath As String
    Dim AfterExtensionName As String
    Dim AfterFileFormat As Long
    Dim AfterFullPath As String
    Dim AfterFileName As String
    Dim WbBuf As Workbook
    Set FSO = CreateObject("Scripting.FileSystemObject")
    BeforeFullPath = Wb.FullName
    If LCase(Right(BeforeFullPath, 4)) <> ".xls" Then Exit Sub
    If Wb.HasVBProject Then
        AfterExtensionName = "xlsm"
        AfterFileFormat = xlOpenXMLWorkbookMacroEnabled
    Else
        AfterExtensionName = "xlsx"
        AfterFileFormat = xlOpenXMLWorkbook
    End If
    AfterFileName = FSO.GetBaseName(BeforeFullPath) & "." & AfterExtensionName
    AfterFullPath = Wb.Path & "\" & AfterFileName
    'If MsgBox(Wb.Name & vbLf & "の拡張子をxlsから" & AfterExtensionName & "へ変更します。よろしいですか?", vbYesNo) <> vbYes Then Exit Sub
    On Error Resume Next
    Set WbBuf = Workbooks(AfterFileName)
    On Error GoTo 0
    If Not WbBuf Is Nothing Then
        MsgBox "申し訳ございません。" & AfterFileName & "が開かれているため、xlsを" & AfterExtensionName & "へ変更できませんでした。"
        Exit Sub
    End If
    If FSO.FileExists(AfterFullPath) Then
        If MsgBox("既に同フォルダに" & AfterFileName & "が存在します。上書きしますか?", vbYesNo) <> vbYes Then
            Exit Sub
        End If
    End If
    Application.DisplayAlerts = False
    Wb.SaveAs AfterFullPath, AfterFileFormat
    Application.DisplayAlerts = True
    FSO.DeleteFile BeforeFullPath
End Sub



流れは
・開いたファイルの拡張子が.xls以外なら処理を中止
・マクロが保存されているかによって、変換後の拡張子をxlsxかxlsmかに分岐
・※xlsxまたはxlsmに変換するかの確認ダイアログを出す。
・変換後の同名ファイルを既に開いていた場合は処理を中止
 (同じ名前のファイルは2つ同時に開けないため)
・変換後の同名ファイルが既に同フォルダに保存されていた場合は、上書きするかの確認ダイアログを出す。
・xlsファイルをxlsxまたはxlsmで同フォルダに保存しなおす。
・元のxlsファイルを削除する。

※はコード内でコメントアウトしています。
必要であればコメントアウトを解除してください。

常時使用したい場合はアドインに登録して下さい(^▽^)


最後に実際にxlsファイルを開いた時の動画を載せておきます。











サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら