Dim loCreateWorkbook As Workbook
'// 新たなブックを作成する
Set loCreateWorkbook = Workbooks.Add
'// Excel2007以上の場合、Excel97 - 2003形式でBookを保存する
If Application.Version > 11 Then '// (1)
loCreateWorkbook.SaveAs Filename:="C:\test\hoge.xls" _
, FileFormat:=56 '// (2)
Else
loCreateWorkbook.SaveAs Filename:="C:\test\hoge.xls"
End If
Excel2003以前のバージョンで作成したマクロを、Excel2007以降のバージョンで実行する場合の注意点 「マクロから新しいブックを作成すると、作成したブックが正常に開けない」
加藤 (2011年5月20日 18:00)
企画開発部
Excel2007以降のバージョンで実行する場合の注意点をご紹介します。
Excel2003以前のバージョンで、新しいブックを作成するマクロを実装します。
そのマクロが実装されているExcelファイルをExcel2007以降で開き、
互換モードでマクロを実行した場合、以下のような問題が発生します。
マクロから作成された新規ブックを開こうとすると、
Excelファイルが破損しているという旨の警告メッセージが表示される。
ちなみに、Excel2007と、Excel2010では、
警告を無視してファイルを開いた際の動作が異なります。
・Excel2007の場合:
警告を無視してファイルを開くと、文字化けした意味不明な文字が表示される。
・Excel2010の場合:
警告を無視してファイルを開くと、内容は正常に表示されるが、保存できない。
上記の問題は、Excel2007以降のバージョンでマクロを実行した場合、
新規ブックを作成する処理を行うと自動的にExcel2007以降のファイル形式(拡張子がxlsx)で
Excelファイルを作成しようとする為、発生していました。
Excel2003以前のバージョンで作成したマクロなので、
拡張子は「xls」で保存するよう実装しています。
その結果、拡張子とファイルの内部形式に齟齬が発生してしまい、
警告が表示されてしまうのです。
このマクロを利用するユーザは、
Excel2003以前のバージョンを使用しているユーザもいれば、
Excel2007以降のバージョンを使用しているユーザもいます。
そこで、Excel2003以前のバージョンを使用しているユーザに対応する為、
ファイル形式は、Excel2003以前のバージョンの形式(拡張子がxls)で
作成する必要がありました。
Excel2007以降のバージョンで、Excel2003以前のバージョンで作成したファイルは、
Excelの互換モードを利用して開くことができるからです。
逆に、Excel2007以降のバージョンの形式のファイルを、
Excel2003以前のバージョンで開こうとした場合、
別途、変換ツールをインストールする必要があります。
余計な手間をユーザに掛けさせないという前提で作成したので、
ファイル形式は、Excel2003以前のバージョンを選択しました。
上記の問題に対して、以下のような方法で対処しました。
まず、マクロを実行しているExcelのバージョンを判定します。
その結果により、Excel2007以降のバージョンでマクロが実行されていた場合は、
Excel97-2003形式で新しいブックを保存するようにしました。
そうすることにより、Excel2003以前のバージョンでも、
Excel2007以降のバージョンでも正常に新しいブックを作成することが出来るようになります。
実装例を以下に記載しておきます。
Dim loCreateWorkbook As Workbook '// 新たなブックを作成する Set loCreateWorkbook = Workbooks.Add '// Excel2007以上の場合、Excel97 - 2003形式でBookを保存する If Application.Version > 11 Then '// (1) loCreateWorkbook.SaveAs Filename:="C:\test\hoge.xls" _ , FileFormat:=56 '// (2) Else loCreateWorkbook.SaveAs Filename:="C:\test\hoge.xls" End If以下、上記のコードの解説です。
(1)「Application.Version」で、マクロを実行しているExcelの
バージョンを取得することができます。
ちなみに、「11」は、Excel2003を表す数値です。
(2)マクロを実行しているExcelのバージョンを判定した結果、
Excel2007以降のバージョンだった場合、
Excel97-2003形式を指定してブックを保存しています。
ちなみに、「56」は、Excel97-2003形式を表す数値です。
Excel2007以降のバージョンでは、「xlExcel8」という
システム定数を利用することができますが、
今回の場合は、Excel2003以前のバージョンでも動作を保証するので、
システム定数を利用せずに値を設定しています。
Excel2003以前のバージョンで作成したマクロで、
新しいブックを作成する処理を実装していた場合、
ユーザの環境がExcel2007以降のバージョンに変更になった際には、
上記の問題が必ず発生します。