エクセルで「このフォルダの中のxlsxファイルをまとめて自動的にxlsに変換できないかなぁ(またはその逆)」ということはないですか?
今回、VBA初めて3日間の初心者の私がVBAでマクロを作ってみたので公開します。
動作対象
- Windows版のExcel2007以降が対象
- 作成は、Windows 10上のExcel 365で行いました
- Windows固有の内部コマンドを使っているので、Mac版のExcelでは動きません
開発の経緯
エクセルではバージョン2003までのファイル形式が拡張子xls、2007以降はxlsxとなって互換性がありません。
よって、ファイル形式を変える場合は、いったんファイルを開いて形式を変えて保存という作業が必要になります。
また、ネットでググると有料の変換ツールがいくつも見つかりますが、無料は見つかりませんでした。
そこで、xlsxとxlsの相互変換だけのシンプルなツールをVBAマクロで作ってみました。
自作VBAマクロのダウンロード
以下のリンクをクリックして、ファイルをダウンロードしてください。
ダウンロードして最初にファイルを開くと、以下の画面のように「保護ビュー」が出ますが、「編集を有効にする」をクリックしてください。
理由は、これをクリックしないと、画面に配置しているボタンが使えないためです。

いったんファイルが閉じて再度開くと、以下の画面のように「セキュリティの警告」が出るので、「コンテンツの有効化」をクリックします。

これで、VBAマクロが使えるようになるはずです。
VBAの内容
データ形式を変換するモジュールを以下に転記します。
Sub ConvertFiles()
' このVBAは、Windows専用です。Macでは使えません。
'On Error GoTo MyError
On Error Resume Next
Dim buf As String
Dim cnt As Long
Dim numConvert As Integer
Dim extImport, extExport As String
' 「1.変換方法」の取得
' 「指定内容」のワークシート
Dim wsSelectedItems As Worksheet
Set wsSelectedItems = Worksheets("指定内容")
' 「変換方法」の取得
numConvert = wsSelectedItems.Cells(1, 2)
If numConvert = 1 Then
extImport = "xls"
extExport = "xlsx"
Else
extImport = "xlsx"
extExport = "xls"
End If
' 「2.フォルダ指定-インポート」「3.フォルダ指定-エクスポート」の取得
Dim pathImport, pathExport As String
pathImport = ActiveSheet.TextBox_FolderImport.Text & "\"
pathExport = ActiveSheet.TextBox_FolderExport.Text & "\"
' 4.変換実行
buf = Dir(pathImport & "*." & extImport)
' ファイル名格納用の配列
Dim arr() As String
Do While buf <> ""
If LCase(buf) Like "*." & extImport Then
cnt = cnt + 1
' wsFileNames.Cells(cnt, 2) = buf
' 配列に代入
ReDim Preserve arr(1 To cnt)
arr(cnt) = buf
End If
buf = Dir()
Loop
' 取得したファイルを開く
Dim fileImport As Workbook
' エクスポートするファイル名
Dim fileExport As String
If cnt > 0 Then
' 開く https://www.excelspeedup.com/workbookopen/
' 閉じる https://excel-ubara.com/excelvba5/EXCELVBA217.html
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For i = 1 To cnt
Set fileImport = Workbooks.Open(pathImport & arr(i))
' 保存するファイル名を作成
If extExport = "xls" Then
fileExport = Mid(arr(i), 1, Len(arr(i)) - 5) & ".xls"
' 名前を付けて保存 https://www.sejuku.net/blog/67491
fileImport.SaveAs Filename:=pathExport & fileExport, FileFormat:=xlExcel8
Else
fileExport = Mid(arr(i), 1, Len(arr(i)) - 4) & ".xlsx"
' 名前を付けて保存 https://www.sejuku.net/blog/67491
fileImport.SaveAs Filename:=pathExport & fileExport, FileFormat:=xlOpenXMLWorkbook
End If
fileImport.Close savechanges:=False
Next i
Application.ScreenUpdating = True
End If
' 完了処理
MsgBox "処理が完了しました。" & cnt & "個"
Exit Sub
MyError:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "エラーが発生しました。" & vbCrLf & Err.Description, vbExclamation
End Sub

このページの記事は、ここまでです。



コメント