2006-12-06
■[PC][プログラミング]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系に慣れてしまうと書き難いな。
トラックバック - http://d.hatena.ne.jp/Kazzz/20061206/p1
リンク元
- 15 http://reader.livedoor.com/reader/
- 11 http://d.hatena.ne.jp/
- 10 http://feedbringer.net/feed
- 6 http://www.google.com/reader/view/
- 5 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-36,GGLJ:ja&q=powershell+コマンドレット作成
- 4 http://sonic64.com/planet/dotnet/
- 4 http://www.live.com/
- 3 http://a.hatena.ne.jp/chocoring/simple
- 3 http://d.hatena.ne.jp/asin/4891005238/hatendiarynya-22
- 3 http://r.hatena.ne.jp/coma2n/C#/