器用貧乏の独り言

器用貧乏なおっさんが気の向くままに。

【VBA】Excelの拡張子を一括変換するマクロ

◇前置き

Excelの拡張子(形式)に種類があることは、ご存じですか?

現行の最も無難な拡張子は「.xlsx」(2007以降)です。

時点でよく使われるのは「.xlsm」(マクロ有効ブック)でしょうか。

そして問題なのが「.xls」(97-2003互換)です。
一言で言うと、「古い拡張子」ですね。

「.xls」を「.xlsx」に変換するだけでファイル容量が小さくなります。

また「.xls」のままPowerPlatformに組み込むと、うまく動かないことがあったりします。

基本的に「.xlsx」に変換することにはメリットしかありません。

メリットがあるのは分かっていても、1つ1つ変換するのが面倒くさくて、なかなか手を付ける気にならないのが実情ではないでしょうか。

そこで今回は、フォルダ内の「.xls」をすべて「.xlsx」または「.xlsm」に一括変換するマクロを紹介します。

◇概要

こんな感じのExcelを用意しました。
C3にフォルダパスを入力して、実行ボタンでマクロを実行します。

ソースコード

ソースコードはこんな感じです。

Sub Exchange_File()
   
Dim i As Long
Dim Array1() As String
Dim FileName As String
Dim FolderPath As String
Dim ThisBook As String
 
   FolderPath = Range("C3") & "\"
   FileName = Dir(FolderPath & "*.xls")
   i = 0
   
   Do While FileName <> ""
       If LCase(Right(FileName, 4)) = ".xls" Then
           ReDim Preserve Array1(i)
           Array1(i) = FileName
           i = i + 1
       End If
       FileName = Dir()
   Loop
   
   For i = 0 To UBound(Array1)
       With Workbooks.Open(FolderPath & Array1(i))
           ThisBook = Left(Array1(i), InStrRev(Array1(i), ".") - 1)
           If .HasVBProject Then
               If Dir(FolderPath & ThisBook & ".xlsm") = "" Then
                   .SaveAs FileName:=FolderPath & ThisBook & ".xlsm", _
                   FileFormat:=xlOpenXMLWorkbookMacroEnabled
               Else
                   .SaveAs FileName:=FolderPath & ThisBook & "_" & Format(Now(), "yyyymmddhhmmss") & ".xlsm", _
                   FileFormat:=xlOpenXMLWorkbookMacroEnabled
               End If
           Else
               If Dir(FolderPath & ThisBook & ".xlsx") = "" Then
                   .SaveAs FileName:=FolderPath & ThisBook & ".xlsx", _
                   FileFormat:=xlWorkbookDefault
               Else
                   .SaveAs FileName:=FolderPath & ThisBook & "_" & Format(Now(), "yyyymmddhhmmss") & ".xlsx", _
                   FileFormat:=xlWorkbookDefault
               End If
           End If
           .Close savechanges:=False
       End With
   Next
 
   MsgBox (i & "件のファイル拡張子を変更しました。")
 
End Sub

◇使い方

実際に使ってみましょう。

今回はデスクトップに「Excel拡張子変換」というフォルダを用意しました。

中身はこんな感じです。


マクロありの「.xls」、マクロ無しの「.xls」、「.xlsx」の3種類のファイルが入っています。

早速実行してみると・・・・

3つあるファイルのうち2つが処理されました。

フォルダの中身を見てみると・・・・

ファイルが2つ増えていますね。
(※一応変換前のファイルも残す仕様にしてあります。)

「.xlsx」は変換の必要がないので、処理されません。

「.xls」はマクロあり→「.xlsm」、マクロ無し→「.xlsx」にそれぞれ変換されます。

◇最後に


今回は、変換前を残す仕様にしましたが、変換後に古い方を削除するようにしたり、そもそも変換後のファイルを別フォルダに出力するようにしたりすると、より使いやすくなりますね。

また、変換後のファイルと同じ名前のファイルが存在する時は、「元の名前+今日の日付」で保存するようにしてあります。(上書きしちゃうと元に戻せませんからね。)

適当にアレンジしながら使ってもらえればと思います。