では前回の続きです。
今回はオブジェクト、プロパティについて触れるのははちょっとだけにします。
前回はややこしかったですね。
仕事をする範囲が定まらないときって意外とありますよね。どうしよ??というところで話が終わっていました。
定まらないからできません。って言いたくないのでやるためにはどうしようかって考えましょう。・・・自力で探しに行って決めちゃえば良いのでは??と思いませんか?
実際にやってみましょう。
範囲を指定する時にはRange("A1:E5")といったように始まりの列行と終わりの列行を指定しましたよね。
そもそも列と行って大丈夫ですよね?
上記が列と行です。
大体のデータって始まりの列行は分かりますよね。分からないのは終わりの列行です。
データを右下に見ていって最終行と最終列が交差するところが終わりの列行なのですがそれって手動で確認した結果ですよね?
毎回最終行と最終列を手動で確認してコード実行してたらそれはもはや手作業であり半自動というか残念な感じで・・・やめましょう。
方法はあります。
ほとんどの場合見出しの行が一番上にいるのでそこをカウントしたら最終列が取得出来そうな感じがします。
行は一番左の要素が番号とかだったら全部値が居そうな感じがしますがそうじゃないデータもあります。ただし一番左に来る要素って品番だったり氏名だったりほとんどは最終行に値が居るデータのはずだという(言い切って)事にして一番左の列を最終行を確認するための行に使います。
この時に途中で空欄が居てもよしとします。とにかく最後の行に値が居る列を最終行を取得するデータとして使います。そしてその確率が極めて高いのが表の一番左に来る要素だという事(にします)です。
では具体的にどうやって取得するのかといいますと・・・
行 = cells(rows.count,1).end(xlup).row
1は表の1列目を最終行を認識する行にした場合です。表の1列目がC列なら3になります。
列 = cells(5,columns.count).end(xltoleft).column
5は表の見出し行が5行目だった場合です。3行目が見出し行だったら3が入ります。
小文字になってますけどコンパイルエラー(構文違い)がなければ必要なところは大文字に変化します。
ではコードの意味を考えていきましょう。
まずは行。
Cells から始まってます。 Cells はRangeオブジェクトを返すプロパティです。
は? 何それ ? って最初のころ???しかなかったのを覚えています。
Cellsはオブジェクトじゃないのに先頭から始まってますので意味不明ですよね。
例えばCells(1,1)というコードはRange("A1")を返すといった具合になります。
CellsはRange(”*”)の形を返すのでRangeを先頭に書かなくてもよいぐらいに思っておいてください。あとでまた例外を言うのが確定しているので心苦しいのですがひとまずそう思ってください。
Cellsは Cells(行,列) という建付けになっています。Rangeとは逆ですね。
あーややこしい。
とっ散らかってますが落ち着いていきましょう。
ひとまずコードの前半分を考えます cells(rows.count,1) なので「1列目の行に入力があるセルを取得しますよ」って書いてます。
後半は .end(xlup) です。「いったん一番下のセルまで行ってから上に帰ってきて」と言ってます。
後半の後半 .row は「行を返して」です
前半のコードと合わせると 「1列目の行に入力があるセルを取得したいのでいったん一番下のセルまで行ってから上に帰ってきて値のあるセルの行を返して」って事になります。 「=結果最終行だよね」 ってことです。
実際の表で考えてみましょう。
1列目の行は5行目から始まってますがいったん置いといて・・・
「最終行まで行って1行目に向かって帰ってきた時に最初にある値は結果最終行だよね。その行番号だけをください。」っていう考え方です。
ここでは15行目が最終行という事になります。
列 = cells(5,columns.count).end(xltoleft).column
列も一緒です。 「5行目を起点に列方向へドン付きまで行って帰ってきたときに入力があるセルの列を教えて」 という事です。 「結果最終列だよね」ってことです。
これで守備範囲決まりましたね。