第6回.表の先頭から最終行まで繰り返す(ForとEnd(xlUp).Row)
エクセルの表は、横の項目はあまり変更はないものですが、
縦のデータ数、つまり行数は常に変わるものです。
データ数に応じて、最終行まで繰り返す方法が必要です。
それにはデータの最終行が分かれば良いのです。
幸いなことに、VBAにはデータの入っている最終行を取得する方法が用意されています。
表の最終行を取得する
11
これを取得できれば良い訳です。
この11を取得するにはどうしたらよいでしょうか。
数万行あったら、スクロールも面倒です。
そういう時は、
A列の適当なセル(A1セルで良い)を選択して、
Ctrl + ↓
とすれば、連続データの最終行に飛んでいきます。
上記の表なら、
A1セルで、
Ctrl + ↓
A11セルに選択セルが移動します。
これなら、データが何万行あっても、一瞬で最終行に移動できます。
これをマクロVBAで書くと、
ですが、A列の途中に空白セルがあると、そこで止まってしまいます。
Ctrl + ↓
これを何度も押して、一番下に移動した経験がある方も多いのではないでしょうか。
つまり、上のコードでは、ちゃんとした最終行を取得できません。
また、もし1行目の項目名しかないと、
Ctrl + ↓
これでは、シートの一番下の、1048576行まで行ってしまいます。
シートの一番下の行から、
Ctrl + ↑
これで、データの入っている最終行で止まります。
つまり、
A1048576のセルから、
Ctrl + ↑
これで間違いなく、データの最終行に移動できます。
これをマクロVBAで書くと、
Rows.Countは、
1048576
という数値と同じ意味です。
シートの一番下の行の数値、つまり、シートの全行数を取得しています。
ですので、
Cells(1048576, 1).End(xlUp)
これと同じことになります。
.End(xlUp)
これらが、
Ctrl + ↓やCtrl + ↑
これらを意味します。
しかし、これはあくまで最終行のセルです、箱としてのセルそのものです。
行数ではありません。
セルの行数は、
.Row
と付け足すと、ぞのセルの行数が取得できます。
つまり、
A1048576のセルから ・・・ Cells(Rows.Count, 1)
Ctrl + ↑で移動したセル ・・・ .End(xlUp)
の行数 ・・・ .Row
という事です。
最初の画像の表なら、
これは、
11
にまります。
Cells(Rows.Count, 1)
これは、
A1048576セルの事で
そこから、
.End(xlUp)
そのセルからCtrl + ↑で移動したセルの.Row行番号という事です。
表の最終行まで繰り返す
この終了値の
11
を
Cells(Rows.Count, 1).End(xlUp).Row
これに取り替えることで、
(デー件数が変わっても)常に最終行まで処理されるようになります。
実際に、データを追加したり、削除して、
ちゃんと最終行まで計算されることを確認してください。
VBAの文法を覚える必要があるか
VBAを書くだけなら、上記のコードをコピペすれば済むことです。
ここを訪れるまでに、書籍やネットでVBAを勉強したことある人は、これらの言葉で挫折した人も多いのではないでしょうか。
ほとんどのオブジェクトは、マウスで操作できるもので、そのマウスで操作する対象の事です。
エクセルの代表的なオブジェクトと言えば、ブック、シート、セルという事になります。
オブジェクトを物体としてとらえると、その物体の状態を表すという事です。
オブジェクトに対して、こう動作しろ、こうなれ、と命令するという事です
多くの場合、オブジェクト名称を複数形にした名前になっています。
そのような説明を聞いて理解できるなら苦労しないし、ここには来ていないはずです。
こういう事をちゃんと覚えるのは後回しにしましょう。
今の段階では、用語としてそういう言い方をすると、それだけの理解で十分です。
しかし、書籍やネットを見れば、このような用語が出てきますし、
エクセルも、書き間違えてエラーを起こすと、これらの言葉で注意します。
その時に、何の事かが分からないと困ってしまいます。
逆に言えば、そのような時に困らなければ、それで十分だという事です。
そもそもオブジェクト、プロパティ、メソッドの違いなんて、ほとんど大した違いはありません。
VBAでの使い方・書き方の違い程度の事でしかないのです。
(あらゆる物体は、より小さな物体の集まりです)
オブジェクトは、プロパティとメソッドの集合体である。
(どういう物体かをプロパティが決めていて、メソッドでその物体は動かせる)
このようにイメージしてください。
ExcelマクロVBA入門等の対応ページ
オブジェクト式について
同じテーマ「マクロVBA再入門」の記事
第7回.セルの値によって計算を変える(Ifステートメント)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。