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系に慣れてしまうと書き難いな。