フォルダ内すべてのExcelファイルをxlsからxlsxに変更するマクロ

  • URLをコピーしました!

「.xls」形式のExcelファイルを「.xlsx」形式へ一括して変更する場合、マクロを使うと便利です。
EX IT 3
※Keynoteで作成 iPhone X

Excelファイルのxlsとxlsx

Excelのファイルは、Excel2003以前と2007以降で、大きく種類が変わりました。

Excel2003以前は、拡張子(ファイルの最後につく)が「.xls」
Excel2007以降(2007、2010、2016、Office365)は、「.xlsx」です。
(Excel2007以降でも、「.xls」で保存することはできます。)

マクロが入っているExcelファイルは、
Excel2003以前は、「.xls」で通常のものと同じ
Excel2007以降は、「.xlsm」です。
(Excel2007以降でも、「.xls」で保存することはできます。)

古いExcelファイル(.xls)をxlsx形式で保存したいということもあるでしょう。
1つ、2つなら、xlsファイルを開いて、名前をつけて保存(F12)で、xlsxファイルにしてもいいかもしれませんが、これが5、10、100となると、手作業でやるのは大変です。
こういうときもExcelマクロが役に立ちます。

xlsをxlsxに変換するマクロ

Xlsをxlsxに変換して保存するマクロはこういったものです。

Sub Excel_fileformat_change()

     
'フォルダの場所を変数に入れる
    Dim Folder_path
    Folder_path = "\\Mac\Dropbox\そのままExcel 事例"
    
'xlsファイルを探すように指定
    Dim Excel_book
    Excel_book = Dir(Folder_path & "\*.xls*")

    
'指定フォルダから、xlsファイルを開き、xlsxで保存

    Do Until Excel_book = ""
        If LCase(Right(Excel_book, 3)) = "xls" Then
            
            
            Workbooks.Open Filename:=Folder_path & "\" & Excel_book
            
            Application.DisplayAlerts = False
                
            If ActiveWorkbook.HasVBProject = True Then
                ActiveWorkbook.SaveAs Filename:=Excel_book & "m", FileFormat:=xlOpenXMLWorkbookMacroEnabled
            Else
                ActiveWorkbook.SaveAs Filename:=Excel_book & "x", FileFormat:=xlOpenXMLWorkbook

            End If
            
            ActiveWorkbook.Close
                
            Application.DisplayAlerts = True
        
        End If
        
        Excel_book = Dir()
    
    Loop

End Sub

①フォルダを指定

まずフォルダを指定します。

EX IT 4

プログラムに直接書いてもいいですし、ファイルを選択する方法もできます。
変数というのは好きに決められます。
「フォルダ」でもいいですし、「folder」でもいいですし、fでもかまいません。
自分で使うなら自分がわかるようにすれば十分です。
ただ、内容がわかるようにつけたほうが後から読みやすくはなります。
私は、アルファベットでつける主義です。

こういった変数を使わなくてもいいのですが、あとのプログラムが、
Excel_book = Dir(“\\Mac\Dropbox\そのままExcel 事例”\*.xls*”)
と長くなります。
変数を使うと、
Excel_book = Dir(Folder_path & “\*.xls”)
と短くみやすくなるわけです。

ただ、これはケースによります。
変数をあえて使わないほうが見やすくなることもありますし、他人が名付けた変数は読みにくいケースも多いものです。
プログラムが長くなろうと、効率化できるのは変わりませんので、あまりこだわらないほうがいいでしょう。

②xlsファイルを探すように指定

xlsを含むファイルを探すように指定します。
Dirは、ファイルがあるかどうかを判定する関数です。
Dir(○○)の○○があれば、そのファイル名を示します。
それをExcel_bookという変数に入れているわけです。

③xlsファイルを開き、xlsxファイルとして保存

EX IT 9

Do Until Excel_book = “”
○○
Excel_book = Dir()
Loop
でセットで、Excel_bookがフォルダ内にある限り、黄色の枠の処理を繰り返すという意味です。
繰り返しはマクロの必殺技で、疲れずひるまずミスなく繰り返してくれます。

直訳すると、「Excel_bookがブランク(””)でない(=until)限り繰り返す(Loop】」で、プログラムは、こういう翻訳が大事です。
自分がやりたいことをどう翻訳するか、プログラムをどう翻訳するかの勝負ともいえます。
論理的なもので、文系・理系関係ないものなのです。
むしろ文系もむいています。

特殊な事例を想定して、IFで判定するようにしました。
「Xlsを含む」と処理すると、「xls」も「xlsx」も「xlsm」も含まれるので、
If LCase(Right(Excel_book, 3)) = “xls” Then
で処理しています。
Lcaseは大文字を小文字にする関数。
仮に「xls」でなく「XLS」の場合でも対応します。
Rightは、右から○文字を取り出す関数。
ファイル名の右から3つが、「xls」なら、「xlsx」や「xlsm」ではありません。

そして、xlsファイルには、前述のとおりマクロが入っている場合があります。
マクロが入っていると、xlsxではなく、xlsmにしたいので、IFで判定しました。

HasVBProjectでマクロが入っているかどうか判定できます。
マクロが入っていれば、「xls」に「m」をつけて「xlsm」にし、ファイル形式(FileFormat)を、マクロ有効ブック(xlOpenXMLWorkbookMacroEnabled)に、入ってなければ「xls」に「x」をつけて「xlsx」にし、ファイル形式(FileFormat)を、Excelブック(xlOpenXMLWorkbook)にします。
Xlsをxlsm、xlsxに置き換えるというプログラムにすることもできますが、こういうのはアイデア次第でなんとでもできるわけです。
これがプログラミングのおもしろいところでもあり、おすすめする理由でもあります。

If ActiveWorkbook.HasVBProject = True Then
ActiveWorkbook.SaveAs Filename:=Excel_book & “m”, FileFormat:=xlOpenXMLWorkbookMacroEnabled
Else
ActiveWorkbook.SaveAs Filename:=Excel_book & “x”, FileFormat:=xlOpenXMLWorkbook

End If

保存する場所は、Excelの規定の保存フォルダ(通常はドキュメント)です。
Excelのオプション(Alt→T→O)の[保存]で確認しておきましょう。

EX IT 10
もちろん、フォルダを指定することもできます。

その前にある
Application.DisplayAlerts = False
は、「警告が出たら無視してくれ」という便利なプログラムです。

これがないと、すでに同じ名前のファイルがあった場合、こういった警告があります。
気にしないで上書きしてくれという意味です。
EX IT

こういうことも本来は丁寧に依頼しなければいけません。
人対人だと、
・「う、上書きしても大丈夫ですか?」と部下が聞くと、上司が「そんなん当然だろ!ジョーシキで判断しろ!」と怒る
・「上書きしときました」と言うと、上司が「なんで上書きするんだ!普通しないだろ!」と怒る
なんてことが起こるわけです。

xls-xlsx変換マクロの考え方

このマクロを、最初から書こうとすると、特殊事例も考えなければいけませんし大変です。
まずは小さくつくりましょう。
繰り返しも考えず、シンプルに、ファイルを開くところから書き始めます。

Sub Excel_fileformat_change()

	Workbooks.Open Filename:="\\Mac\Dropbox\そのままExcel 事例"\移動年計.xls"
            
End Sub

これを実行(F5)して、うまくいったら、変数で表現します。
Dimは変数を定義するものです。
・「Folder_path」は変数
・Folder_pathは”\\Mac\Dropbox\そのままExcel 事例”である
という指令を意味します。

Sub Excel_fileformat_change()

     
'フォルダの場所を変数に入れる
    Dim Folder_path
    Folder_path = "\\Mac\Dropbox\そのままExcel 事例"
    
    Dim Excel_book
    Excel_book = "移動年計.xls"

	Workbooks.Open Filename:=Folder_path & "\" & Excel_book

End Sub

これを実行して正しく動いたら、次はxlsxに変えて保存してみましょう。

Sub Excel_fileformat_change()
     
'フォルダの場所を変数に入れる
    Dim Folder_path
    Folder_path = "\\Mac\Dropbox\そのままExcel 事例"

   
    Dim Excel_book
    Excel_book = "移動年計.xls"

    Do Until Excel_book = ""
    Excel_book = Dir()
   Loop
    Workbooks.Open Filename:=Folder_path & "\" & Excel_book

    Application.DisplayAlerts = False
        
    ActiveWorkbook.SaveAs Filename:=Excel_book & "x", FileFormat:=xlOpenXMLWorkbook
    ActiveWorkbook.Close
        
    Application.DisplayAlerts = True

End Sub

これで動いたら、
Do Until Excel_book = “”
Excel_book = Dir()
Loop
を書いて、上記のプログラムを入れ、”移動年計.xls”を変数に変えていきます。
えいやっと実行してみてうまくいけばOKくらいの心意気で行きましょう。

Sub Excel_fileformat_change()
     
'フォルダの場所を変数に入れる
    Dim Folder_path
    Folder_path = "\\Mac\Dropbox\そのままExcel 事例"

   
    Dim Excel_book
    Excel_book = "移動年計.xls"

    Do Until Excel_book = ""
    Excel_book = Dir()
     Loop

    Workbooks.Open Filename:=Folder_path & "\" & Excel_book

    Application.DisplayAlerts = False
        
    ActiveWorkbook.SaveAs Filename:=Excel_book & "x", FileFormat:=xlOpenXMLWorkbook
    ActiveWorkbook.Close
        
    Application.DisplayAlerts = True

End Sub

Sub Excel_fileformat_change()
     
'フォルダの場所を変数に入れる
    Dim Folder_path
    Folder_path = "\\Mac\Dropbox\そのままExcel 事例"

   
    Dim Excel_book
    Excel_book =Dir(Folder_path & "\*.xls*")

    Do Until Excel_book = ""

      Workbooks.Open Filename:=Folder_path & "\" & Excel_book
      
      Application.DisplayAlerts = False 
      ActiveWorkbook.SaveAs Filename:=Excel_book & "x", FileFormat:=xlOpenXMLWorkbook 
      ActiveWorkbook.Close 
      Application.DisplayAlerts = True    
      
      Excel_book = Dir()
     Loop

End Sub

これでひとまず完成です。
特殊事例は必要あれば入れましょう。
フォルダに、マクロの入っていないxlsファイルだけを入れれば、このプログラムだけで問題ありません。
人がちょっと工夫するとプログラミングは楽になります。
どんな人が何をやっても大丈夫なプログラムはコストがかかり、それを重視しすぎるとそのプログラムによるソフトは使いにくくなるものです。
(会計ソフトや税務ソフトはそうでしょう。わかってやっているのかどうかですが)

サンプルファイルでは、フォルダを指定するマクロをボタンに入れていますので、フォルダを指定してから、次のマクロ(xlsx変換)を使ってみていただければ。

EX-ITサンプル Excel xlsからxlsx変換マクロ.xlsm

このサンプルをそのまま使うのではなく、実際にプログラムを書いてみましょう。

 

 


【編集後記】

昨日は、東京ビックサイトのAI・人工知能EXPOへ。
といっても午前中は仕事して、AI弁護士とランチして、Amazonのセッションを聴いて、会場に入ったのは14時前。
気になるブースを回ってきました。
予想通り(?)、うーんというものも多かったのですが。

その後、AI弁護士と合流してスイム練。
4月にトライアスロンデビューし、7月は一緒の大会に出ます。

【昨日の1日1新】
※詳細は→「1日1新」

AI・人工知能EXPO
クリエイターズEXPO

【昨日の娘日記】

最近、なぜかお風呂を嫌がります。
ちょっと前まで大好きだったのに。。

  • URLをコピーしました!