こんにちは!Lenocoです。本日も見てくださりありがとうございます。
先日マクロの依頼があり作業をしていたのですが、
結合されたセルを基準にOffsetをしたところ、想定外の動きをして一瞬「??」状態になったので、
その時の状況と、解決方法についてお話したいと思います!
以下のようなデータがありました。
表の名称部分(「AAA」や「BBB」の部分)はB列からE列が結合されています。
Offsetでやりたいこと
表の名称AAA、BBBのセル位置が分かっている状態で、
このセルから各表の1の内容を取得したいと思います。
例)AAAの表であれば「あああ」(C7)、BBBの表であれば「かかか」(C15)を取得したい
基準となるセルが、例えばtgtRngというRange型の変数に入っているとしましょう。
その際、シンプルに考えると、Offset関数を使用して
tgtRng.Offset(4,1)
と指定することで希望のセル内容が取得できる気がしませんか?
罠にはまりました
ですが実際はこちらのセルが取得できます。
え??なぜ・・・?となりませんか!!!
調べてみたところ、
「セル結合内部から移動する場合は、結合範囲は一つとして数えられる」ということらしいです。
表の名称が入ったセルからOffset(4,1)なので、
下に4セル、右に1セルということになりますが、
今回の結合されたセルを基準にしている場合、
結合された最終の列から右に1セル、下に4セル
ということになるそうです。
解決方法
取りたいセルが取れない!となってしまうかもしれませんが、
同じOffsetを使って、これを解消してみましょう。
上記の結果では、「行」は正しくとれているけど、
列のセル結合がされているため、「列」が正しくとれていない状態ですよね。
以下のようなコードに変更したところ、取りたいセルが取れました!
tgtRng.Offset(4,0).Offset(0,1)
まず行をOffset(下に4セル)し、
そのあとに列をOffset(右に1セル)する、という2段階の方法にしています。
こうすることで、基準となるセルが4つ下のセルとなり、そこから右に1セルする、という動きになります。
※AAAであればB7セル、BBBであればB15セルが新しい基準セルとなり、そこから右に1セルとなります。
この方法であれば、列が結合されていても、ほしいセルを取得することができます。
なお、以下のように書いても同じ結果がとれます。
tgtRng.Offset(4,0).Offset(,1)
tgtRng.Offset(4).Offset(,1)
最後に
セル結合がされていると、時に扱いづらい場合があります。
今回は、システムから出力されるファイルの仕様なので仕方がないのですが、
ご自身で作成するファイルの場合には、なるべくセル結合は使わないほうが賢明かもしれないですね。
Lenoco
[…] [引用]セル結合しているセルからOffsetをする際の注意 […]