2013年4月16日火曜日

Excel 2003→2010/2013:コントロールに登録した引数付きマクロでエラー

引数付きのプロシージャを、コマンドボタンなどのコントロールにマクロとして登録しているとします。

Public Sub Message_Show(ByVal sMessage As String)
    MsgBox sMessage
End Sub

登録は下図のようにシングルクォーテーションで囲み、引数の前に半角スペースを入れればできます。


実行結果:


さて、このマクロを登録したブックが2003形式(.xls)だった時、Excel 2010や2013で操作していたらおかしなエラーが発生するのに気づきました(図は2013)。まず、ブックを2007形式(.xlsm)で保存し直そうとするとエラーメッセージが表示されました。

名前 <登録マクロ名> は有効な参照範囲と競合するか、Excelでは無効です。名前は _1<プロシージャ名>(アンダーライン)<引数> に置き換えられました。
この時点ではメッセージだけで何も変化はありません。しかし一度ブックを保存して閉じてから再度開くと、登録してあったマクロが警告通りに書き換えられていました。


もちろんそんなプロシージャはありませんので、実行してもエラーになります。元から2007形式のブックで上のようにマクロを登録していれば、この現象は起きません。

これと原因は同じなのか、もう一つおかしなことがありました。
上の2003形式のブックから、2007形式のブックへシートをまるごとコピーするとします。コピーするのは新規のシートで、データもコントロールも何もありません。


これでもエラーになりました。

移動またはコピーする数式に名前<登録マクロ名>が含まれていますが、この名前は有効なセル範囲またはExcel 2013で内部的に使用されている名前と重複するため、変更する必要があります。
ちょっと何言ってるかわかりません。
ちなみにここで「いいえ」を選択すると、「重複する」名前を変更するためのダイアログが表示されました。


妙なのは、ここで新しい名前を指定しようと先のメッセージで「はい」を選択しようと、コピー自体は完了するということです。手作業でやってるならいいんですが、VBAで自動化している場合は実行が中断してしまうので困ります。

いずれにしても、最初から2007形式で作っていればこんな問題は起きません。早く2003と2007以降が混在した環境がなくなるといいんですが。

0 件のコメント:

コメントを投稿