Office 2007で問題になるマクロの後方互換性

Office 2007は既定のデータ保存フォーマットが変わり、過去のOfficeとは互換性の無い形式で保存される。とはいえ後方互換性を完全に捨てた訳ではなく、例えばExcel 2007であれば、Officeボタンから「名前をつけて保存」->「Excel 97-2003 ブック」で保存することでデータの後方互換を保つことができる。(オプションで保存形式のデフォルトとして設定することもできる)

ならば、過去のデータをOffice 2007で扱うのは全然問題無いと思うのは早計だ。

一番問題になるのは、いたるところで使われているマクロだ。先日書いたマクロの配置場所によるエビデンスの設定もそうだが、既に書いたとおり、後方互換性を保つ形式で保存する場合は、明示的に指定する必要がある訳で、過去に作ったマクロ、例えばデータを計算して、その結果を動的にExcelシートに出力、保存するようなマクロをOffice 2007のアプリケーション群から実行すると、後方互換性の無いExcelシートが出力されて、過去のOfficeがインストールされているPCで読み込めない(恐らくは「データが壊れていると言われる」)といったトラブルが発生するだろう。

単にアクティブなワークブックを保存するのであれば

ActiveWorkbook.SaveAs Filename:="ワークブックの保存パス", FileFormat:=XlFileFormat.xlExcel9795

で良いと思ったのだが、"実行時エラー'1004'"と怒られる。

VBAは得意じゃないのがばればれ。

原因が解った。Excel 2007で使えるファイルフォーマットを表す定数の一覧は以下のとおりで、どうやら定数XlFileFormat.xlExcel9795ってのはオプションとして使えないらしい

通常Excel 2007で使うXlFileFormat列挙体の定数

51 = xlOpenXMLWorkbook (without macro's in 2007, xlsx)
52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007, xlsm)
50 = xlExcel12 (Excel Binary Workbook in 2007 with or without macro’s, xlsb)
56 = xlExcel8 (97-2003 format in Excel 2007, xls)

従って、Excel 97-2003 ブック形式で保存するVBAならば

ActiveWorkbook.SaveAs Filename:="ワークブックの保存パス", FileFormat:=XlFileFormat.xlExcel8

でOKのはずだ。

追記2

XlFileFormat.xlExcel8は逆に過去のOfficeで使えない可能性があるので、アプリケーションのバージョンを判定しないと駄目かも。

Dim newBook As String
newBook = "ワークブックの保存パス"

'以前のExcelなら指定無しで保存
If Val(Application.Version) < 12 Then
    ActiveWorkbook.SaveAs Filename:=newBook 
Else
    ActiveWorkbook.SaveAs Filename:=newBook, FileFormat:=XlFileFormat.xlExcel8
End If

VBAはすごい久しぶりに書いたのだが、C系に慣れてしまうと書き難いな。