こんばんは、ファルコンM です。
VBA でコーディングをやっていて、Merge メソッドでセル結合を行うとセルがずれる問題が発生した。
その問題の対処法について。
対処法を一言で言うと、「基準セルを結合するな。」
セルがずれる問題の詳細
まず、以下のVBA コードについて
Sub Test() Range("B2").Offset(2,2).Value="D4 だよ" End Sub
このコードを実行すると、D4 セルに”D4 だよ” って文字が表示される。
では、次に以下のコードを実行した場合はどうなるだろうか?
Sub Test() Range("B2:C3").Merge Range("B2").Offset(2,2).Value="D4 だよ" End Sub
B2、B3、C2、C3 をmerge メソッドで結合する処理を追加しただけ。
コードを実行してみると、、、、、
なんと、”D4 だよ” って文字がE5 セルに表示された。
結合処理をしただけなのに。
なんで表示する場所がずれてしまったのか?
セルがずれる問題の原因
大げさに書いたが、感のいい読者の方はもう理由は分かっただろう。
range(“B2”) とした場合、B2 が結合されていたならば、基準が結合されているセルの右下になるのだ。
つまり、先ほどの2つ目の例の場合、Range(“B2”) と書くと、B2、B3、C2、C3 が結合されているので、C3 を表している。
すなわち、Range(“B2”) .Offset(2,2) は、C3 から下に2、右に2 移動したセルなので、E5 となる。
“D4 だよ” という文字がE5 に表示された。
セルがずれる問題の対処法
結合するセルは基準のセルに使わないこと。
まず、こうなってしまうのはVBA の仕様なので、ここを変えることはできない。
結合するセルを基準にしたまま、結合した後オフセットが変わることを考慮して作ることも効率が悪い。
冒頭に書いた通り、基準セルを結合するなってことが一番いいだろう。
以下のように書けば全く問題はまったくない。
Sub Test() Range("B2:C3").Merge Range("A1").Offset(3, 3).Value = "D4 だよ" End Sub
最後にもう一度、「基準セルを結合するな。」
コメントを残す