2013年04月07日

VBAでの列や行全体の絶対参照式出力について

エクセルでVBAを使う場合、セルを指定しやすくしたり位置を把握しやすくするために、デフォルトのA1参照形式ではなくR1C1参照形式を使用する設定にしていることが多いと思います。

このようにするとセルをRange("C2")ではなく、Cells(2,3)のように座標で指定することができますし、シートを目で見てもセル同士の位置関係が分かりやすく、便利です。

僕はいつもこうしているのですが、ヒストリカルデータに対する検証を行うために新しくシートを作る際、列全体を指定する数式をVBAでセルに出力しようとして、気づいたことがあります。

例えば、4列目(D列)のセルに2列目(B列)の合計値を計算したい場合、以下のようになると思います。
@ =SUM(B:B) A1参照形式の相対参照
A =SUM($B:$B) A1参照形式の絶対参照
B =SUM(C[-2]) R1C1参照形式の相対参照
C =SUM(C2) R1C1参照形式の絶対参照

特にへんなところはないでしょう?

で、VBAを使ってセルに数式を出力しようとすると、変な数式の場合は書き込みの際にエラーになってしまうのですが、上記4種類、全てエラーを起こさずにセルに書き込むことができます。

R1C1形式にしたブックのシート上に@、AをVBAで書き込むと、それぞれ =SUM(C[-2]) 、 =SUM(C2) に変換されてセルに書き込まれ、計算結果というか参照先も正しく選択されます。

そしてBの場合、そのまま=SUM(C[-2])が書き込まれます。まあ当たり前ですが。

問題はCのR1C1参照形式の絶対参照をVBAで出力した場合。

これを例えば Cell(3,4) = "=SUM(C2)" として実行した場合、セルにはなぜか =SUM(R[-1]C[-1]) と書き込まれます。もちろん正しく計算されるわけもなく・・・。

@とAの結果から明らかなように、VBAがA1参照形式をR1C1参照形式に変換した内容を出力してくれるようですが、"=SUM(C2)" の場合の(C2)をA1参照形式の(C2)と混同してしまっているのかなあと思います(バグ?)。

まあ要するに、行や列全体を指定する絶対参照をR1C1参照形式で表現してVBAで出力したい場合、注意が必要です、という話でした。

というわけで、ヒストリカルデータの検証は進めているのですが、データ量が大きすぎて難航しているところです。でもだいたいの傾向はつかめそうな気がしてきたので、来月にはリアルタイム検証を始めたいと思います。
posted by binopya at 10:31 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は90日以上新しい記事の投稿がないブログに表示されております。