今回は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)で開くコード
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ファイルを開いた時の動画を載せておきます。