ブログトップ 記事一覧 ログイン 無料ブログ開設

Kazzzの日記 このページをアンテナに追加 RSSフィード

2006-12-06

[][]Office 2007で問題になるマクロ後方互換


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

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

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

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

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

で良いと思ったのだが、"実行時エラー'1004'"と怒られる。
f:id:Kazzz:20061206080846p:image
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系に慣れてしまうと書き難いな。

kkamokkamo 2007/10/23 16:52 本日、Excel2007を使って、Excel 97-2003 ブック形式で保存するVBAを作ることになり、この記事を参考にさせていただきました。おおいに助かりました。ありがとうございます。
ところで、追記2のコードをEXCEL2000で実行すると、XlFileFormat.xlExcel8が未定義なので、コンパイルエラーになります。ご参考まで。なお、当方ではとりあえず動けば良いということで、値(56)を直接指定しました。

KazzzKazzz 2007/10/24 08:09 >ところで、追記2のコードをEXCEL2000で実行すると、XlFileFormat.xlExcel8が未定義なので、コンパイルエラーになります。

ご指摘ありがとうございます。Excel2000までは考慮していなかったです。

まきまき 2009/06/12 11:17 私も上記VBAにてXP-Excel2003、2007、2000の環境化で(LANで複数台のPCで使用)行っていました。最近1台のPCをVistaにupしました。このPCではExcel2003が入っておりましたが、同PCで上記同様のマクロを動かすと、”xlExcel8”で「プロジェクトまたはライブラリが見つかりません」とエラーになりました。Excelバージョンからすると、
ActiveWorkbook.SaveAs Filename:=newBook
の行に飛ばなければならないのですが、何故かElseの行に飛んでしまいます。Vista時の場合、2007を使用して欲しいと言うMSの意志が強いのでしょうか?

KazzzKazzz 2009/06/13 11:22 >「プロジェクトまたはライブラリが見つかりません」
まずはこのエラーの原因を調べてからではないでしょうか。
if文でエラーが発生しているのであれば、結果としての条件分岐は当てにならないですよ。

Officeは一度インストールするといろいろと残りますから、2003と2007の切り分けを行うのでしたら、クリーンインストールする必要があるかもしれません。

y 2012/02/20 15:05 はじめまして。
Excel2010環境で、ファイル数・ファイルサイズの都合で、ファイル形式の変更を機械処理したかったのですが、
同様の現象に悩まされ、困っていた中、等記事のおかげで助かりました。

上記の定数はExcel2010環境でも問題なく利用できました。

補足事項としては、数値と文字、罫線からなる1シートで構成されているファイルにおいてのファイルサイズは
xlsx > xls > xlsb でした。

大変助かりました。どうもありがとうございました!

KazzzKazzz 2012/02/21 17:34 yさんこんにちは。
お役に立てて良かったです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証