既にExcel2002が出回っていた頃、こんな体験をしたことがある。


ある工業メーカーで、オフコン上の部品表を閲覧/更新するシステムをExcel97で作成されており、この機能拡張を行った。拡張後、特に問題なく動作していたのだが、あるPCのみ「エラーが出る」と連絡が入った。
調査してみると、そのPCのみExcel2000が入っており、テキストボックスかラベルかは忘れたが、Excel97とExcel2000とで互換性がなくオブジェクトのエラーが発生していた。


Excel97を使っている顧客はまだ居るので、ワークシート上にテキストボックスやラベルなどを配置したい場合、他の方法で代替可能であれば避けておいた方がよい。例えばフォームを使う、等である。

今度のOfficeは大きく変わるそうであるので、他にもいろいろありそうではある・・。


ワークシートに埋め込める関数として =SUM(A1:A10) など、Excelが既に持っているものがある。しかし、条件によっていろいろと切り分けたりすると複雑になったりもするし、やりたいことがなかなか実現できなかったりすることもある。


そんな場合、VBAでワークシート関数を作成することが可能である。


手順

1. 標準モジュールを追加する。





2. 追加したモジュールに Public のFunction を任意の名前で作成する。内容もサンプル程度でよい。




3. シートに関数を記載する。




確認

1. 関数の参照先に値を入れる。





この方法、Excel5のVisual Basic ガイドには書いてあったと思うが、それ以降のバージョンでは見ないように思う。

今回のサンプルなので単純に文字列を連結しただけのものであるが、応用すればいろいろできるだろう。

ただし、セルに色を着けたり、ということはできないのでご注意を。



データベースからデータを読み込んで貼り付ける場合、書式がうまく反映されないことがある。


データベースの型とセルの書式を合わせておくことである程度可能であるが、日付項目だけはうまくいかない場合が多い。

Excel自体は書式がうるさく、例えば 2007/05/01 は日付としてみなされない。2007/5/1 のように前ゼロを取る必要がある。

SQL文内で書式を変えると文字列になってしまうため、その文字列のままとなり、書式が有効にならない。そんな場合は「自セルに値を入れ直す」ことで書式を有効にできる。Cells(y,x).Value = Cells(y,x).Value というようにする。


また、割り切って「書式は使わない」という手もある。


書式問題は手こずるところであろう。事前によく検討し、最適な手段を選択する必要がある。