★★★★★★Access2000VBA・Excel2000VBA独学~結合セルの最初のセルと最後のセルのアドレス(番地)を調べる自作関数~請求書の「明細データ」などの、「結合されたセルを持つ帳票」のセルデータをテーブルデータなどに整形・クレンジング(?)するときなどに。~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
※関連記事
★★★★★★Access2000VBA・Excel2000VBA独学~例えば、セル結合もある、「3行単位で1レコード」の帳票を、1行1レコードの一覧表に変換する若干汎用的なプログラム~

  
  
★ はじめに

例えば請求書などで、明細内容が、テーブル形式(リスト形式)ではなく、データの並びが「自由」な「帳票形式」で書かれて、送られてくる場合があります。

例えば下図のような。

このようなデータを、VBAなどでテーブル形式(リスト形式)に別の場所に整形して転記したい場合、セル結合が多く使われていますので少々面倒になると思います。

セル結合が一切なければ、For Each 文だけで比較的ラクに処理できそうな気がしますが、セル結合がバンバンに入っていますと、For Each 文だけでは少々難しいです。

で、そのような場合に(For Each 文ですべてのセルを回したときに)、
・そもそも今チェックしているセルは結合されているのかどうか?
・結合されているなら、どこからどこまでの結合に含まれるか?
などが判定できると便利です。

困るのは、
・結合されているかいないかを空白セルかどうかで判定してしまったとき
で、かつ、
・空白セルなら処理を飛ばす(つまり、何もしない。)
みたいにしてしまったときです。
それをやってしまうと、上図の「単位」や「備考」のように値を持っていないセルが、「空白セルとして転記」されず、「なかったもの」と『 誤判断 』されて、転記結果の列や行に「ズレ」が生じることがあります。

そのようなことを回避するために、
・そもそも今チェックしているセルは結合されているのかどうか?
・結合されているなら、どこからどこまでの結合に含まれるか?
が必要になってくると思います。

結合されたセルの場合、「結合された先頭のセル」に値を入力することになりますので、
・今チェックしているセルのアドレスが、結合セルの先頭セルと同じアドレスなら、値が空でも転記する、
というような条件分岐が作れると思います。

結果、転記先の列や行が「ガタガタ」になることを防げると思いますし、For Each が使えるケースも少し増えて、プログラミングが少しラクになる気がします。

本記事はそのようなときのために使う、自作関数のご紹介です。

プログラム内容としては、以降に示したようなかたちです。

例えば「GetMrgCelAddr_Fst()」関数の場合なら

GetMrgCelAddr_Fst(Range("A1"))

のように使います。

このとき、「Range("A1")」の部分は、For Each でセル範囲を走査したいときなら、単一セルを受けるオブジェクト変数でもOKです。

  

  
  
★ この関数を作る前のテストコード(現況調査コード)

  

  
★ GetMrgCelAddr_Fst関数とLTrimWrd関数を使って、明細の値をイミディエイトに表示する例
(冒頭の図の場合。)