0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBA学習備忘録_05_VBAによる表の最終行・最終列の取得に関する整理

0
Last updated at Posted at 2026-02-02

の続き


例えばPythonでいうところの

sample.py
# 配列itemsを定義 ※Python等の配列のインデックス番号は0から始まることに注意
items = ["test1","test2","test3"]

# PythonのFor文の例
for i in range(len(items)):
    print(i+1,items[i])

#-----出力結果------------
>> 1 test1
>> 2 test2
>> 3 test3

range(len(items)) にあたるものの書き方がVBAだとそこそこ慣れない感じだったので、自分の頭の整理のために以下にまとめておく

※(VSCodeの)インタラクティブシェル(VBAで言うイミディエイトウィンドウ)で出力してみた様子

image.png


例えば、以下の表のA列において番号を入力していくような場合を考える。
※実際はこれぐらいならオートフィルで手入力でいい気もするが(-_-;)。。あくまで例ということで

 A   B   C   D 
1 番号 氏名 年齢
2 A田B男 30
3 C山D子 29
4 F山G男 30
5

これをマクロで何とかする場合、マクロを後で使い回しやすいように、終了値はEndプロパティで何が来てもいい感じに取得されるようにすることが多いらしい

以下の例は「4」が「分かっていない」ものとして

Sub 番号書き込み1()
    Dim 行番号 As Long

    For 行番号 = 2 To 4
        Cells(行番号,1).Value = 行番号 - 1
    Next 行番号 
    ' Nextの次の行番号は省略可
End Sub

「To」の後ろをEndプロパティ等を使って書き換えたものである

(1)1行目のセルからB列を見たときに下方向に向かって最終行(=値がある最後の行)を探す場合

Sub 番号書き込み1()
    Dim 行番号 As Long

    For 行番号 = 2 To Range("B1").End(xlDown).Row
        Cells(行番号,1).Value = 行番号 - 1
    Next 行番号 
    ' Nextの次の行番号は省略可
End Sub

Range("B1").End(xlDown).Row

(2)シートの最終セルのある行からB列を見たときに上方向に向かって最終行を探す場合

Sub 番号書き込み2()
    Dim 行番号 As Long

    For 行番号 = 2 To Cells(Row.Count,2).End(xlUp).Row
        Cells(行番号,1).Value = 行番号 - 1
    Next 行番号 
    ' Nextの次の行番号は省略可
End Sub

Cells(Row.Count,2).End(xlUp).Row

以下のような書き方もあるらしい

Sub 番号書き込み2()
    Dim 行番号 As Long

    For 行番号 = 2 To Range("B" & Rows.Count).End(xlUp).Row
        Cells(行番号,1).Value = 行番号 - 1
    Next 行番号 
    ' Nextの次の行番号は省略可
End Sub

Range("B" & Rows.Count).End(xlUp).Row

「&」は文字列結合演算子

結局何をしているのか

~.End() までで何らかのセルを取得し、「.Row」で、その行数を取得している。

※上の例では「B4セル」を取得し、「.Row」でその行数の「4」を取っている

~End(xl~).Column で同様に列数を取った場合、A、B、C、・・・ではなく、
1,2、3・・・の値が取得される

Sub sample()
    ActiveCell.Value = Cells(指定したい行の行数, Columns.Count).End(xlToLeft).Column
End Sub

.End()プロパティの移動に関する注意

(1)〇〇.End()の 〇〇 は移動の起点

※Rows.Count、Columns.CountはそれぞれExcel全体の最終行数、最終列数を表す

(2)起点とするセルから進行方向に以下のルールを元に直線に移動する

①値が入っているセルを起点とする場合、最初に来る空白セルの手前で止まる
②値が入っていないセルを起点とする場合、最初に来る値が入っているセルで止まる
③「.Row」か「.Column」で値を取った際は返り値のデータ型はLongのため、演算に使われうる(※下の例参照)

Sub sample()
    Dim i As Long, j As Long  '複数変数を書く場合、Dimを書くのは各行の最初だけ
    
    For i = 1 To Range("A1").End(xlDown).Row  
    'A1列を基点として行を下方向に見ていって最初に来る空白セルの前(ここでは10行目)の行数を取得(そのため10)
    
        If Cells(i, 2) <> "×" Then  'B列のi行目の値が「×」でないならば
            j = Cells(Rows.Count, 4).End(xlUp).Row + 1
            '最後の+1は見出し行の次に行くための+1
            Cells(i, 1).Copy Cells(j, 4)
        End If
    Next i
End Sub

このマクロを例えば

image.png

で試すとこうなる

image.png

Copyメソッドは

コピー元のセル.Copy コピー先のセル
A.Copy B  'AをBにコピーする

主な参考資料

①この1冊で合格! 永井雅明のExcel VBA ベーシック テキスト&問題集

Amazon

https://www.amazon.co.jp/%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E5%90%88%E6%A0%BC-%E6%B0%B8%E4%BA%95%E9%9B%85%E6%98%8E%E3%81%AEExcel-VBA-%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4046071524?tag=googhydr-22&source=dsa&hvcampaign=books&gad_source=1

②Range.End プロパティ (Excel)(Microsoftの公式ドキュメント)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.end

③Range.Row プロパティ (Excel)(Microsoftの公式ドキュメント)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.row

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?