2012年03月28日

Excel2003からExcel2010に移行するにあたって

Excel2003で構築したマクロをExcel2010に移行する場合、いくつか注意点がありましたので連携したいと思います。
あくまで色々と実験してみた結果の個人的な意見です。賛否両論あろうかと思いますので、適宜自分に都合のよいところを取り入れていただければ幸いです。
実験結果は都合により、載せられませんが。。。


1. Excel2003で行を右クリックした時の「形式を選択して貼付け」機能のコントロールIDは変更になりました。よって、このIDを使用しているコードはOffice2007以下かどうか判定し分岐する必要があります。
残念ながら、具体的なコードは都合により載せられないです。。。ごめんなさい。
755で全文検索して見つかる場合は要注意です。
他にも変更になったIDがありそうですが、簡単に調べた限りでは見つけられませんでした。

2. Excel2007から最大行数が増えました。よって、Excel2003で65536のようにハードコーディングしている場合(例えばデータ件数を調べる処理など)は、不具合がでやすいです。
必ずRows.Countを利用し、Excel2003でもExcel2010でも動作するように修正しましょう。
特に65537とかは気づきにくいので、これもRows.Count + 1などと変換しましょう。
推奨は6553で全文検索してみることです。

3. Excel2010では時々、VBAの実行時間が長すぎると、MsgBoxが表示されなくなります。
その場合はMsgBoxのオプションにあるシステムモーダル化(もしくはアプリモーダル化)オプションを指定します。(vbSystemModal もしくは vbApplicationModal)
vbSystemModalはExcel2003にもあるため、コンパイルエラーは発生しません。

4. xlsmに移行するか、xlsの互換モードでいるか悩むところです。が、xlsの互換モードのままを推奨します。なぜならば、xlsmに変換した場合、影響が変換したからか、Office2010のマクロの問題なのかの切り分けが困難であること。もしかしたら、Office2003で再現するか再度確認が必要になるかもしれないことがあること。そして、xlsxやxlsmはある程度の容量を超えると警告なしにデータが保存されないことがある点を考えると、互換モードのままをユーザに推奨するよう説得するのが得策です。

5. よくExcel2010のVBAは遅いと聞きます。大量データを用意し、自前のテキストロード処理を実装している場合、Excel2010のほうが厳密に測った結果速くなりました。
これの原因は互換モードとかではなく、単純に事前にVBAのコンパイルをしていないせいだと思います。コンパイルすれば共に最低でもほぼ同じ速度で動作する実験結果を得ました。

6. Excel2000から脈々と続く、Formで入れたコマンドボタンのサイズやフォント、位置が変わるバグは、Excel2003、Excel2007、Excel2010でも発動します。ただし発動条件はそれぞれのバージョンで違うようです。絶対に全ボタンを押下したり、スクロールさせてみてください。特にスクロール範囲をVBAで変更している場合は要注意です。その場合、Excel2010ではボタンサイズが勝手に変わりました。変わってしまうExcelファイルはどうあがいても変わってしまいます。その場合は問題ないファイルをベースに作りなおしたほうが早いです。試行錯誤したり、ボタンだけを再配置しても無駄のようです。

7. マクロの有効化は、Excel2003は毎回有効にするか聞いてきますが、Excel2010では一度確認するとリセットするまで有効にしたことを覚えてくれます。これは逆にユーザが操作性に疑問を持つので教育が必要です。

8. 印刷プレビューの描画範囲がExcel2010では小さくなるため、若干見にくくなることをユーザに理解させる必要があります。

9. 描画のずれは、Excel2003でもExcel2010でも同じように発生します。よって、Excel2003でギリギリ印刷する設定の場合はExcel2010ではずれる可能性がありますが、少し余裕をもたせたレイアウトの場合や自動でセル幅を広げる場合は、レイアウトのズレは気にしなくてよさそうです。

10. ファイルの保存先をCドライブの直下にしている場合は、変更させるほうが良いでしょう。特にWindows 7ではユーザのスキルレベルによっては動かないなどの苦情を聞くことがありそうです。よって、マニュアル等でマクロの配置先をユーザを納得させる必要があります。

最後に。

11. CommandBarsを使っているマクロについては検証していません。リボンインタフェースになったことで、もしかしたらそのままでは使えない可能性がありそうです。こちらは余裕ができれば別途検証してみたいと思います。

12. Office自体の操作性の違いについては、事前に違いが大きいことを説明してから、細かなことを説明し、バージョンが変わり大きく違うことになったと説明する方が良いでしょうか。先に細かなことを説明してから最後にバージョンが大きく変わって、操作性が変わったといっても納得されにくい気がします。説明の順序の問題ですが。
posted by Kiruahさん at 00:07| Comment(7) | TrackBack(0) | ノウハウ
この記事へのコメント
はじめまして?よこやんです。
こちらで試した結果の報告です。

3の件、その設定でもMSGBOXが表示されません。

6の件、ページ設定の拡大縮小印刷が原因でないかと考えられます。この設定を100%に戻したことによって再現されなくなりました。

以上です。
Posted by よこやん at 2012年08月07日 09:02
よこやんさん。
長い間、全く気づいてませんでした。反応が遅くてごめんなさい。

見てくれたのですね。ありがとうございます。
上記の件、「あらまぁ」です。。。
特に3の件、遅いですが調べてみようかと思います。
Posted by Kiruah at 2012年10月07日 14:09
>6.
下記お試しあれ
Worksheet.PageSetup.Zoom = False
Posted by hillbase at 2013年01月23日 20:38
hillbaseさん、コメントありがとうございます。

試せていませんが、これでいければ簡単で良いですね。
情報有り難うございます。
Posted by kiruah at 2013年02月05日 11:26
はじめまして。
今、Excel2003のマクロを2010で動かすための調査をしています。
文章がわかりやすく、参考にさせていただいています。

ご存じでしたら教えてください。
GetSaveAsFilenameの引数InitialFilenameについてです。
この引数を省略した場合、2003では、オープンしたファイルの名前がデフォルトになっていました。
でも、同じマクロを2010環境で動かすと、デフォルトのファイル名が表示されなくなってしまいました。
これは、Excel2010の仕様(2003からの変更点?)
なのでしょうか。
# それらしい情報がみつけられませんでした。。。

よろしくお願いいたします。
Posted by のん at 2013年12月04日 18:58
のんさん。
返信が遅くなって申し訳ございません。
しばらく都合であまりネットができておりませんでした。。。

さて、本件ですが、もう閲覧されていないかもしれませんが、OSはWindows 7でしょうか?
Vistaはどうかまでは確認できておりませんが、Windows 7では、引数のFileFilterを指定し、その拡張子とInitialFilenameの拡張子の大文字・小文字をあわせてあげる必要があります。(FileFilterは、*.*でも大丈夫か確認するのを忘れていました。すみません。)

もしInitialFilename = "test.csv" であれば、FileFilter = "CSV File,*.csv" と、InitialFilenameの拡張子が小文字であれば、FileFilterにも小文字で*.csvを指定する必要があります。
逆にInitialFilename = "test.CSV" であれば、FileFilter = "CSV File,*.CSV"と、大文字小文字が区別されるようになったようです。
Posted by Kiruah at 2014年01月28日 23:45
はじめまして bellevardeといいます。
現在 同じような案件対応をしています。
参考にさせていただきます
Posted by bellevarde at 2014年09月09日 10:46
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/54657245
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック